294 lines
11 KiB
Ruby
294 lines
11 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe AppearanceReleasesController, tye: :controller do
|
|
render_views
|
|
|
|
let(:user) { create(:user) }
|
|
let(:account) { user.primary_account }
|
|
let(:project) { create(:project, account: user.primary_account) }
|
|
|
|
before do
|
|
sign_in(user)
|
|
end
|
|
|
|
describe "#index" do
|
|
it "responds successfully" do
|
|
get :index, params: { project_id: project }
|
|
|
|
expect(response).to be_successful
|
|
end
|
|
|
|
it "renders content" do
|
|
release = create(:appearance_release, project: project,
|
|
person_first_name: "John", person_last_name: "Doe", person_phone: "5551234567", person_email: "jane.doe@test.com")
|
|
create(:note, notable: release, content: "Some notes here")
|
|
|
|
get :index, params: { project_id: project }
|
|
|
|
expect(response.body).to have_content "John Doe"
|
|
expect(response.body).to have_content "P: 5551234567E: jane.doe@test.com"
|
|
expect(response.body).to have_content "Some notes here"
|
|
expect(response.body).to have_button "Import Release"
|
|
expect(response.body).to have_content "Manage"
|
|
end
|
|
|
|
context "when there are no appearance releases" do
|
|
it "renders an empty message" do
|
|
get :index, params: { project_id: project }
|
|
|
|
expect(response.body).to have_content("Appearance Releases will appear here")
|
|
end
|
|
end
|
|
|
|
context "when there are many records" do
|
|
it "paginates the table" do
|
|
create_list(:appearance_release, 20, project: project)
|
|
|
|
get :index, params: { project_id: project }
|
|
|
|
expect(response.body).to have_link("2", href: project_appearance_releases_path(project, page: 2))
|
|
end
|
|
end
|
|
|
|
context "for xhr request" do
|
|
it "filters the releases by a query param" do
|
|
appearance_releases = [
|
|
create(:appearance_release, person_first_name: "Adam", person_last_name: "Sandler", project: project),
|
|
create(:appearance_release, person_first_name: "Zoe", person_last_name: "Saldana", project: project),
|
|
]
|
|
|
|
get :index, params: { project_id: project, query: "Zoe" }, xhr: true
|
|
|
|
expect(response.body).not_to have_content("Adam")
|
|
expect(response.body).to have_content("Zoe")
|
|
end
|
|
|
|
it "filters the releases by a type_filter param" do
|
|
appearance_releases = [
|
|
create(:appearance_release, :without_person_photo, :non_native, person_first_name: "Adam", person_last_name: "Sandler", project: project),
|
|
create(:appearance_release, :non_native, person_first_name: "Zoe", person_last_name: "Saldana", project: project),
|
|
]
|
|
|
|
get :index, params: { project_id: project, type_filter: 'all' }, xhr: true
|
|
|
|
expect(response.body).to have_content("Adam")
|
|
expect(response.body).to have_content("Zoe")
|
|
|
|
|
|
get :index, params: { project_id: project, type_filter: 'complete' }, xhr: true
|
|
|
|
expect(response.body).not_to have_content("Adam")
|
|
expect(response.body).to have_content("Zoe")
|
|
|
|
get :index, params: { project_id: project, type_filter: 'incomplete' }, xhr: true
|
|
|
|
expect(response.body).to have_content("Adam")
|
|
expect(response.body).not_to have_content("Zoe")
|
|
end
|
|
|
|
it "filters the releases by a type_filter and query params simultaneously" do
|
|
appearance_releases = [
|
|
create(:appearance_release, :without_person_photo, :non_native, person_first_name: "Adam", person_last_name: "Sandler Incomplete", project: project),
|
|
create(:appearance_release, :non_native, person_first_name: "Adam", person_last_name: "Sandler Complete", project: project),
|
|
create(:appearance_release, :without_person_photo, :non_native, person_first_name: "Zoe", person_last_name: "Saldana Incomplete", project: project),
|
|
create(:appearance_release, :non_native, person_first_name: "Zoe", person_last_name: "Saldana Complete", project: project),
|
|
]
|
|
|
|
get :index, params: { project_id: project, type_filter: 'complete', query: 'Adam' }, xhr: true
|
|
|
|
expect(response.body).to have_content("Adam Sandler Complete")
|
|
expect(response.body).not_to have_content("Adam Sandler Incomplete")
|
|
expect(response.body).not_to have_content("Zoe Saldana Incomplete")
|
|
expect(response.body).not_to have_content("Zoe Saldana Complete")
|
|
|
|
get :index, params: { project_id: project, type_filter: 'incomplete', query: 'Zoe' }, xhr: true
|
|
|
|
expect(response.body).not_to have_content("Adam Sandler Complete")
|
|
expect(response.body).not_to have_content("Adam Sandler Incomplete")
|
|
expect(response.body).to have_content("Zoe Saldana Incomplete")
|
|
expect(response.body).not_to have_content("Zoe Saldana Complete")
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#new" do
|
|
it "responds successfully" do
|
|
get :new, params: { project_id: project }
|
|
|
|
expect(response).to be_successful
|
|
end
|
|
end
|
|
|
|
describe "#create" do
|
|
it "responds successfully when guardian_photo is not sent" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: appearance_release_params }
|
|
}.to change(AppearanceRelease, :count).by(1)
|
|
|
|
expect(response).to be_redirect
|
|
expect(response).to redirect_to [project, :appearance_releases]
|
|
expect(flash.notice).to be_present
|
|
end
|
|
|
|
it "responds successfully when guardian_photo is sent" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: minor_appearance_release_params }
|
|
}.to change(AppearanceRelease, :count).by(1)
|
|
|
|
expect(response).to be_redirect
|
|
expect(response).to redirect_to [project, :appearance_releases]
|
|
expect(flash.notice).to be_present
|
|
end
|
|
|
|
it "enqueues headshot collection job" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: appearance_release_params }
|
|
}.to have_enqueued_job(AddHeadshotCollectionUidToProjectJob).with(project)
|
|
end
|
|
|
|
it "enqueues tagging job" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: appearance_release_params }
|
|
}.to have_enqueued_job(SetTagsForReleasableJob).with(AppearanceRelease.last)
|
|
end
|
|
|
|
it "logs analytics" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: appearance_release_params }
|
|
}.to(
|
|
have_enqueued_job(TrackAnalyticsJob).with(user, account, :track_create_non_native_release, release_type: "AppearanceRelease", user_agent: "Rails Testing", user_ip: "0.0.0.0")
|
|
)
|
|
end
|
|
|
|
context "when the record would be invalid" do
|
|
before do
|
|
allow_any_instance_of(AppearanceRelease).to receive(:save).and_return(false)
|
|
end
|
|
|
|
it "re-renders the form" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: appearance_release_params }
|
|
}.not_to change(AppearanceRelease, :count)
|
|
|
|
expect(response).to be_successful
|
|
expect(flash.notice).to be_nil
|
|
end
|
|
|
|
it "does not enqueue any jobs" do
|
|
expect {
|
|
post :create, params: { project_id: project, appearance_release: appearance_release_params }
|
|
}.not_to have_enqueued_job
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#edit" do
|
|
let(:non_native_appearance_release) { create(:appearance_release, project: project) }
|
|
let(:native_appearance_release) { create(:appearance_release, :native, project: project) }
|
|
|
|
it "responds successfully for non-native release" do
|
|
get :edit, params: { project_id: project, id: non_native_appearance_release }
|
|
|
|
expect(response).to be_successful
|
|
end
|
|
|
|
it "responds with error for native release" do
|
|
expect { get :edit, params: { id: native_appearance_release } }.to raise_exception Pundit::NotAuthorizedError
|
|
end
|
|
end
|
|
|
|
describe "#update" do
|
|
let(:appearance_release) { create(:appearance_release, project: project) }
|
|
|
|
it "responds successfully" do
|
|
patch :update, params: { project_id: project, id: appearance_release, appearance_release: appearance_release_params }
|
|
|
|
expect(response).to redirect_to [project, :appearance_releases]
|
|
expect(flash.notice).to be_present
|
|
end
|
|
|
|
it "enqueues headshot collection job" do
|
|
expect {
|
|
patch :update, params: { project_id: project, id: appearance_release, appearance_release: appearance_release_params }
|
|
}.to have_enqueued_job(AddHeadshotCollectionUidToProjectJob).with(project)
|
|
end
|
|
|
|
context "when the record would be invalid" do
|
|
before do
|
|
allow_any_instance_of(AppearanceRelease).to receive(:save).and_return(false)
|
|
end
|
|
|
|
it "re-renders the form" do
|
|
patch :update, params: { project_id: project, id: appearance_release, appearance_release: appearance_release_params }
|
|
|
|
expect(response).to be_successful
|
|
expect(flash.notice).to be_nil
|
|
end
|
|
|
|
it "does not enqueue any jobs" do
|
|
expect {
|
|
patch :update, params: { project_id: project, id: appearance_release, appearance_release: appearance_release_params }
|
|
}.not_to have_enqueued_job(AddHeadshotCollectionUidToProjectJob)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#destroy" do
|
|
let!(:appearance_release) { create(:appearance_release, project: project) }
|
|
|
|
it "responds with redirect" do
|
|
delete :destroy, params: { project_id: project, id: appearance_release }
|
|
|
|
expect(response).to be_redirect
|
|
expect(response).to redirect_to [project, :appearance_releases]
|
|
end
|
|
|
|
it "sets the flash" do
|
|
delete :destroy, params: { project_id: project, id: appearance_release }
|
|
|
|
expect(flash.alert).not_to be_nil
|
|
end
|
|
|
|
it "destroys the record" do
|
|
expect {
|
|
delete :destroy, params: { project_id: project, id: appearance_release }
|
|
}.to change(AppearanceRelease, :count).by(-1)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def appearance_release_params
|
|
attributes_for(:appearance_release, :non_native).except(:contract).merge(contract_param, exploitable_rights_params)
|
|
end
|
|
|
|
def minor_appearance_release_params
|
|
attributes_for(:appearance_release, :non_native, :minor_with_guardian_photo)
|
|
.except(:contract)
|
|
.except(:guardian_address_street2).except(:guardian_address_city)
|
|
.except(:guardian_address_state).except(:guardian_address_zip)
|
|
.except(:guardian_address_country)
|
|
.merge(contract_param, exploitable_rights_params)
|
|
end
|
|
|
|
def exploitable_rights_params
|
|
{
|
|
applicable_medium_id: ApplicableMedium.last.id,
|
|
applicable_medium_text: "applicable_media",
|
|
territory_id: Territory.last.id,
|
|
territory_text: "territory",
|
|
term_id: Term.last.id,
|
|
term_text: "term",
|
|
restriction_id: Restriction.last.id,
|
|
restriction_text: "restrictions",
|
|
}
|
|
end
|
|
|
|
def contract_param
|
|
path = Rails.root.join("spec", "fixtures", "files", "contract.pdf")
|
|
contract_file = Rack::Test::UploadedFile.new(path, "application/pdf")
|
|
|
|
{ contract: contract_file }
|
|
end
|
|
end
|