266 lines
8.7 KiB
Ruby
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
|