From 27af885013a98743f2faae4993136d0e6e005879 Mon Sep 17 00:00:00 2001 From: Haider Ali Date: Sun, 5 Jul 2020 16:18:01 +0530 Subject: [PATCH 1/6] Fail order transition to pending if incomplete attendee info --- app/api/orders.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/api/orders.py b/app/api/orders.py index 9e4cd83227..162a2a2d50 100644 --- a/app/api/orders.py +++ b/app/api/orders.py @@ -12,6 +12,7 @@ from marshmallow_jsonapi.flask import Schema from app.api.bootstrap import api +from app.api.helpers.custom_forms import validate_custom_form_constraints_request from app.api.data_layers.ChargesLayer import ChargesLayer from app.api.helpers.db import safe_query, safe_query_by_id, safe_query_kwargs, save_to_db from app.api.helpers.errors import ( @@ -46,6 +47,7 @@ from app.api.helpers.ticketing import validate_discount_code, validate_ticket_holders from app.api.helpers.utilities import dasherize, require_relationship from app.api.schema.orders import OrderSchema +from app.api.schema.attendees import AttendeeSchema from app.models import db from app.models.order import Order, OrderTicket, get_updatable_fields from app.models.ticket_holder import TicketHolder @@ -379,6 +381,13 @@ def before_update_object(self, order, data, view_kwargs): :param view_kwargs: :return: """ + if data.get('status') == 'pending': + attendees = order.ticket_holders + for attendee in attendees: + validate_custom_form_constraints_request( + 'attendee', AttendeeSchema, attendee, {} + ) + if data.get('amount') and ( data.get('is_billing_enabled') or order.event.is_billing_info_mandatory ): From 1d64a6901d8bd02aa5df9fe377718532626d9f9d Mon Sep 17 00:00:00 2001 From: Haider Ali Date: Tue, 7 Jul 2020 14:22:35 +0530 Subject: [PATCH 2/6] Add tests --- .../api/helpers/order/test_edit_order.py | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/tests/all/integration/api/helpers/order/test_edit_order.py b/tests/all/integration/api/helpers/order/test_edit_order.py index adad8ffc21..4b0120611d 100644 --- a/tests/all/integration/api/helpers/order/test_edit_order.py +++ b/tests/all/integration/api/helpers/order/test_edit_order.py @@ -1,6 +1,7 @@ import json from app.models.order import Order +from app.models.custom_form import CustomForms from tests.factories.attendee import AttendeeSubFactory from tests.factories.event import EventFactoryBasic from tests.factories.order import OrderSubFactory @@ -91,3 +92,150 @@ def test_ignore_on_order_event_update(client, db, user, jwt): db.session.refresh(order) assert response.status_code == 200 assert order.event == order_event + + +def get_simple_custom_form_order(db, user): + order = OrderSubFactory(amount=234, status='initializing', user=user) + attendee = AttendeeSubFactory(order=order) + + CustomForms( + event=attendee.event, + form='attendee', + field_identifier='jobTitle', + type='text', + is_included=True, + is_required=True, + ) + + CustomForms( + event=attendee.event, + form='attendee', + field_identifier='taxBusinessInfo', + type='text', + is_included=True, + is_required=True, + ) + + db.session.commit() + + return str(order.id) + + +def get_complex_custom_form_order(db, user): + order = OrderSubFactory(amount=234, status='initializing', user=user) + attendee = AttendeeSubFactory(order=order) + + CustomForms( + event=attendee.event, + form='attendee', + field_identifier='whatUniversity', + name='what university', + type='text', + is_complex=True, + is_included=True, + is_required=True, + ) + + CustomForms( + event=attendee.event, + form='attendee', + field_identifier='whatCollege', + name='what college', + type='text', + is_complex=True, + is_included=True, + is_required=True, + ) + + CustomForms( + event=attendee.event, + form='attendee', + field_identifier='naamBatao', + name='naam batao', + type='text', + is_complex=True, + is_included=True, + is_required=False, + ) + + db.session.commit() + + return str(order.id) + + +def test_order_status_to_pending_incomplete_simple_custom_form(client, db, user, jwt): + order_id = get_simple_custom_form_order(db, user) + order = Order.query.get(order_id) + + data = json.dumps( + { + "data": { + "attributes": {"status": "pending", "order-notes": "take me to pending"}, + "type": "order", + "id": order_id, + } + } + ) + + response = client.patch( + f'/v1/orders/{order_id}', + content_type='application/vnd.api+json', + headers=jwt, + data=data, + ) + + db.session.refresh(order) + + assert response.status_code == 422 + assert order.status != "pending" + assert order.order_notes != "take me to pending" + assert json.loads(response.data) == { + 'errors': [ + { + 'status': 422, + 'source': {'pointer': '/data/attributes'}, + 'title': 'Unprocessable Entity', + 'detail': "Missing required fields ['job_title', 'tax_business_info']", + } + ], + 'jsonapi': {'version': '1.0'}, + } + + +def test_order_status_to_pending_incomplete_complex_custom_form(client, db, user, jwt): + order_id = get_complex_custom_form_order(db, user) + order = Order.query.get(order_id) + + data = json.dumps( + { + "data": { + "attributes": {"status": "pending", "order-notes": "do it pending"}, + "type": "order", + "id": order_id, + } + } + ) + + response = client.patch( + f'/v1/orders/{order_id}', + content_type='application/vnd.api+json', + headers=jwt, + data=data, + ) + + db.session.refresh(order) + + assert response.status_code == 422 + assert order.status != "pending" + assert order.order_notes != "do it pending" + assert json.loads(response.data) == { + 'errors': [ + { + 'status': 422, + 'source': {'pointer': '/data/attributes'}, + 'title': 'Unprocessable Entity', + 'detail': "Missing required fields ['what_college', 'what_university']", + } + ], + 'jsonapi': {'version': '1.0'}, + } From dcd3095b595b3eea628f296303020ca2d203d0ef Mon Sep 17 00:00:00 2001 From: Haider Ali Date: Tue, 7 Jul 2020 14:36:09 +0530 Subject: [PATCH 3/6] Reduce function name size --- tests/all/integration/api/helpers/order/test_edit_order.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/all/integration/api/helpers/order/test_edit_order.py b/tests/all/integration/api/helpers/order/test_edit_order.py index 4b0120611d..32127a015f 100644 --- a/tests/all/integration/api/helpers/order/test_edit_order.py +++ b/tests/all/integration/api/helpers/order/test_edit_order.py @@ -163,7 +163,7 @@ def get_complex_custom_form_order(db, user): return str(order.id) -def test_order_status_to_pending_incomplete_simple_custom_form(client, db, user, jwt): +def test_order_pending_incomplete_simple_custom_form(client, db, user, jwt): order_id = get_simple_custom_form_order(db, user) order = Order.query.get(order_id) @@ -202,7 +202,7 @@ def test_order_status_to_pending_incomplete_simple_custom_form(client, db, user, } -def test_order_status_to_pending_incomplete_complex_custom_form(client, db, user, jwt): +def test_order_pending_incomplete_complex_custom_form(client, db, user, jwt): order_id = get_complex_custom_form_order(db, user) order = Order.query.get(order_id) From b6de8c551bc641527fa28fd8622790fc53714240 Mon Sep 17 00:00:00 2001 From: Haider Ali Date: Tue, 7 Jul 2020 16:11:11 +0530 Subject: [PATCH 4/6] Add check for placed and completed order status --- app/api/orders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/orders.py b/app/api/orders.py index 162a2a2d50..9cdb8c9ac0 100644 --- a/app/api/orders.py +++ b/app/api/orders.py @@ -381,7 +381,7 @@ def before_update_object(self, order, data, view_kwargs): :param view_kwargs: :return: """ - if data.get('status') == 'pending': + if data.get('status') in ['pending', 'placed', 'completed']: attendees = order.ticket_holders for attendee in attendees: validate_custom_form_constraints_request( From 95388438857eb080ebdd46228f23e375fbc0b3e9 Mon Sep 17 00:00:00 2001 From: Haider Ali Date: Tue, 7 Jul 2020 16:37:51 +0530 Subject: [PATCH 5/6] Add placed failure test and remove simple custom form test --- .../api/helpers/order/test_edit_order.py | 45 ++++--------------- 1 file changed, 9 insertions(+), 36 deletions(-) diff --git a/tests/all/integration/api/helpers/order/test_edit_order.py b/tests/all/integration/api/helpers/order/test_edit_order.py index 32127a015f..819752835a 100644 --- a/tests/all/integration/api/helpers/order/test_edit_order.py +++ b/tests/all/integration/api/helpers/order/test_edit_order.py @@ -94,33 +94,6 @@ def test_ignore_on_order_event_update(client, db, user, jwt): assert order.event == order_event -def get_simple_custom_form_order(db, user): - order = OrderSubFactory(amount=234, status='initializing', user=user) - attendee = AttendeeSubFactory(order=order) - - CustomForms( - event=attendee.event, - form='attendee', - field_identifier='jobTitle', - type='text', - is_included=True, - is_required=True, - ) - - CustomForms( - event=attendee.event, - form='attendee', - field_identifier='taxBusinessInfo', - type='text', - is_included=True, - is_required=True, - ) - - db.session.commit() - - return str(order.id) - - def get_complex_custom_form_order(db, user): order = OrderSubFactory(amount=234, status='initializing', user=user) attendee = AttendeeSubFactory(order=order) @@ -163,14 +136,14 @@ def get_complex_custom_form_order(db, user): return str(order.id) -def test_order_pending_incomplete_simple_custom_form(client, db, user, jwt): - order_id = get_simple_custom_form_order(db, user) +def test_order_pending_incomplete_complex_custom_form(client, db, user, jwt): + order_id = get_complex_custom_form_order(db, user) order = Order.query.get(order_id) data = json.dumps( { "data": { - "attributes": {"status": "pending", "order-notes": "take me to pending"}, + "attributes": {"status": "pending", "order-notes": "do it pending"}, "type": "order", "id": order_id, } @@ -188,28 +161,28 @@ def test_order_pending_incomplete_simple_custom_form(client, db, user, jwt): assert response.status_code == 422 assert order.status != "pending" - assert order.order_notes != "take me to pending" + assert order.order_notes != "do it pending" assert json.loads(response.data) == { 'errors': [ { 'status': 422, 'source': {'pointer': '/data/attributes'}, 'title': 'Unprocessable Entity', - 'detail': "Missing required fields ['job_title', 'tax_business_info']", + 'detail': "Missing required fields ['what_college', 'what_university']", } ], 'jsonapi': {'version': '1.0'}, } -def test_order_pending_incomplete_complex_custom_form(client, db, user, jwt): +def test_order_placed_incomplete_complex_custom_form(client, db, user, jwt): order_id = get_complex_custom_form_order(db, user) order = Order.query.get(order_id) data = json.dumps( { "data": { - "attributes": {"status": "pending", "order-notes": "do it pending"}, + "attributes": {"status": "placed", "order-notes": "just place it"}, "type": "order", "id": order_id, } @@ -226,8 +199,8 @@ def test_order_pending_incomplete_complex_custom_form(client, db, user, jwt): db.session.refresh(order) assert response.status_code == 422 - assert order.status != "pending" - assert order.order_notes != "do it pending" + assert order.status != "placed" + assert order.order_notes != "just place it" assert json.loads(response.data) == { 'errors': [ { From b40b1bb753ab80181f9da6b10f2c91a5e824fdb0 Mon Sep 17 00:00:00 2001 From: Haider Ali Date: Tue, 7 Jul 2020 17:29:43 +0530 Subject: [PATCH 6/6] Add success test --- .../api/helpers/order/test_edit_order.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/all/integration/api/helpers/order/test_edit_order.py b/tests/all/integration/api/helpers/order/test_edit_order.py index 819752835a..2fbca58f40 100644 --- a/tests/all/integration/api/helpers/order/test_edit_order.py +++ b/tests/all/integration/api/helpers/order/test_edit_order.py @@ -2,6 +2,7 @@ from app.models.order import Order from app.models.custom_form import CustomForms +from app.models.ticket_holder import TicketHolder from tests.factories.attendee import AttendeeSubFactory from tests.factories.event import EventFactoryBasic from tests.factories.order import OrderSubFactory @@ -212,3 +213,42 @@ def test_order_placed_incomplete_complex_custom_form(client, db, user, jwt): ], 'jsonapi': {'version': '1.0'}, } + + +def test_order_pending_complete_complex_custom_form(client, db, user, jwt): + order_id = get_complex_custom_form_order(db, user) + order = Order.query.get(order_id) + + attendee = TicketHolder.query.filter_by(order_id=order.id).first() + attendee.complex_field_values = { + "what_college": "Zakir Hussain College", + "what_university": "Aligarh Muslim University", + } + db.session.commit() + + data = json.dumps( + { + "data": { + "attributes": {"status": "pending", "order-notes": "do it pending"}, + "type": "order", + "id": order_id, + } + } + ) + + response = client.patch( + f'/v1/orders/{order_id}', + content_type='application/vnd.api+json', + headers=jwt, + data=data, + ) + + db.session.refresh(order) + + json_response = json.loads(response.data) + + assert response.status_code == 200 + assert order.status == "pending" + assert order.order_notes == "do it pending" + assert json_response['data']['attributes']['status'] == "pending" + assert json_response['data']['attributes']['order-notes'] == "do it pending"