From b924b9976299ba23a6571bf9971a0567f8d17163 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Fri, 19 Jun 2020 09:23:07 +0200 Subject: [PATCH] Upstream sync --- .../appearance_releases_controller.rb | 4 +- app/controllers/contracts_controller.rb | 4 +- .../public/appearance_releases_controller.rb | 40 ++++- app/models/appearance_release.rb | 36 ++++- app/models/contract.rb | 4 + app/models/sample_appearance_release.rb | 7 +- app/policies/contract_policy.rb | 6 +- app/policies/medical_release_policy.rb | 6 +- app/views/appearance_releases/_form.html.erb | 4 +- .../_medical_release.html.erb | 2 +- .../public/appearance_releases/new.html.erb | 6 +- app/views/shared/_address_fields.html.erb | 9 +- config/locales/en.yml | 13 +- config/locales/es.yml | 13 +- ...n_address_column_in_appearance_releases.rb | 10 ++ ...n_address_column_in_appearance_releases.rb | 10 ++ db/structure.sql | 20 ++- .../appearance_releases_controller_spec.rb | 3 + spec/controllers/contracts_controller_spec.rb | 51 ++++++ .../appearance_releases_controller_spec.rb | 16 +- spec/factories/appearance_releases.rb | 21 ++- .../user_managing_appearance_releases_spec.rb | 52 ++++++- .../user_managing_medical_releases_spec.rb | 145 ++++++++++++++++++ spec/models/contract_template_preview_spec.rb | 12 +- .../appearance_release_log_sheet_spec.rb | 2 +- 25 files changed, 452 insertions(+), 44 deletions(-) create mode 100644 db/migrate/20200615133602_destructure_person_address_column_in_appearance_releases.rb create mode 100644 db/migrate/20200616124214_destructure_guardian_address_column_in_appearance_releases.rb create mode 100644 spec/features/user_managing_medical_releases_spec.rb diff --git a/app/controllers/appearance_releases_controller.rb b/app/controllers/appearance_releases_controller.rb index a05e958..a1e53d6 100644 --- a/app/controllers/appearance_releases_controller.rb +++ b/app/controllers/appearance_releases_controller.rb @@ -78,8 +78,8 @@ class AppearanceReleasesController < ApplicationController end def appearance_release_params - params.require(:appearance_release).permit(:contract, :guardian_address, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_photo, :guardian_email, :minor, - :person_address, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo, + params.require(:appearance_release).permit(:contract, :guardian_address_street1, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_photo, :guardian_email, :minor, + :person_address_street1, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo, :applicable_medium_id, :applicable_medium_text, :territory_id, :territory_text, :term_id, :term_text, :person_date_of_birth, diff --git a/app/controllers/contracts_controller.rb b/app/controllers/contracts_controller.rb index 73997e1..6f943ec 100644 --- a/app/controllers/contracts_controller.rb +++ b/app/controllers/contracts_controller.rb @@ -48,8 +48,10 @@ class ContractsController < ApplicationController # Native release contracts must be generated on-the-fly; non-native releases have a contract attachment if releasable.native? send_file contract.to_pdf, download_attributes - else + elsif policy(contract).show? redirect_to releasable.contract.service_url + else + raise Pundit::NotAuthorizedError end end end diff --git a/app/controllers/public/appearance_releases_controller.rb b/app/controllers/public/appearance_releases_controller.rb index 4bd3d9f..419fcd1 100644 --- a/app/controllers/public/appearance_releases_controller.rb +++ b/app/controllers/public/appearance_releases_controller.rb @@ -39,11 +39,43 @@ class Public::AppearanceReleasesController < Public::BaseController authorize appearance_releases.build(params) end + def person_params + %i[ + person_first_name + person_last_name + person_phone + person_email + person_photo + person_address_street1 + person_address_street2 + person_address_city + person_address_state + person_address_zip + person_address_country + ] + end + + def guardian_params + %i[ + guardian_first_name + guardian_last_name + guardian_phone + guardian_email + guardian_photo + guardian_address_street1 + guardian_address_street2 + guardian_address_city + guardian_address_state + guardian_address_zip + guardian_address_country + ] + end + def appearance_release_params - params.require(:appearance_release).permit(:person_address, :person_first_name, :person_last_name, :person_phone, :person_email, :person_photo, - :guardian_address, :guardian_first_name, :guardian_last_name, :guardian_phone, :guardian_email, :guardian_photo, :minor, - :signature_base64, :person_date_of_birth, - :locale, :contract_template,) + params.require(:appearance_release).permit(person_params, guardian_params, + :minor, :signature_base64, + :person_date_of_birth, + :locale, :contract_template) end def appearance_release_params_with_locale diff --git a/app/models/appearance_release.rb b/app/models/appearance_release.rb index 9a587c7..078eefd 100644 --- a/app/models/appearance_release.rb +++ b/app/models/appearance_release.rb @@ -16,6 +16,29 @@ class AppearanceRelease < ApplicationRecord has_one_attached :person_photo + composed_of :person_address, + class_name: 'Address', + mapping: [ + %w[person_address_street1 street1], + %w[person_address_street2 street2], + %w[person_address_city city], + %w[person_address_state state], + %w[person_address_zip zip], + %w[person_address_country country] + ] + + composed_of :guardian_address, + class_name: 'Address', + mapping: [ + %w[guardian_address_street1 street1], + %w[guardian_address_street2 street2], + %w[guardian_address_city city], + %w[guardian_address_state state], + %w[guardian_address_zip zip], + %w[guardian_address_country country] + ] + + # These validations apply to all releases validates :person_email, email: true, allow_blank: true validates :person_first_name, :person_last_name, presence: true @@ -71,7 +94,18 @@ class AppearanceRelease < ApplicationRecord scope :having_no_person_photo, -> { left_joins(:person_photo_attachment).group(:id).having('COUNT(active_storage_attachments) = 0') } scope :with_person_name, ->(name) { where('person_first_name ILIKE ? OR person_last_name ILIKE ?', "%#{name}%") } - searchable_on %i[person_first_name person_last_name person_address person_email person_phone] + searchable_on %i[ + person_first_name + person_last_name + person_address_street1 + person_address_street2 + person_address_city + person_address_state + person_address_zip + person_address_country + person_email + person_phone + ] # All releases must respond to the following messages def name diff --git a/app/models/contract.rb b/app/models/contract.rb index 534c264..1c475e3 100644 --- a/app/models/contract.rb +++ b/app/models/contract.rb @@ -29,6 +29,10 @@ class Contract } end + def medical_release? + @releasable.instance_of?(MedicalRelease) + end + private def contract_template diff --git a/app/models/sample_appearance_release.rb b/app/models/sample_appearance_release.rb index e2e0a20..c1d7170 100644 --- a/app/models/sample_appearance_release.rb +++ b/app/models/sample_appearance_release.rb @@ -8,7 +8,12 @@ class SampleAppearanceRelease < AppearanceRelease def default_attrs { - person_address: "Street Address, City, State Zipcode", + person_address_street1: "Street Address", + person_address_street2: "St2", + person_address_city: "City", + person_address_state: "State", + person_address_zip: "ZIP", + person_address_country: "Country", person_first_name: "Some", person_last_name: "Person", person_phone: "555-555-5555", diff --git a/app/policies/contract_policy.rb b/app/policies/contract_policy.rb index c6a9b9e..f904cc5 100644 --- a/app/policies/contract_policy.rb +++ b/app/policies/contract_policy.rb @@ -1,5 +1,9 @@ class ContractPolicy < ApplicationPolicy def show? - user.manager? || user.account_manager? + if record.respond_to?(:medical_release?) && record.medical_release? + user.account_manager? + else + user.manager? || user.account_manager? + end end end diff --git a/app/policies/medical_release_policy.rb b/app/policies/medical_release_policy.rb index 126f992..087f087 100644 --- a/app/policies/medical_release_policy.rb +++ b/app/policies/medical_release_policy.rb @@ -31,7 +31,11 @@ class MedicalReleasePolicy < ReleasePolicy true end + def download_single? + user.account_manager? + end + def download_multiple? - true + download_single? end end diff --git a/app/views/appearance_releases/_form.html.erb b/app/views/appearance_releases/_form.html.erb index 831f297..9264f28 100644 --- a/app/views/appearance_releases/_form.html.erb +++ b/app/views/appearance_releases/_form.html.erb @@ -13,7 +13,7 @@
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %> <%= form.date_field :person_date_of_birth, wrapper_class: "col-sm-6", placeholder: Date.current %> - <%= form.text_field :person_address, wrapper_class: "col-sm-6" %> + <%= form.text_field :person_address_street1, wrapper_class: "col-sm-6" %>
!appearance_release.minor?) %>" data-ujs-target="guardian-fields"> @@ -26,7 +26,7 @@ <%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
- <%= form.text_field :guardian_address, wrapper_class: "col-sm-6" %> + <%= form.text_field :guardian_address_street1, wrapper_class: "col-sm-6" %>
<% end %> diff --git a/app/views/medical_releases/_medical_release.html.erb b/app/views/medical_releases/_medical_release.html.erb index 2b813e4..29c4b73 100644 --- a/app/views/medical_releases/_medical_release.html.erb +++ b/app/views/medical_releases/_medical_release.html.erb @@ -37,7 +37,7 @@ <% if policy(medical_release.tags).new? %> <%= link_to fa_icon("tags fw", text: "Tags"), [:new, medical_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %> <% end %> - <% if policy(Contract).show? && (medical_release.contract.attached? || medical_release.contract_template.present?) %> + <% if policy(MedicalRelease).download_single? && policy(Contract).show? && (medical_release.contract.attached? || medical_release.contract_template.present?) %> <%= link_to fa_icon("download fw", text: "Download"), [medical_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %> <% end %> <% if policy(medical_release).destroy? %> diff --git a/app/views/public/appearance_releases/new.html.erb b/app/views/public/appearance_releases/new.html.erb index ad80736..99d4c40 100644 --- a/app/views/public/appearance_releases/new.html.erb +++ b/app/views/public/appearance_releases/new.html.erb @@ -35,8 +35,8 @@
<%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %> <%= form.date_field :person_date_of_birth, required: true, wrapper_class: "col-sm-6", placeholder: Date.current %> - <%= form.text_field :person_address, required: true, wrapper_class: "col-sm-6" %>
+ <%= render "shared/address_fields", form: form, subject: "person", required: true %> <% end %> <%= card_field_set_tag t(".photo.heading") do %> @@ -79,9 +79,7 @@
<%= form.text_field :guardian_email, required: @appearance_release.minor?, wrapper_class: "col-sm-6" %>
-
- <%= form.text_field :guardian_address, required: @appearance_release.minor?, wrapper_class: "col-sm-6" %> -
+ <%= render "shared/address_fields", form: form, subject: "guardian", required: @appearance_release.minor? %> <% end %>
diff --git a/app/views/shared/_address_fields.html.erb b/app/views/shared/_address_fields.html.erb index 6346517..51cda48 100644 --- a/app/views/shared/_address_fields.html.erb +++ b/app/views/shared/_address_fields.html.erb @@ -1,13 +1,14 @@ <% field_name_prefix = subject.present? ? "#{subject}_" : "" %> +<% required = required || false %>
- <%= form.text_field "#{field_name_prefix}address_street1", wrapper_class: "col-sm-6" %> + <%= form.text_field "#{field_name_prefix}address_street1", required: required, wrapper_class: "col-sm-6" %> <%= form.text_field "#{field_name_prefix}address_street2", wrapper_class: "col-sm-6" %>
- <%= form.text_field "#{field_name_prefix}address_city", wrapper_class: "col-sm-6" %> - <%= form.text_field "#{field_name_prefix}address_state", wrapper_class: "col-sm-3" %> - <%= form.text_field "#{field_name_prefix}address_zip", wrapper_class: "col-sm-3" %> + <%= form.text_field "#{field_name_prefix}address_city", required: required, wrapper_class: "col-sm-6" %> + <%= form.text_field "#{field_name_prefix}address_state", required: required, wrapper_class: "col-sm-3" %> + <%= form.text_field "#{field_name_prefix}address_zip", required: required, wrapper_class: "col-sm-3" %>
<%= form.form_group "#{field_name_prefix}address_country" do %> <%= form.label "#{field_name_prefix}address_country" %> diff --git a/config/locales/en.yml b/config/locales/en.yml index 43a0098..120294d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -328,8 +328,19 @@ en: person_phone: Phone number person_title: Title appearance_release: + guardian_address_city: Guardian city + guardian_address_country: Guardian country + guardian_address_state: Guardian state + guardian_address_street1: Guardian address + guardian_address_street2: Guardian address (Line 2) + guardian_address_zip: Guardian zip code minor: Is the person a minor? - person_address: Address + person_address_city: City + person_address_country: Country + person_address_state: State + person_address_street1: Address + person_address_street2: Address (Line 2) + person_address_zip: Zip code person_date_of_birth: Date of birth person_email: Email address person_first_name: First name diff --git a/config/locales/es.yml b/config/locales/es.yml index be353f4..82258a2 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -115,11 +115,20 @@ es: helpers: label: appearance_release: - guardian_address: Dirección del tutor legal + guardian_address_city: Guardian city (ES) + guardian_address_country: Guardian country (ES) + guardian_address_state: Guardian state (ES) + guardian_address_street1: Dirección del tutor legal + guardian_address_street2: Dirección del tutor legal (Línea 2) + guardian_address_zip: Guardian zip code (ES) guardian_name: Nómbre del tutor legal guardian_phone: Número de teléfono del tutor legal minor: El firmante es un menor - person_address: Dirección + person_address_city: City (ES) + person_address_country: Country (ES) + person_address_state: State (ES) + person_address_street1: Address (ES) + person_address_street2: Address (Line 2) (ES) person_email: Dirección de correo electrónico person_name: Nómbre person_phone: Número de teléfono diff --git a/db/migrate/20200615133602_destructure_person_address_column_in_appearance_releases.rb b/db/migrate/20200615133602_destructure_person_address_column_in_appearance_releases.rb new file mode 100644 index 0000000..ba88cc4 --- /dev/null +++ b/db/migrate/20200615133602_destructure_person_address_column_in_appearance_releases.rb @@ -0,0 +1,10 @@ +class DestructurePersonAddressColumnInAppearanceReleases < ActiveRecord::Migration[6.0] + def change + rename_column :appearance_releases, :person_address, :person_address_street1 + add_column :appearance_releases, :person_address_street2, :string + add_column :appearance_releases, :person_address_city, :string + add_column :appearance_releases, :person_address_state, :string + add_column :appearance_releases, :person_address_zip, :string + add_column :appearance_releases, :person_address_country, :string + end +end diff --git a/db/migrate/20200616124214_destructure_guardian_address_column_in_appearance_releases.rb b/db/migrate/20200616124214_destructure_guardian_address_column_in_appearance_releases.rb new file mode 100644 index 0000000..9cb94da --- /dev/null +++ b/db/migrate/20200616124214_destructure_guardian_address_column_in_appearance_releases.rb @@ -0,0 +1,10 @@ +class DestructureGuardianAddressColumnInAppearanceReleases < ActiveRecord::Migration[6.0] + def change + rename_column :appearance_releases, :guardian_address, :guardian_address_street1 + add_column :appearance_releases, :guardian_address_street2, :string + add_column :appearance_releases, :guardian_address_city, :string + add_column :appearance_releases, :guardian_address_state, :string + add_column :appearance_releases, :guardian_address_zip, :string + add_column :appearance_releases, :guardian_address_country, :string + end +end diff --git a/db/structure.sql b/db/structure.sql index f6a1918..bc6f2ba 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -290,13 +290,13 @@ ALTER SEQUENCE public.active_storage_blobs_id_seq OWNED BY public.active_storage CREATE TABLE public.appearance_releases ( id bigint NOT NULL, person_name_old character varying, - person_address character varying, + person_address_street1 character varying, person_phone character varying, project_id bigint, created_at timestamp without time zone NOT NULL, updated_at timestamp without time zone NOT NULL, minor boolean DEFAULT false, - guardian_address character varying, + guardian_address_street1 character varying, guardian_name_old character varying, guardian_phone character varying, person_email character varying, @@ -318,7 +318,17 @@ CREATE TABLE public.appearance_releases ( guardian_first_name character varying, guardian_last_name character varying, identifier character varying, - guardian_email character varying + guardian_email character varying, + person_address_street2 character varying, + person_address_city character varying, + person_address_state character varying, + person_address_zip character varying, + person_address_country character varying, + guardian_address_street2 character varying, + guardian_address_city character varying, + guardian_address_state character varying, + guardian_address_zip character varying, + guardian_address_country character varying ); @@ -3654,6 +3664,8 @@ INSERT INTO "schema_migrations" (version) VALUES ('20200610085411'), ('20200610140459'), ('20200612121539'), -('20200615131722'); +('20200615131722'), +('20200615133602'), +('20200616124214'); diff --git a/spec/controllers/appearance_releases_controller_spec.rb b/spec/controllers/appearance_releases_controller_spec.rb index 7b78840..53e2be6 100644 --- a/spec/controllers/appearance_releases_controller_spec.rb +++ b/spec/controllers/appearance_releases_controller_spec.rb @@ -265,6 +265,9 @@ RSpec.describe AppearanceReleasesController, tye: :controller do 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 diff --git a/spec/controllers/contracts_controller_spec.rb b/spec/controllers/contracts_controller_spec.rb index 5456dcf..6d6976a 100644 --- a/spec/controllers/contracts_controller_spec.rb +++ b/spec/controllers/contracts_controller_spec.rb @@ -63,4 +63,55 @@ RSpec.describe ContractsController, type: :controller do it_behaves_like "a contracts controller" end + + context "for medical releases" do + let(:native_releasable) { create(:medical_release_with_contract_template, :native) } + let(:non_native_releasable) { create(:medical_release_with_contract_template, :non_native) } + + describe "#show when user is account manager" do + it_behaves_like "a contracts controller" + end + + shared_examples "a medical contracts controller for non-authorized users" do + describe "#show" do + context "for a native release" do + it "responds with not authorized error" do + pdf_body = Tempfile.new + allow_any_instance_of(Contract).to receive(:to_pdf).and_return(pdf_body) + + expect { + get :show, params: { format: :pdf, "#{native_releasable.model_name.singular}_id" => native_releasable } + }.to raise_exception(Pundit::NotAuthorizedError) + end + end + + context "for a non-native release" do + it "responds with the attached contract" do + contract = double(:contract, service_url: "http://example.org/contract.pdf") + allow_any_instance_of(non_native_releasable.class).to receive(:contract).and_return(contract) + + expect { + get :show, params: { format: :pdf, "#{non_native_releasable.model_name.singular}_id" => non_native_releasable } + }.to raise_exception(Pundit::NotAuthorizedError) + end + end + end + end + + describe "#show when user is project manager" do + let(:manager_user) { create(:user, :manager) } + before do + sign_in manager_user + end + it_behaves_like "a medical contracts controller for non-authorized users" + end + + describe "#show when user is associate" do + let(:associate_user) { create(:user, :associate) } + before do + sign_in associate_user + end + it_behaves_like "a medical contracts controller for non-authorized users" + end + end end diff --git a/spec/controllers/public/appearance_releases_controller_spec.rb b/spec/controllers/public/appearance_releases_controller_spec.rb index 3130922..7b2ecf2 100644 --- a/spec/controllers/public/appearance_releases_controller_spec.rb +++ b/spec/controllers/public/appearance_releases_controller_spec.rb @@ -31,7 +31,7 @@ describe Public::AppearanceReleasesController do contract_template = create(:contract_template, project: project) sign_in(user) - post :create, params: { account_id: user.primary_account.to_param, project_id: project, contract_template_id: contract_template, appearance_release: { person_address: "Albuquerque" } } + post :create, params: { account_id: user.primary_account.to_param, project_id: project, contract_template_id: contract_template, appearance_release: { person_email: "email@email.com" } } body = CGI.unescape_html(response.body) expect(body).to match /Person first name can't be blank/ expect(body).to match /Person last name can't be blank/ @@ -120,7 +120,19 @@ describe Public::AppearanceReleasesController do def minor_appearance_release_params(with_guardian_photo = true) minor_type = with_guardian_photo ? :minor_with_guardian_photo : :minor - attributes_for(:appearance_release, minor_type).merge(signature_param) + attributes_for(:appearance_release, minor_type) + .merge(signature_param, guardian_address_params) + end + + def guardian_address_params + { + guardian_address_street1: "St1", + guardian_address_street2: "St2", + guardian_address_city: "City", + guardian_address_state: "State", + guardian_address_zip: "ZIP", + guardian_address_country: "Country" + } end def signature_param diff --git a/spec/factories/appearance_releases.rb b/spec/factories/appearance_releases.rb index afcec4e..c656d74 100644 --- a/spec/factories/appearance_releases.rb +++ b/spec/factories/appearance_releases.rb @@ -11,7 +11,12 @@ FactoryBot.define do end trait :native do - person_address "100 Test Lane, New York, NY 10001" + person_address_street1 "St1" + person_address_street2 "St2" + person_address_city "City" + person_address_state "State" + person_address_zip "ZIP" + person_address_country "Country" person_phone "123-555-6789" signature do @@ -31,7 +36,12 @@ FactoryBot.define do minor true guardian_first_name "Jamie" guardian_last_name "Doe" - guardian_address "100 Test Lane, New York, 10001" + guardian_address_street1 "St1" + guardian_address_street2 "St2" + guardian_address_city "City" + guardian_address_state "State" + guardian_address_zip "ZIP" + guardian_address_country "Country" guardian_phone "123-555-1234" guardian_email "guardian@galaxy.all" end @@ -40,9 +50,14 @@ FactoryBot.define do minor true guardian_first_name "Jamie" guardian_last_name "Doe" - guardian_address "100 Test Lane, New York, 10001" guardian_phone "123-555-1234" guardian_email "guardian@galaxy.all" + guardian_address_street1 "St1" + guardian_address_street2 "St2" + guardian_address_city "City" + guardian_address_state "State" + guardian_address_zip "ZIP" + guardian_address_country "Country" guardian_photo do path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg") Rack::Test::UploadedFile.new(path, "image/jpeg") diff --git a/spec/features/user_managing_appearance_releases_spec.rb b/spec/features/user_managing_appearance_releases_spec.rb index 03cdd05..33e1eb3 100644 --- a/spec/features/user_managing_appearance_releases_spec.rb +++ b/spec/features/user_managing_appearance_releases_spec.rb @@ -19,7 +19,7 @@ feature 'User managing appearance releases' do fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' - fill_in person_address_field, with: '123 Test Lane, New York, NY 10000' + fill_in_person_address_fields fill_in person_phone_field, with: '555-555-5555' fill_in person_email_field, with: 'jane.doe@test.com' fill_in person_date_of_birth, with: '01/01/1999' @@ -52,7 +52,7 @@ feature 'User managing appearance releases' do fill_in guardian_phone_field, with: '001101' fill_in person_first_name_field, with: 'Jane' fill_in person_last_name_field, with: 'Doe' - fill_in person_address_field, with: '123 Test Lane, New York, NY 10000' + fill_in_person_address_fields fill_in person_phone_field, with: '555-555-5555' fill_in person_email_field, with: 'jane.doe@test.com' fill_in person_date_of_birth, with: '01/01/1999' @@ -65,7 +65,7 @@ feature 'User managing appearance releases' do expect(page).to have_content('Guardian email is not an email') fill_in guardian_email_field, with: 'valid@email.com' - fill_in guardian_address_field, with: '123 Test Lane, New York, NY 10000' + fill_in_guardian_address_fields attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64' click_button submit_release_button @@ -470,8 +470,20 @@ feature 'User managing appearance releases' do 'Guardian email' end - def guardian_address_field - 'Guardian address' + def guardian_address_street1_field + t('helpers.label.appearance_release.guardian_address_street1') + end + + def guardian_address_city_field + t('helpers.label.appearance_release.guardian_address_city') + end + + def guardian_address_state_field + t('helpers.label.appearance_release.guardian_address_state') + end + + def guardian_address_zip_field + t('helpers.label.appearance_release.guardian_address_zip') end def guardian_photo_field @@ -490,8 +502,34 @@ feature 'User managing appearance releases' do t('helpers.label.appearance_release.person_last_name') end - def person_address_field - t('helpers.label.appearance_release.person_address') + def fill_in_person_address_fields + fill_in person_address_street1_field, with: "123 Test Lane" + fill_in person_address_city_field, with: "New York" + fill_in person_address_state_field, with: "NY" + fill_in person_address_zip_field, with: '1000' + end + + def fill_in_guardian_address_fields + fill_in guardian_address_street1_field, with: "124 Test Lane" + fill_in guardian_address_city_field, with: "New York" + fill_in guardian_address_state_field, with: "NY" + fill_in guardian_address_zip_field, with: '1000' + end + + def person_address_street1_field + t('helpers.label.appearance_release.person_address_street1') + end + + def person_address_city_field + t('helpers.label.appearance_release.person_address_city') + end + + def person_address_state_field + t('helpers.label.appearance_release.person_address_state') + end + + def person_address_zip_field + t('helpers.label.appearance_release.person_address_zip') end def person_email_field diff --git a/spec/features/user_managing_medical_releases_spec.rb b/spec/features/user_managing_medical_releases_spec.rb new file mode 100644 index 0000000..a42a1d6 --- /dev/null +++ b/spec/features/user_managing_medical_releases_spec.rb @@ -0,0 +1,145 @@ +require "rails_helper" + +feature "User managing medical releases" do + let(:current_user) { create(:user) } + let(:project) { create(:project, members: current_user, account: current_user.primary_account) } + + context "when signed in as account manager" do + before do + sign_in current_user + end + + scenario "Download All is visible" do + create(:medical_release_with_contract_template, :native, project: project) + create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + expect(page).to have_content download_all_button + end + + scenario "Download action in Manage menu is visible" do + create(:medical_release_with_contract_template, :native, project: project) + create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + expect(page).to have_link("Download", exact: true, count: 2) + end + + scenario "Downloading PDF of native medical release is possible" do + native_release = create(:medical_release_with_contract_template, :native, project: project) + + visit project_medical_releases_path(project) + + click_link *view_release_pdf_link_for(native_release) + expect(content_type).to eq('application/pdf') + end + end + + context "when the user is manager(project manager)" do + let(:current_user) { create(:user, :manager) } + + before do + sign_in current_user + end + + scenario "Download All is not visible" do + create(:medical_release_with_contract_template, :native, project: project) + create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + expect(page).not_to have_content download_all_button + end + + scenario "Download action in Manage menu is not visible" do + create(:medical_release_with_contract_template, :native, project: project) + create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + expect(page).to have_link("Download", exact: true, count: 0) + end + + scenario "Downloading PDF of native medical release is not possible" do + native_release = create(:medical_release_with_contract_template, :native, project: project) + + visit project_medical_releases_path(project) + + link = medical_release_contracts_path(native_release, format: 'pdf') + expect { visit link }.to raise_exception Pundit::NotAuthorizedError + end + + scenario "Downloading PDF of non native medical release is not possible" do + non_native_release = create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + link = medical_release_contracts_path(non_native_release, format: 'pdf') + expect { visit link }.to raise_exception Pundit::NotAuthorizedError + end + end + + context "when the user is associate" do + let(:current_user) { create(:user, :associate) } + + before do + sign_in current_user + end + + scenario "Download All is not visible" do + create(:medical_release_with_contract_template, :native, project: project) + create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + expect(page).not_to have_content download_all_button + end + + scenario "Download action in Manage menu is not visible" do + create(:medical_release_with_contract_template, :native, project: project) + create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + expect(page).to have_link("Download", exact: true, count: 0) + end + + scenario "Downloading PDF of native medical release is not possible" do + native_release = create(:medical_release_with_contract_template, :native, project: project) + + visit project_medical_releases_path(project) + + link = medical_release_contracts_path(native_release, format: 'pdf') + expect { visit link }.to raise_exception Pundit::NotAuthorizedError + end + + scenario "Downloading PDF of non native medical release is not possible" do + non_native_release = create(:medical_release_with_contract_template, :non_native, project: project) + + visit project_medical_releases_path(project) + + link = medical_release_contracts_path(non_native_release, format: 'pdf') + expect { visit link }.to raise_exception Pundit::NotAuthorizedError + end + end + + private + + def download_all_button + 'Download All' + end + + def download_action + 'Download' + end + + def manage_button + t 'medical_releases.medical_release.actions.manage' + end + + def view_release_pdf_link_for(release) + ['Download', href: medical_release_contracts_path(release, format: 'pdf')] + end +end diff --git a/spec/models/contract_template_preview_spec.rb b/spec/models/contract_template_preview_spec.rb index 7cdf8ec..dee4dea 100644 --- a/spec/models/contract_template_preview_spec.rb +++ b/spec/models/contract_template_preview_spec.rb @@ -50,11 +50,19 @@ describe ContractTemplatePreview do 'id' => nil, 'person_first_name' => 'Dummy', 'person_last_name' => 'Person', - 'person_address' => 'Street 1, Street 2, City, State 12345, Country', + 'person_address_street1' => 'Street 1', + 'person_address_street2' => 'Street 2', + 'person_address_city' => 'City', + 'person_address_state' => 'State', + 'person_address_zip' => '12345', 'person_phone' => '00 111 222 333 4444', 'updated_at' => nil, 'minor' => true, - 'guardian_address' => 'Street 3, Street 4, City-2, State-2 112233, Country-2', + 'guardian_address_street1' => 'Street 3', + 'guardian_address_street2' => 'Street 4', + 'guardian_address_city' => 'City-2', + 'guardian_address_state' => 'State-2', + 'guardian_address_zip' => '112233', "guardian_first_name" => nil, "guardian_last_name" => nil, "guardian_name_old" => nil, diff --git a/spec/models/excel_reports/video_reports/nat_geo_legal_binder_logs/appearance_release_log_sheet_spec.rb b/spec/models/excel_reports/video_reports/nat_geo_legal_binder_logs/appearance_release_log_sheet_spec.rb index ce1ff5f..9b1490e 100644 --- a/spec/models/excel_reports/video_reports/nat_geo_legal_binder_logs/appearance_release_log_sheet_spec.rb +++ b/spec/models/excel_reports/video_reports/nat_geo_legal_binder_logs/appearance_release_log_sheet_spec.rb @@ -29,7 +29,7 @@ module ExcelReports restriction: Restriction.last, person_first_name: "John", person_last_name: "Doe", - person_address: "123 Main Street, New York, NY 10000") + person_address_street1: "123 Main Street, New York, NY 10000") ) ) allow(sheet).to receive(:add_row)