"""Tests for PaymentGroup handlers.""" from unittest.mock import call, patch from abacus_common_logic.marshalling.base import PaginationSchema from payment.models import Items from payment.schemas.payment_group import ( PaymentGroupDetailSchema, PaymentGroupListSchema, PaymentGroupPostResponseSchema, PaymentGroupPostSchema, PaymentGroupPutSchema, ) from tests.utils.factories import PaymentGroupFactory @patch('payment.logic.payment_group.create_payment_group') def test_create_payment_group(mock_logic, fixture_client, mocker): """Test POST /payment-group/ handler.""" post_body = { 'group_criteria': {'currency_codes': ['JPY']}, 'group_name': 'Payment Group Name', 'is_reusable': True, } mock_response = PaymentGroupFactory.build() mock_logic.return_value = mock_response spy_validation = mocker.spy(PaymentGroupPostSchema, 'load') spy_serialization = mocker.spy(PaymentGroupPostResponseSchema, 'dump') res = fixture_client.post('/payment-group/', json=post_body) assert res.status_code == 201 assert res.json == PaymentGroupPostResponseSchema().dump(mock_response) assert mock_logic.call_args_list == [call(**post_body)] assert spy_validation.called assert spy_serialization.called @patch('payment.logic.payment_group.create_payment_group') def test_create_payment_group_specific_account(mock_logic, fixture_client, mocker): """Gets POST /payment-group/ handler with specific account_id.""" post_body = { 'group_criteria': {'account_id': 123}, 'group_name': 'Payment Group Name', 'is_reusable': False, 'payment_name': 'Payment Group Payment Name', } mock_response = PaymentGroupFactory.build() mock_logic.return_value = mock_response spy_validation = mocker.spy(PaymentGroupPostSchema, 'load') spy_serialization = mocker.spy(PaymentGroupPostResponseSchema, 'dump') res = fixture_client.post('/payment-group/', json=post_body) assert res.status_code == 201 assert res.json == PaymentGroupPostResponseSchema().dump(mock_response) assert mock_logic.call_args_list == [call(**post_body)] assert spy_validation.called assert spy_serialization.called @patch('payment.logic.payment_group.get_reusable_payment_groups') def test_get_reusable_payment_groups(mock_logic, fixture_client, mocker): """Test GET /payment-group/reusable-groups/ handler.""" mock_response = Items([PaymentGroupFactory.build()], 1) mock_logic.return_value = mock_response spy_validation = mocker.spy(PaginationSchema, 'load') spy_serialization = mocker.spy(PaymentGroupListSchema, 'dump') res = fixture_client.get('/payment-group/reusable-groups/') assert res.status_code == 200 assert res.json == PaymentGroupListSchema().dump(mock_response) assert mock_logic.called assert spy_validation.called assert spy_serialization.called @patch('payment.logic.payment_group.update_payment_group') def test_update_payment_group(mock_logic, fixture_client, faker, mocker): """Test PUT /payment-group/ handler.""" obj_id = faker.pyint() put_body = { 'group_name': 'Payment Group Name', } mock_response = PaymentGroupFactory.build() mock_logic.return_value = mock_response spy_validation = mocker.spy(PaymentGroupPutSchema, 'load') spy_serialization = mocker.spy(PaymentGroupDetailSchema, 'dump') res = fixture_client.put(f'/payment-group/{obj_id}', json=put_body) assert res.status_code == 200 assert res.json == PaymentGroupDetailSchema().dump(mock_response) assert mock_logic.call_args_list == [call(obj_id, **put_body)] assert spy_validation.called assert spy_serialization.called @patch('payment.logic.payment_group.update_payment_group') def test_update_payment_group_reusable(mock_logic, fixture_client, faker, mocker): """Test PUT /payment-group/ handler.""" obj_id = faker.pyint() put_body = { 'is_reusable': False, } mock_response = PaymentGroupFactory.build() mock_logic.return_value = mock_response spy_validation = mocker.spy(PaymentGroupPutSchema, 'load') spy_serialization = mocker.spy(PaymentGroupDetailSchema, 'dump') res = fixture_client.put(f'/payment-group/{obj_id}', json=put_body) assert res.status_code == 200 assert res.json == PaymentGroupDetailSchema().dump(mock_response) assert mock_logic.call_args_list == [call(obj_id, **put_body)] assert spy_validation.called assert spy_serialization.called @patch('payment.logic.payment_group.get_payment_group') def test_get_payment_group(mock_logic, fixture_client, faker, mocker): """Test GET /payment-group/ handler.""" obj_id = faker.pyint() mock_response = PaymentGroupFactory.build() mock_logic.return_value = mock_response spy_serialization = mocker.spy(PaymentGroupDetailSchema, 'dump') res = fixture_client.get(f'/payment-group/{obj_id}') assert res.status_code == 200 assert res.json == PaymentGroupDetailSchema().dump(mock_response) assert mock_logic.call_args_list == [call(obj_id)] assert spy_serialization.called