Files
growstuff/spec/controllers/photos_controller_spec.rb
Daniel O'Connor d1f754a288 Rubocop
2022-11-08 00:23:38 +10:30

226 lines
8.3 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe PhotosController, :search do
login_member
describe 'GET index' do
describe 'all photos' do
let!(:photo) { FactoryBot.create(:photo, :reindex) }
before do
Photo.reindex
get :index
end
it "finds photos" do
expect(assigns(:photos).count).to eq 1
expect(assigns(:photos).first.id).to eq photo.id
end
end
describe '#index crop photos' do
let!(:photo) { FactoryBot.create(:photo, :reindex, owner: member, title: 'no assocations photo') }
let!(:crop_photo) { FactoryBot.create(:photo, :reindex, owner: member, title: 'photos of planting') }
let!(:planting) { FactoryBot.create(:planting, :reindex, crop:, owner: member) }
let!(:crop) { FactoryBot.create(:crop, :reindex) }
before do
planting.photos << crop_photo
Photo.reindex
get :index, params: { crop_slug: crop.to_param }
end
describe "find photos by crop" do
it "has indexed the photos of this crop" do
expect(Photo.search).to include crop_photo
end
it "assigns crop" do
expect(assigns(:crop)).to eq crop
end
it { expect(assigns(:photos).size).to eq 1 }
it { expect(assigns(:photos).first.crops).to include crop.id }
it { expect(assigns(:photos).first.id).to eq crop_photo.id }
end
end
end
describe "GET new" do
let(:tomato) { FactoryBot.create(:tomato) }
let(:planting) { FactoryBot.create(:planting, crop: tomato, owner: member) }
let(:garden) { FactoryBot.create(:garden, owner: member) }
let(:harvest) { FactoryBot.create(:harvest, owner: member) }
let(:member) { FactoryBot.create(:member) }
let!(:auth) { FactoryBot.create(:flickr_authentication, member:) }
before do
sign_in member
member.stub(:flickr_photos) { [[], 0] }
member.stub(:flickr_sets) { { "foo" => "bar" } }
controller.stub(:current_member) { member }
end
describe "planting photos" do
before { get :new, params: { type: "planting", id: planting.id } }
it { expect(assigns(:flickr_auth)).to be_an_instance_of(Authentication) }
it { expect(assigns(:item)).to eq planting }
it { expect(flash[:alert]).not_to be_present }
it { expect(flash[:alert]).not_to be_present }
end
describe "harvest photos" do
before { get :new, params: { type: "harvest", id: harvest.id } }
it { expect(assigns(:item)).to eq harvest }
it { expect(flash[:alert]).not_to be_present }
end
describe "garden photos" do
before { get :new, params: { type: "garden", id: garden.id } }
it { expect(assigns(:item)).to eq garden }
it { expect(flash[:alert]).not_to be_present }
end
end
describe "POST create" do
before do
Photo.any_instance.stub(:flickr_metadata).and_return(title: "A Heartbreaking work of staggering genius",
license_name: "CC-BY",
license_url: "http://example.com/aybpl",
thumbnail_url: "http://example.com/thumb.jpg",
fullsize_url: "http://example.com/full.jpg",
link_url: "http://example.com")
end
let(:member) { FactoryBot.create(:member) }
let(:garden) { FactoryBot.create(:garden, owner: member) }
let(:planting) { FactoryBot.create(:planting, garden:, owner: member) }
let(:harvest) { FactoryBot.create(:harvest, owner: member) }
let(:photo) { FactoryBot.create(:photo, owner: member) }
describe "with valid params" do
before { controller.stub(:current_member) { member } }
describe "attaches the photo to a planting" do
before do
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' },
type: "planting", id: planting.id
}
end
it { expect(flash[:alert]).not_to be_present }
it { expect(Photo.last.plantings.first).to eq planting }
end
describe "doesn't attach a photo to a planting twice" do
before do
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "planting", id: planting.id
}
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "planting", id: planting.id
}
end
it { expect(flash[:alert]).not_to be_present }
it { expect(Photo.last.plantings.size).to eq 1 }
end
it "attaches the photo to a harvest" do
post :create, params: { photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: harvest.id }
expect(flash[:alert]).not_to be_present
Photo.last.harvests.first.should eq harvest
end
describe "doesn't attach a photo to a harvest twice" do
before do
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: harvest.id
}
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: harvest.id
}
end
it { expect(flash[:alert]).not_to be_present }
it { expect(Photo.last.harvests.size).to eq 1 }
end
it "doesn't attach photo to a comment" do
comment = FactoryBot.create(:comment)
expect do
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "comment", id: comment.id
}
end.to raise_error 'Photos not supported'
end
end
describe "for the second time" do
let(:planting) { FactoryBot.create(:planting, owner: member) }
let(:valid_params) { { photo: { source_id: 1 }, id: planting.id, type: 'planting' } }
it "does not add a photo twice" do
expect { post :create, params: valid_params }.to change(Photo, :count).by(1)
expect { post :create, params: valid_params }.not_to change(Photo, :count)
end
end
describe "with matching owners" do
before { controller.stub(:current_member) { member } }
describe "creates the planting/photo link" do
let(:planting) { FactoryBot.create(:planting, garden:, owner: member) }
let(:photo) { FactoryBot.create(:photo, owner: member) }
before { post :create, params: { photo: { source_id: photo.source_id, source: 'flickr' }, type: "planting", id: planting.id } }
it { expect(flash[:alert]).not_to be_present }
it { expect(Photo.last.plantings.first).to eq planting }
end
describe "creates the harvest/photo link" do
before do
post :create, params: { photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: harvest.id }
end
it { expect(flash[:alert]).not_to be_present }
it { expect(Photo.last.harvests.first).to eq harvest }
end
end
describe "with mismatched owners" do
let(:photo) { FactoryBot.create(:photo) }
it "does not create the planting/photo link" do
# members will be auto-created, and different
another_planting = FactoryBot.create(:planting)
expect do
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' },
type: "planting", id: another_planting.id
}
end.to raise_error(ActiveRecord::RecordInvalid)
expect(Photo.last.plantings.first).not_to eq another_planting
end
it "does not create the harvest/photo link" do
# members will be auto-created, and different
another_harvest = FactoryBot.create(:harvest)
expect do
post :create, params: {
photo: { source_id: photo.source_id, source: 'flickr' }, type: "harvest", id: another_harvest.id
}
end.to raise_error(ActiveRecord::RecordInvalid)
expect(Photo.last.harvests.first).not_to eq another_harvest
end
end
end
end