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.
248 lines
7.6 KiB
248 lines
7.6 KiB
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe 'Submission API', type: :request do
|
|
let!(:account) { create(:account) }
|
|
let!(:author) { create(:user, account:) }
|
|
let!(:folder) { create(:template_folder, account:) }
|
|
let!(:templates) { create_list(:template, 2, account:, author:, folder:) }
|
|
|
|
describe 'GET /api/submissions' do
|
|
it 'returns a list of submissions' do
|
|
submissions = [
|
|
create(:submission, :with_submitters,
|
|
template: templates[0],
|
|
created_by_user: author),
|
|
create(:submission, :with_submitters,
|
|
template: templates[1],
|
|
created_by_user: author)
|
|
].reverse
|
|
|
|
get '/api/submissions', headers: { 'x-auth-token': author.access_token.token }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body['pagination']).to eq(JSON.parse({
|
|
count: submissions.size,
|
|
next: submissions.last.id,
|
|
prev: submissions.first.id
|
|
}.to_json))
|
|
expect(response.parsed_body['data']).to eq(JSON.parse(submissions.map { |t| index_submission_body(t) }.to_json))
|
|
end
|
|
end
|
|
|
|
describe 'GET /api/submissions/:id' do
|
|
it 'returns a submission' do
|
|
submission = create(:submission, :with_submitters, :with_events, template: templates[0], created_by_user: author)
|
|
|
|
get "/api/submissions/#{submission.id}", headers: { 'x-auth-token': author.access_token.token }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
expect(response.parsed_body).to eq(JSON.parse(show_submission_body(submission).to_json))
|
|
end
|
|
end
|
|
|
|
describe 'POST /api/submissions' do
|
|
it 'creates a submission' do
|
|
post '/api/submissions', headers: { 'x-auth-token': author.access_token.token }, params: {
|
|
template_id: templates[0].id,
|
|
send_email: true,
|
|
submitters: [{ role: 'First Role', email: 'john.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))
|
|
end
|
|
end
|
|
|
|
describe 'POST /api/submissions/emails' do
|
|
it 'creates a submission using email' do
|
|
post '/api/submissions', headers: { 'x-auth-token': author.access_token.token }, params: {
|
|
template_id: templates[0].id,
|
|
emails: 'john.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))
|
|
end
|
|
end
|
|
|
|
describe 'DELETE /api/submissions/:id' do
|
|
it 'archives a submission' do
|
|
submission = create(:submission, :with_submitters, template: templates[0], created_by_user: author)
|
|
|
|
delete "/api/submissions/#{submission.id}", headers: { 'x-auth-token': author.access_token.token }
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
|
|
submission.reload
|
|
|
|
expect(submission.archived_at).not_to be_nil
|
|
expect(response.parsed_body).to eq(JSON.parse({
|
|
id: submission.id,
|
|
archived_at: submission.archived_at
|
|
}.to_json))
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def index_submission_body(submission)
|
|
submitters = submission.submitters.map do |submitter|
|
|
{
|
|
id: submitter.id,
|
|
submission_id: submission.id,
|
|
uuid: submitter.uuid,
|
|
email: submitter.email,
|
|
slug: submitter.slug,
|
|
sent_at: submitter.sent_at,
|
|
opened_at: submitter.opened_at,
|
|
completed_at: submitter.completed_at,
|
|
declined_at: nil,
|
|
created_at: submitter.created_at,
|
|
updated_at: submitter.updated_at,
|
|
name: submitter.name,
|
|
phone: submitter.phone,
|
|
status: submitter.status,
|
|
role: submitter.template.submitters.find { |s| s['uuid'] == submitter.uuid }['name'],
|
|
external_id: nil,
|
|
application_key: nil, # Backward compatibility
|
|
metadata: {},
|
|
preferences: {}
|
|
}
|
|
end
|
|
|
|
{
|
|
id: submission.id,
|
|
source: 'link',
|
|
submitters_order: 'random',
|
|
slug: submission.slug,
|
|
audit_log_url: nil,
|
|
combined_document_url: nil,
|
|
expire_at: nil,
|
|
completed_at: nil,
|
|
created_at: submission.created_at,
|
|
updated_at: submission.updated_at,
|
|
archived_at: nil,
|
|
status: 'pending',
|
|
submitters:,
|
|
template: {
|
|
id: submission.template.id,
|
|
name: submission.template.name,
|
|
external_id: nil,
|
|
folder_name: folder.name,
|
|
created_at: submission.template.created_at,
|
|
updated_at: submission.template.updated_at
|
|
},
|
|
created_by_user: {
|
|
id: author.id,
|
|
first_name: author.first_name,
|
|
last_name: author.last_name,
|
|
email: author.email
|
|
}
|
|
}
|
|
end
|
|
|
|
def show_submission_body(submission)
|
|
submitters = submission.submitters.map do |submitter|
|
|
{
|
|
id: submitter.id,
|
|
submission_id: submission.id,
|
|
uuid: submitter.uuid,
|
|
email: submitter.email,
|
|
slug: submitter.slug,
|
|
sent_at: submitter.sent_at,
|
|
opened_at: submitter.opened_at,
|
|
completed_at: submitter.completed_at,
|
|
declined_at: nil,
|
|
created_at: submitter.created_at,
|
|
updated_at: submitter.updated_at,
|
|
name: submitter.name,
|
|
phone: submitter.phone,
|
|
status: submitter.status,
|
|
external_id: nil,
|
|
application_key: nil, # Backward compatibility
|
|
metadata: {},
|
|
preferences: {},
|
|
role: submitter.template.submitters.find { |s| s['uuid'] == submitter.uuid }['name'],
|
|
documents: [],
|
|
values: []
|
|
}
|
|
end
|
|
|
|
{
|
|
id: submission.id,
|
|
source: 'link',
|
|
status: 'pending',
|
|
submitters_order: 'random',
|
|
slug: submission.slug,
|
|
audit_log_url: nil,
|
|
combined_document_url: nil,
|
|
expire_at: nil,
|
|
completed_at: nil,
|
|
created_at: submission.created_at,
|
|
updated_at: submission.updated_at,
|
|
archived_at: nil,
|
|
submitters:,
|
|
template: {
|
|
id: submission.template.id,
|
|
name: submission.template.name,
|
|
external_id: nil,
|
|
folder_name: folder.name,
|
|
created_at: submission.template.created_at,
|
|
updated_at: submission.template.updated_at
|
|
},
|
|
created_by_user: {
|
|
id: author.id,
|
|
first_name: author.first_name,
|
|
last_name: author.last_name,
|
|
email: author.email
|
|
},
|
|
documents: [],
|
|
submission_events: submission.submission_events.map do |event|
|
|
{
|
|
id: event.id,
|
|
submitter_id: event.submitter_id,
|
|
event_type: event.event_type,
|
|
event_timestamp: event.event_timestamp,
|
|
data: event.data.slice(:reason)
|
|
}
|
|
end
|
|
}
|
|
end
|
|
|
|
def create_submission_body(submission)
|
|
submission.submitters.map do |submitter|
|
|
{
|
|
id: submitter.id,
|
|
submission_id: submission.id,
|
|
uuid: submitter.uuid,
|
|
email: submitter.email,
|
|
slug: submitter.slug,
|
|
sent_at: submitter.sent_at,
|
|
opened_at: submitter.opened_at,
|
|
completed_at: submitter.completed_at,
|
|
declined_at: nil,
|
|
created_at: submitter.created_at,
|
|
updated_at: submitter.updated_at,
|
|
name: submitter.name,
|
|
phone: submitter.phone,
|
|
status: submitter.status,
|
|
external_id: nil,
|
|
application_key: nil, # Backward compatibility
|
|
metadata: {},
|
|
preferences: { send_email: true, send_sms: false },
|
|
role: submitter.template.submitters.find { |s| s['uuid'] == submitter.uuid }['name'],
|
|
embed_src: "#{Docuseal::DEFAULT_APP_URL}/s/#{submitter.slug}",
|
|
values: []
|
|
}
|
|
end
|
|
end
|
|
end
|