mirror of https://github.com/docusealco/docuseal
- Add Base64-encoded JSON parameter support for ATS prefill values - Implement field mapping between ATS field names and template field UUIDs - Enhance merge logic to preserve existing submitter values while adding ATS prefill data - Add comprehensive error handling for invalid Base64 and JSON parsing - Update form rendering to use merged ATS values for prefill functionality - Add integration tests for complete ATS prefill workflowpull/544/head
parent
dca1c1f20d
commit
f50b6b89f2
@ -0,0 +1,221 @@
|
||||
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(['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
|
||||
allow(controller).to receive(:params).and_return(ActionController::Parameters.new({
|
||||
ats_fields: Base64.urlsafe_encode64(['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)
|
||||
}))
|
||||
|
||||
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
|
||||
Loading…
Reference in new issue