From 178ee470933f6b4945538a10722d36f569df25e3 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Tue, 15 Oct 2024 21:44:15 +0300 Subject: [PATCH] add more specs --- lib/params/base_validator.rb | 4 +- lib/params/submission_create_validator.rb | 2 +- spec/factories/templates.rb | 75 +++++++++++++---------- spec/requests/submissions_spec.rb | 28 ++++++++- spec/requests/templates_spec.rb | 8 +-- 5 files changed, 77 insertions(+), 40 deletions(-) diff --git a/lib/params/base_validator.rb b/lib/params/base_validator.rb index 100b0e43..964ad553 100644 --- a/lib/params/base_validator.rb +++ b/lib/params/base_validator.rb @@ -65,11 +65,11 @@ module Params raise_error(message || "#{key} must follow the #{regexp.source} format") end - def unique(params, key, message: nil) + def unique_value(params, key, message: nil) return unless params.is_a?(Array) return if params.none? return if params.all? { |p| p[key].blank? } - return if params.pluck(key).uniq.size == params.pluck(key).size + return if params.pluck(key).compact_blank.uniq.size == params.pluck(key).compact_blank.size raise_error(message || "#{key} must be unique") end diff --git a/lib/params/submission_create_validator.rb b/lib/params/submission_create_validator.rb index 1d830d13..0658aac2 100644 --- a/lib/params/submission_create_validator.rb +++ b/lib/params/submission_create_validator.rb @@ -60,7 +60,7 @@ module Params if params[:submitters].present? in_path(params, :submitters) do |submitters_params| type(submitters_params, 0, Hash) - unique(submitters_params, :role) + unique_value(submitters_params, :role) end end diff --git a/spec/factories/templates.rb b/spec/factories/templates.rb index d1c433d2..f4f2ff62 100644 --- a/spec/factories/templates.rb +++ b/spec/factories/templates.rb @@ -7,7 +7,11 @@ FactoryBot.define do author factory: %i[user] name { Faker::Book.title } - after(:create) do |template| + transient do + submitter_count { 1 } + end + + after(:create) do |template, evaluator| blob = ActiveStorage::Blob.create_and_upload!( io: Rails.root.join('spec/fixtures/sample-document.pdf').open, filename: 'sample-document.pdf', @@ -22,39 +26,46 @@ FactoryBot.define do Templates::ProcessDocument.call(attachment, attachment.download) template.schema = [{ attachment_uuid: attachment.uuid, name: 'sample-document' }] - template.submitters = [ - { - 'name' => 'First Party', - 'uuid' => '513848eb-1096-4abc-a743-68596b5aaa4c' - } - ] - template.fields = [ - { - 'uuid' => '21637fc9-0655-45df-8952-04ec64949e85', - 'submitter_uuid' => '513848eb-1096-4abc-a743-68596b5aaa4c', - 'name' => 'First Name', - 'type' => 'text', - 'required' => true, - 'areas' => [ - { - 'x' => 0.09027777777777778, - 'y' => 0.1197252208047105, - 'w' => 0.3069444444444444, - 'h' => 0.03336604514229637, - 'attachment_uuid' => attachment.uuid, - 'page' => 0 - } - ] - }, + number_words = %w[first second third fourth fifth sixth seventh eighth ninth tenth] + + template.submitters = Array.new(evaluator.submitter_count) do |i| { - 'uuid' => '1f97f8e3-dc82-4586-aeea-6ebed6204e46', - 'submitter_uuid' => '513848eb-1096-4abc-a743-68596b5aaa4c', - 'name' => '', - 'type' => 'signature', - 'required' => true, - 'areas' => [] + 'name' => "#{number_words[i]&.capitalize} Party", + 'uuid' => SecureRandom.uuid } - ] + end + + template.fields = template.submitters.reduce([]) do |fields, submitter| + fields += [ + { + 'uuid' => SecureRandom.uuid, + 'submitter_uuid' => submitter['uuid'], + 'name' => 'First Name', + 'type' => 'text', + 'required' => true, + 'areas' => [ + { + 'x' => 0.09027777777777778, + 'y' => 0.1197252208047105, + 'w' => 0.3069444444444444, + 'h' => 0.03336604514229637, + 'attachment_uuid' => attachment.uuid, + 'page' => 0 + } + ] + }, + { + 'uuid' => SecureRandom.uuid, + 'submitter_uuid' => submitter['uuid'], + 'name' => '', + 'type' => 'signature', + 'required' => true, + 'areas' => [] + } + ] + + fields + end template.save! end diff --git a/spec/requests/submissions_spec.rb b/spec/requests/submissions_spec.rb index 23544cc0..5062662c 100644 --- a/spec/requests/submissions_spec.rb +++ b/spec/requests/submissions_spec.rb @@ -7,6 +7,7 @@ describe 'Submission API', type: :request do let!(:author) { create(:user, account:) } let!(:folder) { create(:template_folder, account:) } let!(:templates) { create_list(:template, 2, account:, author:, folder:) } + let!(:multiple_submitters_template) { create(:template, submitter_count: 3, account:, author:, folder:) } describe 'GET /api/submissions' do it 'returns a list of submissions' do @@ -57,6 +58,31 @@ describe 'Submission API', type: :request do expect(response.parsed_body).to eq(JSON.parse(create_submission_body(submission).to_json)) end + it 'creates a submission when some submitter roles are not provided' do + post '/api/submissions', headers: { 'x-auth-token': author.access_token.token }, params: { + template_id: multiple_submitters_template.id, + send_email: true, + submitters: [ + { role: 'First Role', email: 'john.doe@example.com' }, + { email: 'jane.doe@example.com' }, + { email: 'mike.doe@example.com' } + ] + }.to_json + + expect(response).to have_http_status(:ok) + + submission = Submission.last + + expect(response.parsed_body).to eq(JSON.parse(create_submission_body(submission).to_json)) + expect(response.parsed_body).to eq(JSON.parse(create_submission_body(submission).to_json)) + expect(response.parsed_body[0]['role']).to eq('First Party') + expect(response.parsed_body[0]['email']).to eq('john.doe@example.com') + expect(response.parsed_body[1]['role']).to eq('Second Party') + expect(response.parsed_body[1]['email']).to eq('jane.doe@example.com') + expect(response.parsed_body[2]['role']).to eq('Third Party') + expect(response.parsed_body[2]['email']).to eq('mike.doe@example.com') + end + it 'returns an error if the template fields are missing' do templates[0].update(fields: []) @@ -72,7 +98,7 @@ describe 'Submission API', type: :request do it 'returns an error if submitter roles are not unique' do post '/api/submissions', headers: { 'x-auth-token': author.access_token.token }, params: { - template_id: templates[0].id, + template_id: multiple_submitters_template.id, send_email: true, submitters: [ { role: 'First Role', email: 'john.doe@example.com' }, diff --git a/spec/requests/templates_spec.rb b/spec/requests/templates_spec.rb index aa4951bf..67430ed8 100644 --- a/spec/requests/templates_spec.rb +++ b/spec/requests/templates_spec.rb @@ -144,8 +144,8 @@ describe 'Templates API', type: :request do name: template.name, fields: [ { - 'uuid' => '21637fc9-0655-45df-8952-04ec64949e85', - 'submitter_uuid' => '513848eb-1096-4abc-a743-68596b5aaa4c', + 'uuid' => template.fields[0]['uuid'], + 'submitter_uuid' => template.submitters[0]['uuid'], 'name' => 'First Name', 'type' => 'text', 'required' => true, @@ -161,8 +161,8 @@ describe 'Templates API', type: :request do ] }, { - 'uuid' => '1f97f8e3-dc82-4586-aeea-6ebed6204e46', - 'submitter_uuid' => '513848eb-1096-4abc-a743-68596b5aaa4c', + 'uuid' => template.fields[1]['uuid'], + 'submitter_uuid' => template.submitters[0]['uuid'], 'name' => '', 'type' => 'signature', 'required' => true,