mirror of https://github.com/docusealco/docuseal
Merge pull request #46 from CareerPlug/CP-11565
CP-11565 - DocuSeal Audit Logging Improvementspull/608/head
commit
48d4d25eb3
@ -0,0 +1,7 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class AddUserIdToSubmissionEvents < ActiveRecord::Migration[8.0]
|
||||
def change
|
||||
add_reference :submission_events, :user, null: true, foreign_key: true
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,87 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Submitters::SubmitValues do
|
||||
let(:account) { create(:account) }
|
||||
let(:user) { create(:user, account: account) }
|
||||
let(:template) { create(:template, account: account) }
|
||||
let(:submission) { create(:submission, template: template, account: account) }
|
||||
let(:submitter) { create(:submitter, submission: submission, account: account, uuid: SecureRandom.uuid) }
|
||||
let(:request) { instance_double(ActionDispatch::Request, remote_ip: '127.0.0.1', user_agent: 'TestAgent') }
|
||||
|
||||
before do
|
||||
allow(request).to receive_messages(
|
||||
session: instance_double(ActionDispatch::Request::Session, id: 'session_id'),
|
||||
env: { 'warden' => instance_double(Warden::Proxy, user: user) }
|
||||
)
|
||||
|
||||
# Setup template fields
|
||||
fields = [
|
||||
{ 'uuid' => 'field_1', 'name' => 'First Name', 'type' => 'text', 'submitter_uuid' => submitter.uuid },
|
||||
{ 'uuid' => 'field_2', 'name' => 'Last Name', 'type' => 'text', 'submitter_uuid' => submitter.uuid }
|
||||
]
|
||||
template.update!(fields: fields)
|
||||
submission.update!(template_fields: fields)
|
||||
|
||||
# Initialize submitter values
|
||||
submitter.update!(values: { 'field_1' => 'John', 'field_2' => 'Doe' })
|
||||
create(:submission_event, submission: submission, submitter: submitter, event_type: 'start_form')
|
||||
end
|
||||
|
||||
describe '.call' do
|
||||
context 'when values change' do
|
||||
let(:params) do
|
||||
{
|
||||
values: { 'field_1' => 'Jane' }
|
||||
}
|
||||
end
|
||||
|
||||
it 'creates a form_update event with changes' do
|
||||
expect do
|
||||
described_class.call(submitter, ActionController::Parameters.new(params), request, user)
|
||||
end.to change(SubmissionEvent, :count).by(1)
|
||||
|
||||
event = SubmissionEvent.last
|
||||
expect(event.event_type).to eq('form_update')
|
||||
expect(event.user).to eq(user)
|
||||
expect(event.data['changes']).to include(
|
||||
hash_including('field' => 'First Name', 'from' => 'John', 'to' => 'Jane')
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when values do not change' do
|
||||
let(:params) do
|
||||
{
|
||||
values: { 'field_1' => 'John' }
|
||||
}
|
||||
end
|
||||
|
||||
it 'does not create a form_update event' do
|
||||
expect do
|
||||
described_class.call(submitter, ActionController::Parameters.new(params), request, user)
|
||||
end.not_to change(SubmissionEvent, :count)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when multiple fields change' do
|
||||
let(:params) do
|
||||
{
|
||||
values: { 'field_1' => 'Jane', 'field_2' => 'Smith' }
|
||||
}
|
||||
end
|
||||
|
||||
it 'records all changes' do
|
||||
described_class.call(submitter, ActionController::Parameters.new(params), request, user)
|
||||
|
||||
event = SubmissionEvent.last
|
||||
changes = event.data['changes']
|
||||
|
||||
expect(changes.size).to eq(2)
|
||||
expect(changes).to include(hash_including('field' => 'First Name', 'to' => 'Jane'))
|
||||
expect(changes).to include(hash_including('field' => 'Last Name', 'to' => 'Smith'))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Loading…
Reference in new issue