mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
7.8 KiB
234 lines
7.8 KiB
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
RSpec.describe 'ATS Prefill Integration', type: :request do
|
|
let(:account) { create(:account) }
|
|
let(:user) { create(:user, account: account) }
|
|
let(:template_folder) { create(:template_folder, account: account) }
|
|
|
|
let(:template_fields) do
|
|
[
|
|
{
|
|
'uuid' => 'field-1-uuid',
|
|
'name' => 'First Name',
|
|
'type' => 'text',
|
|
'prefill' => 'employee_first_name',
|
|
'submitter_uuid' => 'submitter-uuid-1'
|
|
},
|
|
{
|
|
'uuid' => 'field-2-uuid',
|
|
'name' => 'Last Name',
|
|
'type' => 'text',
|
|
'prefill' => 'employee_last_name',
|
|
'submitter_uuid' => 'submitter-uuid-1'
|
|
},
|
|
{
|
|
'uuid' => 'field-3-uuid',
|
|
'name' => 'Email',
|
|
'type' => 'text',
|
|
'prefill' => 'employee_email',
|
|
'submitter_uuid' => 'submitter-uuid-1'
|
|
},
|
|
{
|
|
'uuid' => 'field-4-uuid',
|
|
'name' => 'Signature',
|
|
'type' => 'signature',
|
|
'submitter_uuid' => 'submitter-uuid-1'
|
|
}
|
|
]
|
|
end
|
|
|
|
let(:template) do
|
|
create(:template,
|
|
account: account,
|
|
author: user,
|
|
folder: template_folder,
|
|
fields: template_fields,
|
|
submitters: [{ 'name' => 'First Party', 'uuid' => 'submitter-uuid-1' }])
|
|
end
|
|
|
|
let(:submission) do
|
|
create(:submission,
|
|
template: template,
|
|
account: account,
|
|
created_by_user: user,
|
|
template_fields: template_fields,
|
|
template_submitters: [{ 'name' => 'First Party', 'uuid' => 'submitter-uuid-1' }])
|
|
end
|
|
|
|
let(:submitter) do
|
|
create(:submitter,
|
|
submission: submission,
|
|
uuid: 'submitter-uuid-1',
|
|
name: 'John Doe',
|
|
email: 'john@example.com')
|
|
end
|
|
|
|
describe 'Controller ATS parameter processing' do
|
|
let(:controller) { SubmitFormController.new }
|
|
|
|
before do
|
|
allow(controller).to receive(:params).and_return(ActionController::Parameters.new(test_params))
|
|
end
|
|
|
|
context 'when ATS fields and values are provided via Base64 parameters' do
|
|
let(:test_params) do
|
|
{
|
|
ats_fields: Base64.urlsafe_encode64(%w[employee_first_name employee_last_name employee_email].to_json),
|
|
ats_values: Base64.urlsafe_encode64({ 'employee_first_name' => 'John', 'employee_last_name' => 'Smith',
|
|
'employee_email' => 'john.smith@company.com' }.to_json)
|
|
}
|
|
end
|
|
|
|
it 'successfully decodes and processes ATS parameters' do
|
|
result = controller.send(:fetch_ats_prefill_values_if_available)
|
|
|
|
expect(result).to eq({
|
|
'employee_first_name' => 'John',
|
|
'employee_last_name' => 'Smith',
|
|
'employee_email' => 'john.smith@company.com'
|
|
})
|
|
end
|
|
end
|
|
|
|
context 'when ats_values parameter contains invalid Base64' do
|
|
let(:test_params) do
|
|
{
|
|
ats_fields: Base64.urlsafe_encode64(['employee_first_name'].to_json),
|
|
ats_values: 'invalid-base64!'
|
|
}
|
|
end
|
|
|
|
it 'handles Base64 decoding errors gracefully' do
|
|
result = controller.send(:fetch_ats_prefill_values_if_available)
|
|
expect(result).to eq({})
|
|
end
|
|
end
|
|
|
|
context 'when ats_values parameter contains valid Base64 but invalid JSON' do
|
|
let(:test_params) do
|
|
{
|
|
ats_fields: Base64.urlsafe_encode64(['employee_first_name'].to_json),
|
|
ats_values: Base64.urlsafe_encode64('invalid json')
|
|
}
|
|
end
|
|
|
|
it 'handles JSON parsing errors gracefully' do
|
|
result = controller.send(:fetch_ats_prefill_values_if_available)
|
|
expect(result).to eq({})
|
|
end
|
|
end
|
|
|
|
context 'when ats_values parameter contains valid JSON but wrong data type' do
|
|
let(:test_params) do
|
|
{
|
|
ats_fields: Base64.urlsafe_encode64(['employee_first_name'].to_json),
|
|
ats_values: Base64.urlsafe_encode64('["not", "a", "hash"]')
|
|
}
|
|
end
|
|
|
|
it 'handles invalid data type gracefully' do
|
|
result = controller.send(:fetch_ats_prefill_values_if_available)
|
|
expect(result).to eq({})
|
|
end
|
|
end
|
|
|
|
context 'when no ATS parameters are provided' do
|
|
let(:test_params) { {} }
|
|
|
|
it 'returns empty hash when no ATS parameters present' do
|
|
result = controller.send(:fetch_ats_prefill_values_if_available)
|
|
expect(result).to eq({})
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'Helper method integration' do
|
|
include PrefillFieldsHelper
|
|
|
|
it 'correctly maps ATS field names to template field UUIDs' do
|
|
result = find_field_uuid_by_name('employee_first_name', template_fields)
|
|
expect(result).to eq('field-1-uuid')
|
|
|
|
result = find_field_uuid_by_name('employee_last_name', template_fields)
|
|
expect(result).to eq('field-2-uuid')
|
|
|
|
result = find_field_uuid_by_name('nonexistent_field', template_fields)
|
|
expect(result).to be_nil
|
|
end
|
|
|
|
it 'correctly merges ATS values with existing submitter values' do
|
|
existing_values = { 'field-1-uuid' => 'Existing John' }
|
|
ats_values = { 'employee_first_name' => 'ATS John', 'employee_last_name' => 'ATS Smith' }
|
|
|
|
result = merge_ats_prefill_values(existing_values, ats_values, template_fields)
|
|
|
|
expect(result).to eq({
|
|
'field-1-uuid' => 'Existing John', # Should not override existing value
|
|
'field-2-uuid' => 'ATS Smith' # Should add new ATS value
|
|
})
|
|
end
|
|
|
|
it 'handles empty ATS values gracefully' do
|
|
existing_values = { 'field-1-uuid' => 'Existing John' }
|
|
ats_values = {}
|
|
|
|
result = merge_ats_prefill_values(existing_values, ats_values, template_fields)
|
|
|
|
expect(result).to eq({
|
|
'field-1-uuid' => 'Existing John'
|
|
})
|
|
end
|
|
|
|
it 'handles missing template fields gracefully' do
|
|
existing_values = {}
|
|
ats_values = { 'nonexistent_field' => 'Some Value' }
|
|
|
|
result = merge_ats_prefill_values(existing_values, ats_values, template_fields)
|
|
|
|
expect(result).to eq({})
|
|
end
|
|
end
|
|
|
|
describe 'End-to-end ATS prefill workflow' do
|
|
include PrefillFieldsHelper
|
|
|
|
it 'processes complete ATS prefill workflow from parameters to merged values' do
|
|
# Step 1: Simulate controller parameter processing
|
|
controller = SubmitFormController.new
|
|
ats_fields_data = %w[employee_first_name employee_last_name employee_email]
|
|
ats_values_data = {
|
|
'employee_first_name' => 'John',
|
|
'employee_last_name' => 'Smith',
|
|
'employee_email' => 'john.smith@company.com'
|
|
}
|
|
|
|
encoded_fields = Base64.urlsafe_encode64(ats_fields_data.to_json)
|
|
encoded_values = Base64.urlsafe_encode64(ats_values_data.to_json)
|
|
|
|
params = ActionController::Parameters.new({
|
|
ats_fields: encoded_fields,
|
|
ats_values: encoded_values
|
|
})
|
|
|
|
allow(controller).to receive(:params).and_return(params)
|
|
|
|
ats_values = controller.send(:fetch_ats_prefill_values_if_available)
|
|
|
|
# Step 2: Simulate existing submitter values
|
|
existing_submitter_values = { 'field-1-uuid' => 'Existing John' }
|
|
|
|
# Step 3: Merge ATS values with existing values
|
|
final_values = merge_ats_prefill_values(existing_submitter_values, ats_values, template_fields)
|
|
|
|
# Step 4: Verify final result
|
|
expect(final_values).to eq({
|
|
'field-1-uuid' => 'Existing John', # Existing value preserved
|
|
'field-2-uuid' => 'Smith', # ATS value applied
|
|
'field-3-uuid' => 'john.smith@company.com' # ATS value applied
|
|
})
|
|
end
|
|
end
|
|
end
|