Files
old-holivud2/spec/controllers/contract_templates_controller_spec.rb
2020-08-20 06:50:51 +02:00

266 lines
8.7 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe ContractTemplatesController do
render_views
let(:current_user) { create(:user, :manager) }
let(:project) { create(:project, members: current_user, account: current_user.primary_account) }
before do
sign_in(current_user)
end
describe '#index' do
it 'responds successfully' do
get :index, params: { project_id: project }
expect(response).to be_successful
end
it 'renders content if there are contract templates' do
contract_template = create(:contract_template,
name: 'My Contract Template', fee: 50, release_type: 'appearance',
project: project)
sign_path = new_account_project_contract_template_appearance_release_path(project.account, project, contract_template)
sign_url = new_account_project_contract_template_appearance_release_url(project.account, project, contract_template)
get :index, params: { project_id: project }
expect(response.body).to have_content('My Contract Template')
expect(response.body).to have_link('Create New Release Template', href: new_project_contract_template_path(project))
expect(response.body).to have_link('Import Release Template', href: new_project_release_template_imports_path(project))
expect(response.body).to have_link('Copy Release URL', href: sign_url)
expect(response.body).to have_content('Manage')
expect(response.body).to have_link('Sign', href: sign_path)
expect(response.body).to have_link('Print')
end
context 'when there are no contract templates' do
it 'renders splash screen' do
get :index, params: { project_id: project }
expect(response.body).to have_link "Create New Release Template"
expect(response.body).to have_link "Import Template"
expect(response.body).to have_link schedule_demo
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'does not show the new contract template button' do
get :index, params: { project_id: project }
expect(response.body).not_to have_link "Create New Release Template"
expect(response.body).not_to have_link "Import Template"
expect(response.body).to have_link schedule_demo
end
end
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'does not show the new contract template button' do
create(:contract_template, project: project)
get :index, params: { project_id: project }
expect(response.body).not_to have_link('Create New Release Template')
expect(response.body).not_to have_link('Import Release Template')
expect(response.body).not_to have_link('Delete')
end
end
context 'when there are many records' do
it 'paginates the table' do
create_list(:contract_template, 20, project: project)
get :index, params: { project_id: project }
expect(response.body).to have_link('2', href: project_contract_templates_path(project, page: 2))
end
end
end
describe '#new' do
it 'responds ok' do
get :new, params: { project_id: project }
expect(response).to be_successful
end
end
describe '#create' do
it 'redirects' do
post :create, params: { project_id: project, contract_template: contract_template_params(valid: true) }
expect(response).to redirect_to(project_contract_templates_path(project))
end
it 'sends pdf file for a preview' do
post :create, params: { project_id: project, contract_template: contract_template_params(valid: true), commit: 'preview' }
expect(response.header['Content-Type']).to include('application/pdf')
expect(response.header['Content-Disposition']).to include('inline')
end
it 'creates a new record' do
expect do
post :create, params: { project_id: project, contract_template: contract_template_params }
end.to change(ContractTemplate, :count).by(1)
end
it "logs analytics" do
expect {
post :create, params: { project_id: project, contract_template: contract_template_params }
}.to(
have_enqueued_job(TrackAnalyticsJob).with(current_user, current_user.primary_account, :track_create_contract_template, user_agent: "Rails Testing", user_ip: "0.0.0.0")
)
end
context 'when save fails' do
it 'responds ok' do
post :create, params: { project_id: project, contract_template: contract_template_params(valid: false) }
expect(response).to be_successful
end
end
context 'when exhibit fields are present' do
it 'saves them' do
post :create, params: { project_id: project, contract_template: contract_template_params_with_exhibit_fields }
expect(ContractTemplate.last.has_exhibit_a?).to be_truthy
expect(ContractTemplate.last.has_exhibit_b?).to be_truthy
end
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'raises exception' do
expect do
post :create, params: { project_id: project, contract_template: contract_template_params }
end.to raise_error(Pundit::NotAuthorizedError)
end
end
end
describe '#edit' do
let(:contract_template) do
create(:contract_template,
name: 'My Contract Template', fee: 50, release_type: 'appearance',
project: project)
end
it 'responds ok' do
get :edit, params: { project_id: project, id: contract_template }
expect(response).to be_successful
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'raises exception' do
expect do
get :edit, params: { project_id: project, id: contract_template }
end.to raise_error(Pundit::NotAuthorizedError)
end
end
end
describe '#update' do
let(:contract_template) do
create(:contract_template,
name: 'My Contract Template', fee: 50, release_type: 'appearance',
project: project)
end
it 'redirects' do
patch :update, params: { project_id: project, id: contract_template, contract_template: contract_template_params }
expect(response).to redirect_to(project_contract_templates_path(project))
end
context 'when current user is an associate' do
let(:current_user) { create(:user, :associate) }
it 'raises exception' do
expect do
patch :update, params: { project_id: project, id: contract_template, contract_template: contract_template_params }
end.to raise_error(Pundit::NotAuthorizedError)
end
end
end
describe '#destroy' do
let!(:contract_template) { create(:contract_template, project: project) }
it 'redirects' do
delete :destroy, params: { id: contract_template }
expect(response).to be_redirect
expect(response).to redirect_to [project, :contract_templates]
end
it 'archives the record but does not delete' do
expect do
delete :destroy, params: { id: contract_template }
end.to change(ContractTemplate, :count).by(0)
expect(ContractTemplate.find(contract_template.id).archived_at).not_to be_nil
end
context 'when contract template has associated releases' do
let(:contract_template) { create(:contract_template, appearance_releases: build_list(:appearance_release, 1), project: project) }
it 'does not raise error' do
expect do
delete :destroy, params: { id: contract_template }
end.not_to raise_error
end
end
end
private
def contract_template_params(valid: true)
if valid
attributes_for(:contract_template).merge(exploitable_rights_params).merge({exhibit_a_legal_text: "Legal Text Exhibit A"})
else
attributes_for(:contract_template).except(:name)
end
end
def contract_template_params_with_exhibit_fields
contract_template_params(valid: true).merge({
exhibit_a_legal_text: "Exhibit A legal text",
exhibit_b_legal_text: "Exhibit B legal text",
exhibit_a_question_text: "Exhibit A Question",
exhibit_b_question_text: "Exhibit B Question",
})
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 schedule_demo
t 'contract_templates.splash.actions.book_demo'
end
end