Files
old-holivud2/spec/controllers/api/sync_controller_spec.rb

178 lines
7.1 KiB
Ruby
Raw Normal View History

2020-05-31 22:38:19 +02:00
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe Api::SyncController, type: :controller do
let(:current_user) { create(:user, :admin) }
before do
sign_in_to_api(current_user)
end
describe '#index' do
it 'dumps all the data when parameter since not suplied' do
create_default_data
get :index
expect(response).to be_successful
end
it 'does not leak data from other accounts' do
another_user = create(:user)
my_project = create(:project, account: current_user.primary_account)
their_project = create(:project, account: another_user.primary_account)
my_contract_template = create(:contract_template, project: my_project)
their_contract_template = create(:contract_template, project: their_project)
my_appearance_release = create(:appearance_release, project: my_project)
their_appearance_release = create(:appearance_release, project: their_project)
my_talent_release = create(:talent_release, project: my_project)
their_talent_release = create(:talent_release, project: their_project)
my_location_release = create(:location_release, project: my_project)
their_location_release = create(:location_release, project: their_project)
my_material_release = create(:material_release, project: my_project)
their_material_release = create(:material_release, project: their_project)
my_note = create(:note, notable: my_appearance_release, user: current_user)
their_note = create(:note, notable: their_appearance_release, user: another_user)
get :index
account_ids = ids_for_type('accounts')
project_ids = ids_for_type('projects')
contract_template_ids = ids_for_type('contract_templates')
appearance_release_ids = ids_for_type('appearance_releases')
talent_release_ids = ids_for_type('talent_releases')
location_release_ids = ids_for_type('location_releases')
material_release_ids = ids_for_type('material_releases')
note_ids = ids_for_type('notes')
expect(account_ids).to include(current_user.primary_account.id.to_s)
expect(account_ids).not_to include(another_user.primary_account.id.to_s)
expect(project_ids).to include(my_project.id.to_s)
expect(project_ids).not_to include(their_project.id.to_s)
expect(contract_template_ids).to include(my_contract_template.id.to_s)
expect(contract_template_ids).not_to include(their_contract_template.id.to_s)
expect(appearance_release_ids).to include(my_appearance_release.id.to_s)
expect(appearance_release_ids).not_to include(their_appearance_release.id.to_s)
expect(location_release_ids).to include(my_location_release.id.to_s)
expect(location_release_ids).not_to include(their_location_release.id.to_s)
expect(talent_release_ids).to include(my_talent_release.id.to_s)
expect(talent_release_ids).not_to include(their_talent_release.id.to_s)
expect(material_release_ids).to include(my_material_release.id.to_s)
expect(material_release_ids).not_to include(their_material_release.id.to_s)
expect(note_ids).to include(my_note.id.to_s)
expect(note_ids).not_to include(their_note.id.to_s)
end
it 'returns only the notes that belong to the accessible projects (the note bug)' do
create_default_data
my_appearance_release = AppearanceRelease.last
my_note = create(:note, notable: my_appearance_release, user: current_user)
another_user = create(:user)
their_project = create(:project, account: another_user.primary_account)
their_appearance_release = create(:appearance_release, project: their_project)
their_note = create(:note, notable: their_appearance_release, user: another_user)
another_user.account_auths.create(account: current_user.primary_account, role: :account_manager)
get :index
note_ids = ids_for_type('notes')
expect(note_ids).to eq [my_note.id.to_s]
end
it 'shows guardian_photo property for appearance and talent releases and not for other release types' do
create_default_data
get :index
appearance_releases = attributes_for_type('appearance_releases')
talent_releases = attributes_for_type('talent_releases')
location_releases = attributes_for_type('location_releases')
material_releases = attributes_for_type('material_releases')
expect(appearance_releases.first).to include('guardian_photo')
expect(talent_releases.first).to include('guardian_photo')
expect(location_releases.first).not_to include('guardian_photo')
2020-07-27 15:25:38 +02:00
expect(material_releases.first).to include('guardian_photo')
2020-05-31 22:38:19 +02:00
end
it 'guardian photo has same format as other photos' do
create_default_data_with_guardian_info
get :index
appearance_releases = attributes_for_type('appearance_releases')
guardian_photo = appearance_releases.first['guardian_photo']
photo_attributes = guardian_photo['attributes']
expect(appearance_releases.first).to include('guardian_photo')
expect(guardian_photo).to include('id', 'type', 'attributes')
expect(photo_attributes).to include('filename', 'content_type', 'url', 'thumbnail_url')
end
2020-07-09 11:06:17 +02:00
it 'contains misc releases' do
create_default_data
get :index
misc_releases = attributes_for_type('misc_releases')
expect(misc_releases.first).to include('id')
end
it 'contains misc releases' do
create_default_data
get :index
medical_releases = attributes_for_type('medical_releases')
expect(medical_releases.first).to include('id')
end
2020-07-14 14:10:30 +02:00
it 'contains signature legal text for contract templates' do
create_default_data_with_signature_legal_text
get :index
contract_templates = attributes_for_type('contract_templates')
expect(contract_templates.first).to include('signature_legal_text')
expect(contract_templates.first['signature_legal_text']).to eq ContractTemplate.first.signature_legal_text.as_json
end
2020-05-31 22:38:19 +02:00
end
private
def create_default_data
project = create(:project, name: 'first', account: current_user.primary_account)
create(:appearance_release, project: project)
create(:talent_release, project: project)
create(:location_release, project: project)
create(:material_release, project: project)
2020-07-09 11:06:17 +02:00
create(:medical_release, project: project)
create(:misc_release, project: project)
2020-05-31 22:38:19 +02:00
end
def create_default_data_with_guardian_info
project = create(:project, name: 'first', account: current_user.primary_account)
create(:appearance_release, :minor_with_guardian_photo, project: project)
end
2020-07-14 14:10:30 +02:00
def create_default_data_with_signature_legal_text
create_default_data
ct = create(:contract_template, name: "with signature legal text", project: Project.first)
ct.signature_legal_text = "legal text example"
ct.save
end
2020-05-31 22:38:19 +02:00
def response_body_json
JSON.parse(response.body)
end
def ids_for_type(name)
response_body_json.dig('data', name).flat_map { |json| json.dig('attributes', 'id') }
end
def attributes_for_type(name)
response_body_json.dig('data', name).flat_map { |json| json['attributes'] }
end
end