Example #1
0
def test_routing_slip_link_attempt(client, jwt, app):
    """12033 - Scenario 3.

    Routing slip is Completed, attempt to be linked.
    Linking shouldn't be allowed and explaining that completed routing
    slip cannot be involved in linking.
    """
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_LINK.value, Role.FAS_SEARCH.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    child = get_routing_slip_request('438607657')
    parent1 = get_routing_slip_request('355336710')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(parent1), headers=headers)

    rs_model = RoutingSlip.find_by_number('438607657')
    rs_model.status = RoutingSlipStatus.COMPLETE.value
    rs_model.commit()

    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent1.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_IN_INVALID_STATUS'
    assert rv.status_code == 400

    # Try the reverse:
    data = {'childRoutingSlipNumber': f"{parent1.get('number')}", 'parentRoutingSlipNumber': f"{child.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_IN_INVALID_STATUS'
    assert rv.status_code == 400
Example #2
0
def test_create_routing_slips_invalid_number(client, jwt, app):
    """Assert that the rs number validation works."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_SEARCH.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    payload = get_routing_slip_request(number='123456')
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 400
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_SEARCH.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    payload = get_routing_slip_request(number='1234567891')
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 400
Example #3
0
def test_create_routing_slips_search_with_receipt(client, jwt, app):
    """Assert that the search works."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_SEARCH.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    payload = get_routing_slip_request(number='206380909')
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    receipt_number = payload.get('payments')[0].get('chequeReceiptNumber')
    # search with routing slip number works
    rv = client.post('/api/v1/fas/routing-slips/queries', data=json.dumps({'chequeReceiptNumber': receipt_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('payments')[0].get('chequeReceiptNumber') == receipt_number

    # search with routing slip number works
    rv = client.post('/api/v1/fas/routing-slips/queries', data=json.dumps({'receiptNumber': receipt_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 0

    # search with routing slip number works
    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'chequeReceiptNumber': receipt_number, 'receiptNumber': receipt_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 0

    # search with entity (accountName) works
    rv = client.post('/api/v1/fas/routing-slips/queries', data=json.dumps({'accountName': 'TEST'}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1

    payload = get_routing_slip_request(number='674038203',
                                       cheque_receipt_numbers=[('211001', PaymentMethod.CASH.value, 100)])

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201

    receipt_number = payload.get('payments')[0].get('chequeReceiptNumber')
    # search with routing slip number works
    rv = client.post('/api/v1/fas/routing-slips/queries', data=json.dumps({'receiptNumber': receipt_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('payments')[0].get('chequeReceiptNumber') == receipt_number
Example #4
0
def test_update_routing_slip_status(client, jwt, app):
    """Assert that the endpoint returns 200."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_EDIT.value, Role.FAS_VIEW.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(get_routing_slip_request()), headers=headers)
    rs_number = rv.json.get('number')

    rv = client.patch(f'/api/v1/fas/routing-slips/{rs_number}?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipStatus.COMPLETE.value}), headers=headers)
    assert rv.status_code == 400

    # Update to NSF and validate the total
    rv = client.patch(f'/api/v1/fas/routing-slips/{rs_number}?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipStatus.NSF.value}), headers=headers)
    assert rv.status_code == 200
    assert rv.json.get('status') == RoutingSlipStatus.NSF.value
    assert rv.json.get('remainingAmount') == 0

    # assert invalid action.
    rv = client.patch(f'/api/v1/fas/routing-slips/{rs_number}?action=TEST',
                      data=json.dumps({'status': RoutingSlipStatus.ACTIVE.value}), headers=headers)
    assert rv.status_code == 400

    # Assert invalid number
    rv = client.patch(f'/api/v1/fas/routing-slips/TEST?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipStatus.ACTIVE.value}), headers=headers)
    assert rv.status_code == 400
Example #5
0
def test_get_valid_comments(client, jwt):
    """Assert that the endpoint returns 200."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(get_routing_slip_request()), headers=headers)

    rs_number = rv.json.get('number')

    rv = client.post('/api/v1/fas/routing-slips/{}/comments'.format(rs_number),
                     data=json.dumps({'comment': 'test_1'}),
                     headers=headers)
    rv = client.post('/api/v1/fas/routing-slips/{}/comments'.format(rs_number),
                     data=json.dumps({'comment': 'test_2'}),
                     headers=headers)

    rv = client.get('/api/v1/fas/routing-slips/{}/comments'.format(rs_number), headers=headers)
    assert rv.status_code == 200
    items = rv.json.get('comments')
    assert len(items) == 2
    assert items[0].get('comment') == 'test_2'
    assert items[1].get('comment') == 'test_1'
    assert items[0].get('submitterDisplayName')
    assert items[1].get('submitterDisplayName')

    rv = client.get('/api/v1/fas/routing-slips/{}/comments'.format('invalid'), headers=headers)
    assert rv.json.get('type') == 'FAS_INVALID_ROUTING_SLIP_NUMBER'
    assert rv.status_code == 400
Example #6
0
def test_update_routing_slip_writeoff(client, jwt, app):
    """Assert that the endpoint returns 200."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_EDIT.value, Role.FAS_VIEW.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(get_routing_slip_request()), headers=headers)
    rs_number = rv.json.get('number')

    rv = client.patch(f'/api/v1/fas/routing-slips/{rs_number}?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipStatus.WRITE_OFF_REQUESTED.value}), headers=headers)
    assert rv.status_code == 200

    # Update to WRITEOFF_AUTHORIZED and assert 400, as it's a same token
    rv = client.patch(f'/api/v1/fas/routing-slips/{rs_number}?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipStatus.WRITE_OFF_AUTHORIZED.value}), headers=headers)
    assert rv.status_code == 400

    # Try CANCEL WRITE_OFF with a supervisor token and assert 200.
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_EDIT.value,
                                             Role.FAS_REFUND_APPROVER.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    rv = client.patch(f'/api/v1/fas/routing-slips/{rs_number}?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipCustomStatus.CANCEL_WRITE_OFF_REQUEST.custom_status}),
                      headers=headers)
    assert rv.status_code == 200
Example #7
0
def test_routing_slip_status_to_nsf_attempt(client, jwt, app):
    """12033 - Scenario 4.

    Routing slip in Completed,
    user attempts to move it into another status, can only set to NSF.
    """
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_LINK.value,
                                             Role.FAS_SEARCH.value, Role.FAS_EDIT.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    child = get_routing_slip_request('438607657')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)

    rs_model = RoutingSlip.find_by_number('438607657')
    rs_model.status = RoutingSlipStatus.COMPLETE.value
    rs_model.commit()

    # Active shouldn't work.
    rv = client.patch(f"/api/v1/fas/routing-slips/{child.get('number')}?action={PatchActions.UPDATE_STATUS.value}",
                      data=json.dumps({'status': RoutingSlipStatus.ACTIVE.value}), headers=headers)
    assert rv.status_code == 400

    # NSF should work.
    rv = client.patch(f"/api/v1/fas/routing-slips/{child.get('number')}?action={PatchActions.UPDATE_STATUS.value}",
                      data=json.dumps({'status': RoutingSlipStatus.NSF.value}), headers=headers)
    assert rv.status_code == 200, 'status changed successfully.'
Example #8
0
def test_refund_routing_slips_reject(client, jwt):
    """Assert refund works for routing slips."""
    payload = get_routing_slip_request()
    token = jwt.create_jwt(
        get_claims(
            roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value, Role.FAS_REFUND.value, Role.FAS_REFUND_APPROVER.value]),
        token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)

    rs_number = rv.json.get('number')
    rv = client.post('/api/v1/fas/routing-slips/{}/refunds'.format(rs_number),
                     data=json.dumps({'status': RoutingSlipStatus.REFUND_REQUESTED.value, }),
                     headers=headers)
    assert rv.json.get('message') == REFUND_SUCCESS_MESSAGES['ROUTINGSLIP.REFUND_REQUESTED']

    rv = client.post('/api/v1/fas/routing-slips/{}/refunds'.format(rs_number),
                     data=json.dumps({'status': RoutingSlipStatus.REFUND_REJECTED.value}),
                     headers=headers)
    assert rv.status_code == 202
    assert rv.json.get('message') == REFUND_SUCCESS_MESSAGES['ROUTINGSLIP.ACTIVE']

    rv = client.get('/api/v1/fas/routing-slips/{}'.format(rs_number), headers=headers)
    assert rv.status_code == 200
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
    assert rv.json.get('status') == RoutingSlipStatus.ACTIVE.value
    assert rv.json.get('refunds') is None
Example #9
0
def test_refund_routing_slips_zero_dollar_error(client, jwt):
    """Assert zero dollar refund fails."""
    payload = get_routing_slip_request(cheque_receipt_numbers=[('1234567890', PaymentMethod.CHEQUE.value, 0.00)])
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value, Role.FAS_REFUND.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
    rv = client.get('/api/v1/fas/routing-slips/{}'.format(rv.json.get('number')), headers=headers)
    assert rv.status_code == 200
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
    refund_details = {
        'mailingAddress': {
            'city': 'Gatineau',
            'country': 'CA',
            'region': 'QC',
            'postalCode': 'J8L 2K3',
            'street': 'E-412 Rue Charles',
            'streetAdditional': ''
        },
        'name': 'Staff user'
    }
    rs_number = rv.json.get('number')
    rv = client.post('/api/v1/fas/routing-slips/{}/refunds'.format(rs_number),
                     data=json.dumps({'status': RoutingSlipStatus.REFUND_REQUESTED.value, 'details': refund_details}),
                     headers=headers)
    assert rv.status_code == 400
Example #10
0
def test_refund_routing_slips(client, jwt):
    """Assert refund works for routing slips."""
    payload = get_routing_slip_request()
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value, Role.FAS_REFUND.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
    rv = client.get('/api/v1/fas/routing-slips/{}'.format(rv.json.get('number')), headers=headers)
    assert rv.status_code == 200
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
    refund_details = {
        'mailingAddress': {
            'city': 'Gatineau',
            'country': 'CA',
            'region': 'QC',
            'postalCode': 'J8L 2K3',
            'street': 'E-412 Rue Charles',
            'streetAdditional': ''
        },
        'name': 'Staff user'
    }
    rs_number = rv.json.get('number')
    rv = client.post('/api/v1/fas/routing-slips/{}/refunds'.format(rs_number),
                     data=json.dumps({'status': RoutingSlipStatus.REFUND_REQUESTED.value, 'details': refund_details}),
                     headers=headers)
    assert rv.status_code == 202
    assert rv.json.get('message') == REFUND_SUCCESS_MESSAGES['ROUTINGSLIP.REFUND_REQUESTED']

    rv = client.get('/api/v1/fas/routing-slips/{}'.format(rs_number), headers=headers)
    assert rv.json.get('status') == RoutingSlipStatus.REFUND_REQUESTED.value
    assert RoutingSlipStatus.REFUND_AUTHORIZED.value not in rv.json.get('allowedStatuses')
    refund = rv.json.get('refunds')[0]
    assert refund_details is not None
    assert refund_details.get('name') in refund.get('details').get('name')
    assert refund_details.get('mailingAddress') == refund.get('details').get('mailingAddress')

    rv = client.post('/api/v1/fas/routing-slips/{}/refunds'.format(rs_number),
                     data=json.dumps({'status': RoutingSlipStatus.REFUND_AUTHORIZED.value, 'details': refund_details}),
                     headers=headers)
    assert rv.status_code == 400

    token = jwt.create_jwt(
        get_claims(roles=[Role.FAS_SEARCH.value, Role.FAS_VIEW.value, Role.FAS_REFUND_APPROVER.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    rv = client.post('/api/v1/fas/routing-slips/{}/refunds'.format(rs_number),
                     data=json.dumps({'status': RoutingSlipStatus.REFUND_AUTHORIZED.value, 'details': refund_details}),
                     headers=headers)
    assert rv.status_code == 202
    assert rv.json.get('message') == REFUND_SUCCESS_MESSAGES['ROUTINGSLIP.REFUND_AUTHORIZED']

    rv = client.get('/api/v1/fas/routing-slips/{}'.format(rs_number), headers=headers)
    assert rv.status_code == 200
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
    assert rv.json.get('status') == RoutingSlipStatus.REFUND_AUTHORIZED.value
Example #11
0
def test_create_refund_with_existing_routing_slip(session, client, jwt, app,
                                                  stan_server):
    """Assert that the endpoint  returns 202."""
    claims = get_claims(roles=[
        Role.FAS_CREATE.value, Role.FAS_SEARCH.value, Role.FAS_REFUND.value,
        Role.STAFF.value, 'make_payment'
    ])
    token = jwt.create_jwt(claims, token_header)
    headers = {
        'Authorization': f'Bearer {token}',
        'content-type': 'application/json'
    }
    payload = get_routing_slip_request()
    routingslip_amount = payload.get('payments')[0].get('paidAmount')
    rv = client.post('/api/v1/fas/routing-slips',
                     data=json.dumps(payload),
                     headers=headers)
    rs_number = rv.json.get('number')

    headers = {
        'Authorization': f'Bearer {token}',
        'content-type': 'application/json'
    }
    data = get_payment_request()
    data['accountInfo'] = {'routingSlip': rs_number}

    rv = client.post('/api/v1/payment-requests',
                     data=json.dumps(data),
                     headers=headers)
    inv_id = rv.json.get('id')
    total = rv.json.get('total')
    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': rs_number}),
                     headers=headers)
    items = rv.json.get('items')

    inv: InvoiceModel = InvoiceModel.find_by_id(inv_id)
    inv.invoice_status_code = InvoiceStatus.PAID.value
    inv.save()

    assert items[0].get('remainingAmount') == payload.get('payments')[0].get(
        'paidAmount') - total

    rv = client.post(f'/api/v1/payment-requests/{inv_id}/refunds',
                     data=json.dumps({'reason': 'Test'}),
                     headers=headers)
    assert rv.status_code == 202
    assert rv.json.get(
        'message') == REFUND_SUCCESS_MESSAGES['INTERNAL.REFUND_REQUESTED']

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': rs_number}),
                     headers=headers)
    # asssert refund amount goes to routing slip back
    assert rv.json.get('items')[0].get('remainingAmount') == routingslip_amount
Example #12
0
def test_create_comment_with_invalid_body_request(client, jwt):
    """Assert that the endpoint returns 201."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(get_routing_slip_request()), headers=headers)

    rv = client.post('/api/v1/fas/routing-slips/{}/comments'.format('invalid_routing_slip_number'),
                     data=json.dumps({'comment_invalid': 'test'}),
                     headers=headers)
    assert rv.json.get('type') == 'INVALID_REQUEST'
    assert rv.status_code == 400
Example #13
0
def test_link_nsf(client, jwt):
    """Assert linking to a child fails."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_LINK.value,
                                             Role.FAS_SEARCH.value, Role.FAS_EDIT.value]),
                           token_header)

    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    child = get_routing_slip_request('206380842')
    parent = get_routing_slip_request('206380867')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(parent), headers=headers)

    rv = client.patch(f"/api/v1/fas/routing-slips/{child.get('number')}?action={PatchActions.UPDATE_STATUS.value}",
                      data=json.dumps({'status': RoutingSlipStatus.NSF.value}), headers=headers)
    assert rv.status_code == 200, 'status changed successfully.'

    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.status_code == 400
    assert rv.json.get('type') == 'RS_CANT_LINK_NSF'
    assert rv.json.get('title') == 'Routing Slip cannot be linked.'
Example #14
0
def test_create_comment_with_valid_comment_bcrs_schema(client, jwt):
    """Assert that the endpoint returns 201 for valid comment schema."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(get_routing_slip_request()), headers=headers)
    assert rv.status_code == 201
    assert schema_utils.validate(rv.json, 'routing_slip')[0]

    rv = client.post('/api/v1/fas/routing-slips/{}/comments'.format(rv.json.get('number')),
                     data=json.dumps({'comment': {'businessId': 'test', 'comment': 'test'}}),
                     headers=headers)
    assert rv.status_code == 201
    assert rv.json.get('submitterDisplayName')
Example #15
0
def test_link_routing_slip_invalid_status(client, jwt, app):
    """Assert that the linking of routing slip works as expected."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_LINK.value,
                                             Role.FAS_SEARCH.value, Role.FAS_REFUND.value,
                                             Role.FAS_EDIT.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    child = get_routing_slip_request('206380859')
    parent = get_routing_slip_request('206380909')
    child1 = get_routing_slip_request('206380883')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(parent), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child1), headers=headers)

    rv = client.get(f"/api/v1/fas/routing-slips/{child.get('number')}/links", headers=headers)
    assert rv.json.get('parent') is None

    rv = client.patch(f"/api/v1/fas/routing-slips/{child.get('number')}?action={PatchActions.UPDATE_STATUS.value}",
                      data=json.dumps({'status': RoutingSlipStatus.WRITE_OFF_REQUESTED.value}), headers=headers)
    assert rv.status_code == 200, 'status changed successfully.'

    # link them together ,success cases
    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.status_code == 400
    assert rv.json.get('type') == 'RS_IN_INVALID_STATUS', 'child is invalid.'

    rv = client.patch(f"/api/v1/fas/routing-slips/{parent.get('number')}?action={PatchActions.UPDATE_STATUS.value}",
                      data=json.dumps({'status': RoutingSlipStatus.WRITE_OFF_REQUESTED.value}), headers=headers)
    assert rv.status_code == 200, 'status changed successfully.'

    # link them together ,success cases
    data = {'childRoutingSlipNumber': f"{child1.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.status_code == 400
    assert rv.json.get('type') == 'RS_IN_INVALID_STATUS', 'parent is invalid.'
Example #16
0
def test_link_routing_slip_parent_is_a_child(client, jwt):
    """Assert linking to a child fails."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_LINK.value, Role.FAS_SEARCH.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    child = get_routing_slip_request('206380842')
    parent1 = get_routing_slip_request('206380867')
    parent2 = get_routing_slip_request('206380891')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(parent1), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(parent2), headers=headers)

    # link parent 1 to parent 2

    data = {'childRoutingSlipNumber': f"{parent1.get('number')}", 'parentRoutingSlipNumber': f"{parent2.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('status') == 'LINKED'

    # now link child to parent

    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent1.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_PARENT_ALREADY_LINKED'
    assert rv.status_code == 400
Example #17
0
def test_routing_slips_for_errors(client, jwt, payload):
    """Assert that the endpoint returns 401 for users with no fas_editor role."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    # Create a duplicate and assert error.
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 400
    # Try a routing slip with payment methods mix and match with a new routing slip number
    payload = get_routing_slip_request(number='TEST',
                                       cheque_receipt_numbers=[('0001', PaymentMethod.CASH.value, 100),
                                                               ('0002', PaymentMethod.CHEQUE.value, 100)])
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 400

    # Get a routing slip which doesn't exist and assert 204
    rv = client.get('/api/v1/fas/routing-slips/206380891', headers=headers)
    assert rv.status_code == 204
Example #18
0
import pytest
from flask import current_app
from faker import Faker

from pay_api.models import PaymentAccount, RoutingSlip
from pay_api.schemas import utils as schema_utils
from pay_api.utils.constants import DT_SHORT_FORMAT
from pay_api.services.fas.routing_slip_status_transition_service import RoutingSlipStatusTransitionService
from pay_api.utils.enums import PatchActions, PaymentMethod, Role, RoutingSlipCustomStatus, RoutingSlipStatus
from tests.utilities.base_test import factory_invoice, get_claims, get_routing_slip_request, token_header

fake = Faker()


@pytest.mark.parametrize('payload', [
    get_routing_slip_request(number='206380792'),
    get_routing_slip_request(
        cheque_receipt_numbers=[('0001', PaymentMethod.CHEQUE.value, 100),
                                ('0002', PaymentMethod.CHEQUE.value, 100),
                                ('0003', PaymentMethod.CHEQUE.value, 100)
                                ]),
    get_routing_slip_request(cheque_receipt_numbers=[('0001', PaymentMethod.CASH.value, 2000)])
])
def test_create_routing_slips(client, jwt, payload):
    """Assert that the endpoint returns 200."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_VIEW.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}

    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    assert schema_utils.validate(rv.json, 'routing_slip')[0]
Example #19
0
def test_link_routing_slip(client, jwt, app):
    """Assert that the linking of routing slip works as expected."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_LINK.value,
                                             Role.FAS_SEARCH.value, Role.FAS_EDIT.value]),
                           token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    child = get_routing_slip_request('206380834')
    parent = get_routing_slip_request('206380867')
    paid_amount_child = child.get('payments')[0].get('paidAmount')
    paid_amount_parent = parent.get('payments')[0].get('paidAmount')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)
    client.post('/api/v1/fas/routing-slips', data=json.dumps(parent), headers=headers)

    rv = client.get(f"/api/v1/fas/routing-slips/{child.get('number')}/links", headers=headers)
    assert rv.json.get('parent') is None

    # attempt to link NSF, should fail
    nsf = get_routing_slip_request('933458069')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(nsf), headers=headers)
    rv = client.patch(f'/api/v1/fas/routing-slips/{nsf.get("number")}?action={PatchActions.UPDATE_STATUS.value}',
                      data=json.dumps({'status': RoutingSlipStatus.NSF.value}), headers=headers)

    data = {'childRoutingSlipNumber': f"{nsf.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_CANT_LINK_NSF'
    assert rv.status_code == 400

    # link them together ,success cases
    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('status') == 'LINKED'
    assert rv.json.get('remainingAmount') == 0
    assert rv.json.get('total') == paid_amount_child

    rv = client.get(f"/api/v1/fas/routing-slips/{child.get('number')}/links", headers=headers)
    assert rv.json.get('parent') is not None
    assert rv.json.get('parent').get('number') == parent.get('number')
    assert rv.json.get('parent').get('remainingAmount') == paid_amount_child + \
        paid_amount_parent
    assert rv.json.get('parent').get('total') == paid_amount_parent

    rv = client.get(f"/api/v1/fas/routing-slips/{parent.get('number')}/links", headers=headers)
    assert len(rv.json.get('children')) == 1
    assert rv.json.get('children')[0].get('number') == child.get('number')

    # assert errors
    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_ALREADY_LINKED'
    assert rv.status_code == 400

    # assert errors
    data = {'childRoutingSlipNumber': f"{parent.get('number')}", 'parentRoutingSlipNumber': f"{child.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_ALREADY_A_PARENT'
    assert rv.status_code == 400

    # assert transactions
    child = get_routing_slip_request(number='206380859')
    parent = get_routing_slip_request(number='206380891')
    rv1 = client.post('/api/v1/fas/routing-slips', data=json.dumps(child), headers=headers)
    rv2 = client.post('/api/v1/fas/routing-slips', data=json.dumps(parent), headers=headers)
    payment_account_id = rv1.json.get('paymentAccount').get('id')
    payment_account = PaymentAccount(id=payment_account_id)
    folio_number = 'test_folio'
    invoice = factory_invoice(payment_account, folio_number=folio_number, routing_slip=rv1.json.get('number'),
                              payment_method_code=PaymentMethod.INTERNAL.value)
    invoice.save()
    # assert errors
    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_CHILD_HAS_TRANSACTIONS'
    assert rv.status_code == 400

    payment_account_id = rv2.json.get('paymentAccount').get('id')
    payment_account = PaymentAccount(id=payment_account_id)
    invoice2 = factory_invoice(payment_account, folio_number=folio_number, routing_slip=rv2.json.get('number'),
                               payment_method_code=PaymentMethod.INTERNAL.value)
    invoice2.save()
    data = {'childRoutingSlipNumber': f"{child.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_CHILD_HAS_TRANSACTIONS'
    assert rv.status_code == 400

    child1 = get_routing_slip_request(number='206380842')
    client.post('/api/v1/fas/routing-slips', data=json.dumps(child1), headers=headers)

    data = {'childRoutingSlipNumber': f"{child1.get('number')}", 'parentRoutingSlipNumber': f"{child1.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.json.get('type') == 'RS_CANT_LINK_TO_SAME'
    assert rv.status_code == 400

    # parent record can have transactions
    payment_account_id = rv2.json.get('paymentAccount').get('id')
    payment_account = PaymentAccount(id=payment_account_id)
    invoice2 = factory_invoice(payment_account, folio_number=folio_number, routing_slip=rv2.json.get('number'),
                               payment_method_code=PaymentMethod.INTERNAL.value)
    invoice2.save()
    data = {'childRoutingSlipNumber': f"{child1.get('number')}", 'parentRoutingSlipNumber': f"{parent.get('number')}"}
    rv = client.post('/api/v1/fas/routing-slips/links', data=json.dumps(data), headers=headers)
    assert rv.status_code == 200, 'parent can have transactions'
Example #20
0
def test_create_routing_slips_search(client, jwt, app):
    """Assert that the search works."""
    claims = get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_SEARCH.value])
    token = jwt.create_jwt(claims, token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    payload = get_routing_slip_request(number='206380800')
    initiator = claims.get('name')
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    rs_number = rv.json.get('number')
    # do the searches

    # search with routing slip number works
    rv = client.post('/api/v1/fas/routing-slips/queries', data=json.dumps({'routingSlipNumber': rs_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('number') == rs_number

    # search with partial routing slip number works

    rv = client.post('/api/v1/fas/routing-slips/queries', data=json.dumps({'routingSlipNumber': rs_number[1:-1]}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('number') == rs_number

    # search with initiator

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': rs_number, 'initiator': initiator}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('number') == rs_number

    # search with dates

    valid_date_filter = {'startDate': (date.today() - timedelta(1)).strftime(DT_SHORT_FORMAT),
                         'endDate': (date.today() + timedelta(1)).strftime(DT_SHORT_FORMAT)}
    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': rs_number, 'dateFilter': valid_date_filter}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('number') == rs_number

    invalid_date_filter = {'startDate': (date.today() + timedelta(100)).strftime(DT_SHORT_FORMAT),
                           'endDate': (date.today() + timedelta(1)).strftime(DT_SHORT_FORMAT)}
    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': rs_number, 'dateFilter': invalid_date_filter}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 0

    # search using status
    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'status': 'ACTIVE'}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1
    assert items[0].get('number') == rs_number

    # search using invalid status
    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'status': 'COMPLETED'}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 0
Example #21
0
def test_create_routing_slips_search_with_folio_number(client, jwt, app):
    """Assert that the search works."""
    token = jwt.create_jwt(get_claims(roles=[Role.FAS_CREATE.value, Role.FAS_SEARCH.value]), token_header)
    headers = {'Authorization': f'Bearer {token}', 'content-type': 'application/json'}
    payload = get_routing_slip_request(number='206380792')
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    payment_account_id = rv.json.get('paymentAccount').get('id')
    payment_account = PaymentAccount(id=payment_account_id)
    folio_number = 'test_folio'
    invoice = factory_invoice(payment_account, folio_number=folio_number, routing_slip=rv.json.get('number'),
                              payment_method_code=PaymentMethod.INTERNAL.value)
    invoice.save()

    # search with routing slip number works

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': rv.json.get('number'), 'folioNumber': folio_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1, 'folio and routing slip combo works.'

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'folioNumber': folio_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1, 'folio alone works.'

    # create another routing slip with folo

    payload = get_routing_slip_request(number='206380867')
    rv = client.post('/api/v1/fas/routing-slips', data=json.dumps(payload), headers=headers)
    assert rv.status_code == 201
    payment_account_id = rv.json.get('paymentAccount').get('id')
    payment_account = PaymentAccount(id=payment_account_id)
    routing_slip_numbr = rv.json.get('number')
    invoice = factory_invoice(payment_account, folio_number=folio_number, routing_slip=routing_slip_numbr,
                              payment_method_code=PaymentMethod.INTERNAL.value)
    invoice.save()

    invoice = factory_invoice(payment_account, folio_number=folio_number, routing_slip=rv.json.get('number'),
                              payment_method_code=PaymentMethod.INTERNAL.value)
    invoice.save()

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'folioNumber': folio_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 2, 'folio alone works.'

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': routing_slip_numbr, 'folioNumber': folio_number}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1, 'folio and rs fetches only 1.'
    assert len(items[0].get('invoices')) == 2, 'fetches all the folios. UI wil filter it out'

    rv = client.post('/api/v1/fas/routing-slips/queries',
                     data=json.dumps({'routingSlipNumber': routing_slip_numbr}),
                     headers=headers)

    items = rv.json.get('items')
    assert len(items) == 1, 'folio and rs fetches only 1.'
    assert len(items[0].get('invoices')) == 2, 'folio alone works.'