Files
sure/test/jobs/process_pdf_job_test.rb
2026-02-11 19:42:26 +01:00

101 lines
2.9 KiB
Ruby

require "test_helper"
class ProcessPdfJobTest < ActiveJob::TestCase
include ActionMailer::TestHelper
setup do
@import = imports(:pdf)
@family = @import.family
end
test "skips non-PdfImport imports" do
transaction_import = imports(:transaction)
ProcessPdfJob.perform_now(transaction_import)
assert_equal "pending", transaction_import.reload.status
end
test "skips if PDF not uploaded" do
assert_not @import.pdf_uploaded?
ProcessPdfJob.perform_now(@import)
assert_equal "pending", @import.reload.status
end
test "skips if already processed" do
processed_import = imports(:pdf_processed)
ProcessPdfJob.perform_now(processed_import)
# Should not change status since already complete
assert_equal "complete", processed_import.reload.status
end
test "uploads non-bank PDF to vector store with classified type metadata" do
pdf_content = attach_pdf!(@import)
process_result = Struct.new(:document_type).new("financial_document")
@import.expects(:process_with_ai).once.returns(process_result)
@import.stubs(:send_next_steps_email)
@import.expects(:extract_transactions).never
@family.expects(:upload_document).with do |file_content:, filename:, metadata:|
assert_equal pdf_content, file_content
assert_equal "sample_bank_statement.pdf", filename
assert_equal({ "type" => "financial_document" }, metadata)
true
end.returns(family_documents(:tax_return))
ProcessPdfJob.perform_now(@import)
assert_equal "complete", @import.reload.status
end
test "uploads bank statement PDF to vector store with classified type metadata" do
pdf_content = attach_pdf!(@import)
process_result = Struct.new(:document_type).new("bank_statement")
@import.expects(:process_with_ai).once.returns(process_result)
@import.expects(:extract_transactions).once do
@import.update!(
extracted_data: {
"transactions" => [
{
"date" => "2024-01-01",
"amount" => "10.00",
"name" => "Coffee Shop"
}
]
}
)
end
@import.expects(:sync_mappings).once
@import.stubs(:send_next_steps_email)
@family.expects(:upload_document).with do |file_content:, filename:, metadata:|
assert_equal pdf_content, file_content
assert_equal "sample_bank_statement.pdf", filename
assert_equal({ "type" => "bank_statement" }, metadata)
true
end.returns(family_documents(:tax_return))
ProcessPdfJob.perform_now(@import)
assert_equal "complete", @import.reload.status
end
private
def attach_pdf!(import)
pdf_content = file_fixture("imports/sample_bank_statement.pdf").binread
import.pdf_file.attach(
io: StringIO.new(pdf_content),
filename: "sample_bank_statement.pdf",
content_type: "application/pdf"
)
pdf_content
end
end