From f88c69532c646bec7ece6dc608c1a9f698a6b150 Mon Sep 17 00:00:00 2001 From: marcoagonzales007 Date: Thu, 11 Jun 2026 09:46:34 -0700 Subject: [PATCH 1/2] Add unit tests for PISpecificInvoice --- .../unit/invoices/test_pi_specific_invoice.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/process_report/tests/unit/invoices/test_pi_specific_invoice.py b/process_report/tests/unit/invoices/test_pi_specific_invoice.py index a161ef4d..43882a46 100644 --- a/process_report/tests/unit/invoices/test_pi_specific_invoice.py +++ b/process_report/tests/unit/invoices/test_pi_specific_invoice.py @@ -187,3 +187,65 @@ def test_process_no_warnings( ): pi_inv.process() pi_inv.export() + + @mock.patch("process_report.invoices.invoice.Invoice._filter_columns") + @mock.patch("os.path.exists") + @mock.patch("subprocess.run") + def test_export_missing_pi( + self, mock_subprocess_run, mock_path_exists, mock_filter_cols + ): + invoice_month = "2025-01" + test_invoice = self._get_test_invoice( + pi=[None, "PI1"], + institution=["", "BU"], + balance=[0, 100], + ) + mock_path_exists.return_value = True + mock_filter_cols.return_value = test_invoice + with tempfile.TemporaryDirectory() as test_dir: + pi_inv = test_utils.new_pi_specific_invoice( + test_dir, invoice_month, data=test_invoice + ) + pi_inv.process() + pi_inv.export() + assert mock_subprocess_run.call_count == 1 + + @mock.patch("process_report.invoices.invoice.Invoice._filter_columns") + @mock.patch("os.path.exists") + @mock.patch("subprocess.run") + def test_export_no_chrome( + self, mock_subprocess_run, mock_path_exists, mock_filter_cols + ): + invoice_month = "2025-01" + test_invoice = self._get_test_invoice( + pi=[None, "PI1"], + institution=["", "BU"], + balance=[0, 100], + ) + mock_path_exists.return_value = False + mock_filter_cols.return_value = test_invoice + with tempfile.TemporaryDirectory() as test_dir: + pi_inv = test_utils.new_pi_specific_invoice( + test_dir, invoice_month, data=test_invoice + ) + pi_inv.process() + with self.assertRaises(SystemExit): + pi_inv.export() + + @mock.patch("process_report.util.get_iso8601_time") + @mock.patch("os.listdir") + def test_export_s3(self, mock_listdir, mock_get_time): + mock_get_time.return_value = "2025-01-01" + mock_listdir.return_value = ["BU_PI1_2025-01.pdf"] + s3_bucket = mock.MagicMock() + invoice_month = "2025-01" + test_invoice = self._get_test_invoice( + pi=["PI1"], + institution=["BU"], + balance=[100], + ) + pi_inv = test_utils.new_pi_specific_invoice( + "test_dir", invoice_month, data=test_invoice + ) + pi_inv.export_s3(s3_bucket) + assert s3_bucket.upload_file.call_count == 2 From db2ce69b23d95f7652ce971a2dc17992b38c3348 Mon Sep 17 00:00:00 2001 From: marcoagonzales007 Date: Sat, 13 Jun 2026 19:38:24 -0700 Subject: [PATCH 2/2] Address PR feedback for PISpecificInvoice tests --- .../unit/invoices/test_pi_specific_invoice.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/process_report/tests/unit/invoices/test_pi_specific_invoice.py b/process_report/tests/unit/invoices/test_pi_specific_invoice.py index 43882a46..294aba04 100644 --- a/process_report/tests/unit/invoices/test_pi_specific_invoice.py +++ b/process_report/tests/unit/invoices/test_pi_specific_invoice.py @@ -196,6 +196,7 @@ def test_export_missing_pi( ): invoice_month = "2025-01" test_invoice = self._get_test_invoice( + # First row has no PI and so should be skipped during export pi=[None, "PI1"], institution=["", "BU"], balance=[0, 100], @@ -239,13 +240,14 @@ def test_export_s3(self, mock_listdir, mock_get_time): mock_listdir.return_value = ["BU_PI1_2025-01.pdf"] s3_bucket = mock.MagicMock() invoice_month = "2025-01" - test_invoice = self._get_test_invoice( - pi=["PI1"], - institution=["BU"], - balance=[100], - ) - pi_inv = test_utils.new_pi_specific_invoice( - "test_dir", invoice_month, data=test_invoice - ) + + pi_inv = test_utils.new_pi_specific_invoice("test_dir", invoice_month) pi_inv.export_s3(s3_bucket) + expected_path = "test_dir/BU_PI1_2025-01.pdf" + expected_s3_archive_path = ( + "Invoices/2025-01/Archive/test_dir/BU_PI1_2025-01 2025-01-01.pdf" + ) + expected_s3_path = "Invoices/2025-01/test_dir/BU_PI1_2025-01.pdf" + s3_bucket.upload_file.assert_any_call(expected_path, expected_s3_archive_path) + s3_bucket.upload_file.assert_any_call(expected_path, expected_s3_path) assert s3_bucket.upload_file.call_count == 2