"""Functional tests for report_payment_group_payment.""" from unittest.mock import patch from moto import mock_aws from payment.constants.constants import REPORT_TYPE from tests.conftest import TestConfig from tests.utils.factories import ( PaymentGroupPaymentFactory, ReportPaymentGroupPaymentFactory, ) def test_create_or_update_report_create_success(fixture_client): """PUT /payment-group-payment//report create success.""" payment_group_payment = PaymentGroupPaymentFactory.create() payment_group_payment_id = payment_group_payment.payment_group_payment_id put_body = { 'report_export_url': 's3://abacus-payments/1-payment-name/approval/approve.pdf', 'report_type': REPORT_TYPE.APPROVAL, } res = fixture_client.put( f'/payment-group-payment/{payment_group_payment_id}/report', json=put_body ) assert res.status_code == 201 assert res.json.get('report_payment_group_payment_id') assert res.json.get('payment_group_payment_id') == payment_group_payment_id assert res.json.get('report_export_url') == put_body.get('report_export_url') assert res.json.get('report_type') == put_body.get('report_type') assert payment_group_payment.reports def test_create_or_update_report_update_success(fixture_client): """PUT /payment-group-payment//report update success.""" report = ReportPaymentGroupPaymentFactory.create() payment_group_payment_id = report.payment_group_payment_id put_body = { 'report_export_url': 's3://abacus-payments/1-payment-name/summary/new.tsv', 'report_type': REPORT_TYPE.SUMMARY, } assert not report.report_export_url == put_body.get('report_export_url') res = fixture_client.put( f'/payment-group-payment/{payment_group_payment_id}/report', json=put_body ) assert res.status_code == 200 assert res.json.get('payment_group_payment_id') == payment_group_payment_id assert res.json.get('report_export_url') == put_body.get('report_export_url') assert res.json.get('report_type') == put_body.get('report_type') assert ( res.json.get('report_payment_group_payment_id') == report.report_payment_group_payment_id ) def test_create_or_update_report_invalid_report_type(fixture_client): """PUT /payment-group-payment//report create error.""" payment_group_payment = PaymentGroupPaymentFactory.create() payment_group_payment_id = payment_group_payment.payment_group_payment_id put_body = { 'report_export_url': 's3://abacus-payments/1-payment-name/approval/approve.pdf', 'report_type': 'not_a_report_type', } res = fixture_client.put( f'/payment-group-payment/{payment_group_payment_id}/report', json=put_body ) assert res.status_code == 400 assert res.json.get('code') == 'error' assert res.json.get('message').get('json').get('report_type') @mock_aws def test_download_report(fixture_client): """GET /report-payment-group-payment//download.""" report = ReportPaymentGroupPaymentFactory.create() report_id = report.report_payment_group_payment_id res = fixture_client.get(f'/report-payment-group-payment/{report_id}/download') assert res.status_code == 200 assert res.json.get('download_url').startswith( f'https://{TestConfig.S3_PAYMENTS_BUCKET_NAME}.s3.amazonaws.com' ) @mock_aws @patch('payment.models.report_payment_group_payment.s3') def test_get_reports_by_payment_group_payment(mock_s3_connector, fixture_client): """GET /payment-group-payment//reports.""" payment_group_payment = PaymentGroupPaymentFactory.create() payment_group_payment_id = payment_group_payment.payment_group_payment_id reports = [] for report_type in REPORT_TYPE: report = ReportPaymentGroupPaymentFactory.create( payment_group_payment=payment_group_payment, report_type=report_type ) reports.append(report) mock_s3_connector.get_object_metadata_by_s3_url.return_value = { 'Metadata': {'original_filename': 'fancy.pdf'} } res = fixture_client.get( f'/payment-group-payment/{payment_group_payment_id}/reports' ) assert res.status_code == 200 assert len(res.json) == len(reports) assert all(report.get('report_payment_group_payment_id') for report in res.json) assert all(report.get('report_export_url') for report in res.json) assert all(report.get('report_type') in REPORT_TYPE for report in res.json) assert all( report.get('payment_group_payment_id') == payment_group_payment_id for report in res.json ) approval_report = [ report for report in res.json if report['report_type'] == REPORT_TYPE.APPROVAL ][0] assert approval_report['original_filename'] == 'fancy.pdf' def test_get_reports_by_id(fixture_client): """GET /report-payment-group-payment/.""" report = ReportPaymentGroupPaymentFactory.create() report_id = report.report_payment_group_payment_id res = fixture_client.get(f'/report-payment-group-payment/{report_id}') assert res.status_code == 200 assert ( res.json.get('report_payment_group_payment_id') == report.report_payment_group_payment_id ) assert res.json.get('payment_group_payment_id') == report.payment_group_payment_id assert res.json.get('report_type') == report.report_type assert res.json.get('report_export_url') == report.report_export_url def test_delete_report_payment_group_payment(fixture_client): """DELETE /report-payment-group-payment/.""" report = ReportPaymentGroupPaymentFactory.create() report_id = report.report_payment_group_payment_id res = fixture_client.delete(f'/report-payment-group-payment/{report_id}') assert res.status_code == 204