178 lines
6.6 KiB
Ruby
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
|