def test_unit_admin_and_unit_manager_may_bypass_payment( user_api_client, resource_in_unit, user): reservation_data = build_reservation_data(resource_in_unit) ProductFactory(type=Product.RENT, resources=[resource_in_unit]) # Order required for normal user response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 400 assert 'order' in response.data # Order not required for admin user UnitAuthorization.objects.create(subject=resource_in_unit.unit, level=UnitAuthorizationLevel.admin, authorized=user) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 201 new_reservation = Reservation.objects.last() assert new_reservation.state == Reservation.CONFIRMED UnitAuthorization.objects.all().delete() Reservation.objects.all().delete() # Order not required for manager user UnitAuthorization.objects.create(subject=resource_in_unit.unit, level=UnitAuthorizationLevel.manager, authorized=user) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 201 new_reservation = Reservation.objects.last() assert new_reservation.state == Reservation.CONFIRMED
def test_order_post(user_api_client, resource_in_unit, product, product_2, mock_provider): reservation_data = build_reservation_data(resource_in_unit) reservation_data['order'] = build_order_data(product=product, product_2=product_2, quantity_2=5) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 201, response.data mock_provider.initiate_payment.assert_called() # check response fields order_create_response_fields = ORDER_FIELDS.copy() | {'payment_url'} order_data = response.data['order'] assert set(order_data.keys()) == order_create_response_fields assert order_data['payment_url'].startswith( 'https://mocked-payment-url.com') # check created object new_order = Order.objects.last() assert new_order.reservation == Reservation.objects.last() # check order lines order_lines = new_order.order_lines.all() assert order_lines.count() == 2 assert order_lines[0].product == product assert order_lines[0].quantity == 1 assert order_lines[1].product == product_2 assert order_lines[1].quantity == 5
def test_extra_product_doesnt_make_order_required(user_api_client, resource_in_unit): reservation_data = build_reservation_data(resource_in_unit) ProductFactory(type=Product.EXTRA, resources=[resource_in_unit]) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 201
def test_order_must_include_rent_if_one_exists(user_api_client, resource_in_unit): reservation_data = build_reservation_data(resource_in_unit) ProductFactory(type=Product.RENT, resources=[resource_in_unit]) extra = ProductFactory(type=Product.EXTRA, resources=[resource_in_unit]) reservation_data['order'] = build_order_data(product=extra) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 400
def test_order_line_products_are_unique(user_api_client, resource_in_unit, product): """Test order validator enforces that order lines cannot contain duplicates of the same product""" reservation_data = build_reservation_data(resource_in_unit) reservation_data['order'] = build_order_data(product, quantity=2, product_2=product, quantity_2=2) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 400
def test_reservation_creation_state(user_api_client, resource_in_unit, has_order, expected_state): reservation_data = build_reservation_data(resource_in_unit) if has_order: product = ProductFactory(type=Product.RENT, resources=[resource_in_unit]) reservation_data['order'] = build_order_data(product) response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == 201 new_reservation = Reservation.objects.last() assert new_reservation.state == expected_state
def test_rent_product_makes_order_required_(user_api_client, resource_in_unit, has_rent): reservation_data = build_reservation_data(resource_in_unit) if has_rent: ProductFactory(type=Product.RENT, resources=[resource_in_unit]) response = user_api_client.post(LIST_URL, reservation_data) if has_rent: assert response.status_code == 400 assert 'order' in response.data else: assert response.status_code == 201
def test_order_product_must_match_resource(user_api_client, product, resource_in_unit, resource_in_unit2): product_with_another_resource = ProductFactory( resources=[resource_in_unit2]) data = build_reservation_data(resource_in_unit) data['order'] = build_order_data(product=product, product_2=product_with_another_resource) response = user_api_client.post(LIST_URL, data) assert response.status_code == 400 assert 'product' in response.data['order']['order_lines'][1]
def test_order_line_product_quantity_limitation(user_api_client, resource_in_unit, quantity, expected_status): """Test order validator order line quantity is within product max quantity limitation""" reservation_data = build_reservation_data(resource_in_unit) product_with_quantity = ProductFactory(resources=[resource_in_unit], max_quantity=2) order_data = build_order_data(product=product_with_quantity, quantity=quantity) reservation_data['order'] = order_data response = user_api_client.post(LIST_URL, reservation_data) assert response.status_code == expected_status, response.data