Upstream sync
This commit is contained in:
@@ -10,7 +10,7 @@ RSpec.describe Api::DirectUploadsController, type: :controller do
|
||||
|
||||
describe '#create' do
|
||||
it 'returns data for a direct upload' do
|
||||
post :create, params: { blob: blob_params }
|
||||
post :create, params: { direct_upload: direct_upload_params }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response_body_data_attributes).to include('id', 'key', 'signed_id', 'url', 'headers')
|
||||
@@ -19,7 +19,7 @@ RSpec.describe Api::DirectUploadsController, type: :controller do
|
||||
|
||||
private
|
||||
|
||||
def blob_params
|
||||
def direct_upload_params
|
||||
file = file_fixture("video_file.mp4")
|
||||
checksum = Digest::MD5.base64digest(StringIO.new(file.read).to_s)
|
||||
|
||||
|
||||
@@ -67,5 +67,24 @@ FactoryBot.define do
|
||||
appearance_release.contract_template = build(:appearance_release_contract_template)
|
||||
end
|
||||
end
|
||||
|
||||
factory :appearance_release_import do
|
||||
person_photo nil
|
||||
|
||||
trait :with_headshot do
|
||||
person_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "person_photo.png")
|
||||
Rack::Test::UploadedFile.new(path, "image/png")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_contract do
|
||||
contract do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "AppearanceRelease.pdf")
|
||||
Rack::Test::UploadedFile.new(path, "application/pdf")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
@@ -138,48 +138,25 @@ feature 'User managing appearance releases' do
|
||||
end
|
||||
|
||||
scenario 'progress bar shows when user imports a release', js: true do
|
||||
skip "TODO"
|
||||
visit project_appearance_releases_path(project)
|
||||
|
||||
expect(page).not_to have_css('#upload-progress-container')
|
||||
large_pdf_file = build_large_pdf_file
|
||||
attach_file import_appearance_release_field, Rails.root.join(large_pdf_file.path), visible: false
|
||||
expect(page).to have_css('#upload-progress-container')
|
||||
expect(page).to have_content submit_create_button, wait: 30
|
||||
click_button submit_create_button
|
||||
expect(page).to have_content matching_started
|
||||
end
|
||||
|
||||
scenario 'MatchAppearanceReleasesJob is started when import is finished', js: true do
|
||||
visit project_appearance_releases_path(project)
|
||||
|
||||
attach_file import_appearance_release_field, Rails.root.join(file_fixture('person_photo.png')), visible: false
|
||||
expect(page).to have_content importing_label
|
||||
allow(MatchAppearanceReleasesJob).to receive(:perform_later).with(project, anything)
|
||||
click_button submit_create_button
|
||||
expect(page).to have_css('.progress')
|
||||
end
|
||||
|
||||
scenario 'importing a releases works when image is selected', js: true do
|
||||
expect(page).to have_content matching_started
|
||||
visit project_appearance_releases_path(project)
|
||||
|
||||
expect(page).to have_content submit_create_button
|
||||
expect(page).to have_content no_appearance_releases
|
||||
attach_file import_appearance_release_field, Rails.root.join(file_fixture('person_photo.png')), visible: false
|
||||
expect(page).to have_content importing_label
|
||||
click_button submit_create_button
|
||||
expect(page).not_to have_content no_appearance_releases
|
||||
expect(page).to have_content /Imported Headshot\s+\d{7}/
|
||||
end
|
||||
|
||||
scenario 'importing a releases works when pdf is selected', js: true do
|
||||
visit project_appearance_releases_path(project)
|
||||
|
||||
expect(page).to have_content submit_create_button
|
||||
expect(page).to have_content no_appearance_releases
|
||||
attach_file import_appearance_release_field, Rails.root.join(file_fixture('contract.pdf')), visible: false
|
||||
expect(page).to have_content importing_label
|
||||
click_button submit_create_button
|
||||
expect(page).not_to have_content no_appearance_releases
|
||||
expect(page).to have_content /Imported Contract\s+\d{7}/
|
||||
end
|
||||
|
||||
scenario 'importing a releases fails when file other than image or pdf is selected', js: true do
|
||||
visit project_appearance_releases_path(project)
|
||||
|
||||
expect(page).to have_content submit_create_button
|
||||
expect(page).to have_content no_appearance_releases
|
||||
attach_file import_appearance_release_field, Rails.root.join(file_fixture('audio.mp3')), visible: false
|
||||
expect(page).to have_content importing_label
|
||||
click_button submit_create_button
|
||||
expect(page).to have_content failed_to_import_notice
|
||||
expect(page).to have_content no_appearance_releases
|
||||
end
|
||||
|
||||
@@ -435,6 +412,10 @@ feature 'User managing appearance releases' do
|
||||
tempfile
|
||||
end
|
||||
|
||||
def matching_started
|
||||
t 'appearance_releases.create.matching_started'
|
||||
end
|
||||
|
||||
def filter_type_all
|
||||
t 'appearance_releases.type_filter_actions.all_releases'
|
||||
end
|
||||
|
||||
216
spec/jobs/match_appearance_releases_job_spec.rb
Normal file
216
spec/jobs/match_appearance_releases_job_spec.rb
Normal file
@@ -0,0 +1,216 @@
|
||||
require "rails_helper"
|
||||
|
||||
describe MatchAppearanceReleasesJob do
|
||||
let(:project) { create(:project) }
|
||||
let(:dummy_appearance_release) { create(:appearance_release_import, :with_headshot, :with_contract) }
|
||||
let(:dummy_matching_request) { instance_double(MatchingRequest, id: 999) }
|
||||
|
||||
before :all do
|
||||
ENV["AWS_BUCKET"] = ""
|
||||
end
|
||||
|
||||
describe ".perform_now" do
|
||||
it "returns if no attachment is sent" do
|
||||
expect(MatchingRequest).not_to receive(:create)
|
||||
attachments = []
|
||||
MatchAppearanceReleasesJob.perform_now project, attachments
|
||||
end
|
||||
|
||||
it "returns if no valid attachment is sent" do
|
||||
expect(MatchingRequest).not_to receive(:create)
|
||||
dummy_video = create(:video)
|
||||
attachments = [dummy_video.file.blob.signed_id]
|
||||
MatchAppearanceReleasesJob.perform_now project, attachments
|
||||
end
|
||||
|
||||
it "does not create new appearance release if BrayniacAI returns empty matches array" do
|
||||
signed_ids = [dummy_appearance_release.person_photo.blob.signed_id]
|
||||
keys = [dummy_appearance_release.person_photo.key]
|
||||
payload = {
|
||||
project: project,
|
||||
attachments: signed_ids
|
||||
}
|
||||
qr_matching_payload = {
|
||||
bucket: '',
|
||||
files: keys,
|
||||
request_id: dummy_matching_request.id
|
||||
}
|
||||
qr_matching_mock_response = double(
|
||||
request_id: dummy_matching_request.id,
|
||||
matches: []
|
||||
)
|
||||
|
||||
expect(MatchingRequest).to receive(:create).with(payload).and_return(dummy_matching_request)
|
||||
expect(BrayniacAI::QrMatching).to receive(:create!).with(qr_matching_payload).and_return(qr_matching_mock_response)
|
||||
expect(dummy_matching_request).to receive(:destroy)
|
||||
|
||||
MatchAppearanceReleasesJob.perform_now project, signed_ids
|
||||
|
||||
expect(AppearanceRelease.last).to eq dummy_appearance_release
|
||||
end
|
||||
|
||||
it "creates new incomplete appearance release if BrayniacAI returns single headshot match" do
|
||||
signed_ids = [dummy_appearance_release.person_photo.blob.signed_id]
|
||||
keys = [dummy_appearance_release.person_photo.key]
|
||||
payload = {
|
||||
project: project,
|
||||
attachments: signed_ids
|
||||
}
|
||||
qr_matching_payload = {
|
||||
bucket: '',
|
||||
files: keys,
|
||||
request_id: dummy_matching_request.id
|
||||
}
|
||||
mock_match = double(
|
||||
headshots: keys,
|
||||
contracts: [],
|
||||
unknowns: [],
|
||||
identifier: 'some/identifier/123'
|
||||
)
|
||||
matches = [mock_match]
|
||||
qr_matching_mock_response = double(
|
||||
request_id: dummy_matching_request.id,
|
||||
matches: matches
|
||||
)
|
||||
|
||||
expect(MatchingRequest).to receive(:create).with(payload).and_return(dummy_matching_request)
|
||||
expect(BrayniacAI::QrMatching).to receive(:create!).with(qr_matching_payload).and_return(qr_matching_mock_response)
|
||||
expect(dummy_matching_request).to receive(:destroy)
|
||||
|
||||
MatchAppearanceReleasesJob.perform_now project, signed_ids
|
||||
|
||||
expect(AppearanceRelease.last.identifier).to eq mock_match.identifier
|
||||
expect(AppearanceRelease.last.person_photo).to be_attached
|
||||
expect(AppearanceRelease.last.contract).not_to be_attached
|
||||
end
|
||||
|
||||
it "creates new incomplete appearance release if BrayniacAI returns single contract match" do
|
||||
signed_ids = [dummy_appearance_release.contract.blob.signed_id]
|
||||
keys = [dummy_appearance_release.contract.key]
|
||||
payload = {
|
||||
project: project,
|
||||
attachments: signed_ids
|
||||
}
|
||||
qr_matching_payload = {
|
||||
bucket: '',
|
||||
files: keys,
|
||||
request_id: dummy_matching_request.id
|
||||
}
|
||||
mock_match = double(
|
||||
headshots: [],
|
||||
contracts: keys,
|
||||
unknowns: [],
|
||||
identifier: 'some/identifier/123'
|
||||
)
|
||||
matches = [mock_match]
|
||||
qr_matching_mock_response = double(
|
||||
request_id: dummy_matching_request.id,
|
||||
matches: matches
|
||||
)
|
||||
|
||||
expect(MatchingRequest).to receive(:create).with(payload).and_return(dummy_matching_request)
|
||||
expect(BrayniacAI::QrMatching).to receive(:create!).with(qr_matching_payload).and_return(qr_matching_mock_response)
|
||||
expect(dummy_matching_request).to receive(:destroy)
|
||||
|
||||
MatchAppearanceReleasesJob.perform_now project, signed_ids
|
||||
|
||||
expect(AppearanceRelease.last.identifier).to eq mock_match.identifier
|
||||
expect(AppearanceRelease.last.person_photo.attached?).to eq false
|
||||
expect(AppearanceRelease.last.contract.attached?).to eq true
|
||||
end
|
||||
|
||||
it "creates new complete appearance release if BrayniacAI returns match for headshot and contract" do
|
||||
signed_ids = [
|
||||
dummy_appearance_release.person_photo.blob.signed_id,
|
||||
dummy_appearance_release.contract.blob.signed_id
|
||||
]
|
||||
keys = [
|
||||
dummy_appearance_release.person_photo.key,
|
||||
dummy_appearance_release.contract.key
|
||||
]
|
||||
payload = {
|
||||
project: project,
|
||||
attachments: signed_ids
|
||||
}
|
||||
qr_matching_payload = {
|
||||
bucket: '',
|
||||
files: keys,
|
||||
request_id: dummy_matching_request.id
|
||||
}
|
||||
mock_match = double(
|
||||
headshots: [keys[0]],
|
||||
contracts: [keys[1]],
|
||||
unknowns: [],
|
||||
identifier: 'some/identifier/123'
|
||||
)
|
||||
matches = [mock_match]
|
||||
qr_matching_mock_response = double(
|
||||
request_id: dummy_matching_request.id,
|
||||
matches: matches
|
||||
)
|
||||
|
||||
expect(MatchingRequest).to receive(:create).with(payload).and_return(dummy_matching_request)
|
||||
expect(BrayniacAI::QrMatching).to receive(:create!).with(qr_matching_payload).and_return(qr_matching_mock_response)
|
||||
expect(dummy_matching_request).to receive(:destroy)
|
||||
|
||||
MatchAppearanceReleasesJob.perform_now project, signed_ids
|
||||
|
||||
expect(AppearanceRelease.last.identifier).to eq mock_match.identifier
|
||||
expect(AppearanceRelease.last.person_photo.attached?).to eq true
|
||||
expect(AppearanceRelease.last.contract.attached?).to eq true
|
||||
end
|
||||
|
||||
it "creates two new incomplete appearance releases if BrayniacAI returns two matches for headshot and contract" do
|
||||
signed_ids = [
|
||||
dummy_appearance_release.person_photo.blob.signed_id,
|
||||
dummy_appearance_release.contract.blob.signed_id
|
||||
]
|
||||
keys = [
|
||||
dummy_appearance_release.person_photo.key,
|
||||
dummy_appearance_release.contract.key
|
||||
]
|
||||
payload = {
|
||||
project: project,
|
||||
attachments: signed_ids
|
||||
}
|
||||
qr_matching_payload = {
|
||||
bucket: '',
|
||||
files: keys,
|
||||
request_id: dummy_matching_request.id
|
||||
}
|
||||
mock_match1 = double(
|
||||
headshots: [keys[0]],
|
||||
contracts: [],
|
||||
unknowns: [],
|
||||
identifier: 'some/identifier/123'
|
||||
)
|
||||
mock_match2 = double(
|
||||
headshots: [],
|
||||
contracts: [keys[1]],
|
||||
unknowns: [],
|
||||
identifier: 'some/identifier/789'
|
||||
)
|
||||
matches = [mock_match1, mock_match2]
|
||||
qr_matching_mock_response = double(
|
||||
request_id: dummy_matching_request.id,
|
||||
matches: matches
|
||||
)
|
||||
|
||||
expect(MatchingRequest).to receive(:create).with(payload).and_return(dummy_matching_request)
|
||||
expect(BrayniacAI::QrMatching).to receive(:create!).with(qr_matching_payload).and_return(qr_matching_mock_response)
|
||||
expect(dummy_matching_request).to receive(:destroy)
|
||||
|
||||
MatchAppearanceReleasesJob.perform_now project, signed_ids
|
||||
|
||||
releases = AppearanceRelease.last(2)
|
||||
|
||||
expect(releases[0].identifier).to eq mock_match1.identifier
|
||||
expect(releases[0].person_photo.attached?).to eq true
|
||||
expect(releases[0].contract.attached?).to eq false
|
||||
|
||||
expect(releases[1].identifier).to eq mock_match2.identifier
|
||||
expect(releases[1].person_photo.attached?).to eq false
|
||||
expect(releases[1].contract.attached?).to eq true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -131,7 +131,8 @@ RSpec.describe Account do
|
||||
Broadcast,
|
||||
Account,
|
||||
ZoomMeeting,
|
||||
MedicalRelease
|
||||
MedicalRelease,
|
||||
MatchingRequest
|
||||
]
|
||||
Rails.application.eager_load!
|
||||
ActiveRecord::Base.descendants.each do |model|
|
||||
|
||||
@@ -42,7 +42,6 @@ describe BlankContract do
|
||||
material_release = create(:material_release_with_contract_template, project: project, person_name: 'Jane Doe')
|
||||
result = render_contract_html_for(material_release)
|
||||
|
||||
expect(result).to include 'serial-number'
|
||||
expect(result).to include 'DO NOT COPY'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -97,6 +97,18 @@ describe HeadshotCollection do
|
||||
expect(hash.keys).not_to include(:collection_uid)
|
||||
end
|
||||
end
|
||||
|
||||
context "when there are no releasables" do
|
||||
it "includes a blank hash value for the ids_to_images key" do
|
||||
releases = []
|
||||
collection = HeadshotCollection.new(nil, releases)
|
||||
|
||||
hash = collection.to_hash
|
||||
|
||||
expect(hash.keys).to include(:ids_to_images)
|
||||
expect(hash[:ids_to_images]).to eq(Hash.new)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
Reference in New Issue
Block a user