Files
old-holivud2/spec/models/appearance_release_spec.rb
2020-08-24 15:52:23 +02:00

178 lines
6.6 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe AppearanceRelease do
it_behaves_like 'an approvable'
it_behaves_like 'a contractable'
it_behaves_like 'an exploitable'
it_behaves_like 'a notable'
it_behaves_like 'a releasable'
it_behaves_like 'a taggable'
it { is_expected.to respond_to(:photos) }
it { is_expected.to respond_to(:photo) }
describe 'associations' do
it { is_expected.to have_many(:video_release_confirmations).dependent(:destroy) }
it { is_expected.to have_many(:confirmed_videos).source(:video).through(:video_release_confirmations) }
end
describe 'validations' do
it { is_expected.to allow_content_types('image/png', 'image/jpeg').for(:person_photo) }
it { is_expected.not_to allow_content_types('application/pdf', 'image/gif').for(:person_photo) }
it { is_expected.to allow_value('test@test.com', nil).for(:person_email) }
it { is_expected.not_to allow_values('foo', 'test@foo', 'N/A').for(:person_email) }
it { is_expected.to validate_presence_of(:person_first_name) }
it { is_expected.to validate_presence_of(:person_last_name) }
context 'for native releases' do
it { is_expected.to validate_attachment_of(:person_photo).on(:native) }
it { is_expected.to validate_attachment_of(:signature).on(:native) }
it 'validates person_photo_is_acceptable on new records' do
appearance_release = build(:appearance_release)
allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: false, error: 'api error'))
expect(appearance_release.valid?(:native)).to eq false
expect(appearance_release.errors[:person_photo]).to eq ['api error']
end
it 'does not validate person_photo_is_acceptable on existing records' do
appearance_release = create(:appearance_release, :native)
expect(appearance_release.valid?(:native)).to eq true
end
end
context 'for non-native releases' do
it 'fails to create release if nothing is attached' do
release = create(:appearance_release, :without_person_photo)
expect(release.valid?(:non_native)).to eq false
end
it 'creates release if only contract is attached' do
release = create(:appearance_release, :without_person_photo, :non_native)
expect(release.valid?(:non_native)).to eq true
end
it 'creates release if only person_photo is attached' do
release = create(:appearance_release, :with_person_photo_only)
expect(release.valid?(:non_native)).to eq true
end
end
context 'when the signer is a minor' do
subject { build(:appearance_release, minor: true) }
it { is_expected.to validate_presence_of(:guardian_first_name) }
it { is_expected.to validate_presence_of(:guardian_last_name) }
end
end
describe 'attachments' do
it { is_expected.to respond_to(:contract) }
it { is_expected.to respond_to(:person_photo) }
it { is_expected.to respond_to(:signature) }
end
describe 'scopes' do
describe '.complete' do
it 'returns records that have both a person photo and a contract' do
skip "Test is inconsistently failing in CI"
without_photo_or_contract = create(:appearance_release, person_photo: nil, contract: nil)
with_photo_without_contract = create(:appearance_release, contract: nil)
without_photo_with_contract = create(:appearance_release, :non_native, person_photo: nil)
with_photo_and_contract = create(:appearance_release, :non_native)
complete_releases = described_class.complete
all_releases = described_class.all
expect(complete_releases).not_to include(all_releases[0])
expect(complete_releases).not_to include(all_releases[1])
expect(complete_releases).not_to include(all_releases[2])
expect(complete_releases).to include(all_releases[3])
end
end
describe '.incomplete' do
it 'returns records that are missing either a person photo or a contract' do
skip "Test is inconsistently failing in CI"
without_photo_or_contract = create(:appearance_release, person_photo: nil, contract: nil)
with_photo_without_contract = create(:appearance_release, contract: nil)
without_photo_with_contract = create(:appearance_release, :non_native, person_photo: nil)
with_photo_and_contract = create(:appearance_release, :non_native)
incomplete_releases = described_class.incomplete
all_releases = described_class.all
expect(incomplete_releases).to include(all_releases[0])
expect(incomplete_releases).to include(all_releases[1])
expect(incomplete_releases).to include(all_releases[2])
expect(incomplete_releases).not_to include(all_releases[3])
end
end
describe '.with_person_photo' do
it 'returns records that have a person photo attachment' do
with_photo = create(:appearance_release, :with_person_photo)
without_photo = create(:appearance_release, :without_person_photo)
results = described_class.with_person_photo
expect(results.size).to eq 1
expect(results).to include(with_photo)
expect(results).not_to include(without_photo)
end
end
end
describe '#native?' do
it 'returns true when the release has a signature' do
release = build(:appearance_release, :native)
expect(release).to be_native
end
end
describe '#uses_edl?' do
it { is_expected.to be_uses_edl }
end
describe '#photos' do
it 'returns photo if it is attached' do
ar = create(:appearance_release)
expect(ar.photos).to eq [ar.photo]
end
it 'returns empty list if photo is not attached' do
ar = AppearanceRelease.new
expect(ar.photos).to eq []
end
end
describe '#contract_file_name' do
it 'includes signed timestamp, release number, and person name' do
release = create(:appearance_release_with_contract_template, signed_at: Date.new(2020, 2, 10), person_first_name: 'John', person_last_name: 'Doe')
expect(release.contract_file_name).to eq('my-video-project_appearance_2020.02.10_1_doe-john')
end
context 'when signed at is nil' do
it 'uses the created at date' do
release = create(:appearance_release_with_contract_template,
signed_at: nil,
created_at: DateTime.new(2020, 2, 10, 12, 0, 0),
person_first_name: 'John', person_last_name: 'Doe')
expect(release.contract_file_name).to eq('my-video-project_appearance_2020.02.10_1_doe-john')
end
end
end
end