def order_request(get_order, product, iam_auth, delivery_pricing_api_url,
                  payment_3p_api_url):
    """
    Order Request
    """

    order = get_order()

    # Grab the correct delivery price from the backend
    res = requests.post("{}/backend/pricing".format(delivery_pricing_api_url),
                        auth=iam_auth(delivery_pricing_api_url),
                        json={
                            "products": [product],
                            "address": order["address"]
                        })
    delivery_price = res.json()["pricing"]

    # Get a payment token
    total = delivery_price + sum(
        [p["price"] * p.get("quantity", 1) for p in order["products"]])
    res = requests.post("{}/preauth".format(payment_3p_api_url),
                        json={
                            "cardNumber": "1234567890123456",
                            "amount": total
                        })
    payment_token = res.json()["paymentToken"]

    return {
        "products": [product],
        "address": order["address"],
        "deliveryPrice": delivery_price,
        "paymentToken": payment_token
    }
def order(get_order):
    """
    Order fixture
    """

    order = get_order()
    return {k: order[k] for k in [
        "userId", "products", "address", "deliveryPrice", "paymentToken"
    ]}
def test_start_delivery(jwt_token, api_url, delivery_table_name, get_order):
    """
    Test startDelivery
    """

    order = get_order()
    delivery = {
        "orderId": order["orderId"],
        "address": order["address"],
        "isNew": "true",
        "status": "NEW"
    }
    print(delivery)

    # Seed the database
    table = boto3.resource("dynamodb").Table(delivery_table_name)  # pylint: disable=no-member
    table.put_item(Item=delivery)

    # Make request
    query = """
    mutation ($input: DeliveryInput!) {
        startDelivery(input: $input) {
            success
        }
    }
    """

    res = requests.post(api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": {
                                "input": {
                                    "orderId": order["orderId"]
                                }
                            }
                        })
    data = res.json()
    print(data)

    assert "data" in data
    assert data["data"] is not None
    assert "startDelivery" in data["data"]
    assert "success" in data["data"]["startDelivery"]
    assert data["data"]["startDelivery"]["success"] == True

    ddb_res = table.get_item(Key={"orderId": order["orderId"]})
    assert "Item" in ddb_res
    assert "status" in ddb_res["Item"]
    assert ddb_res["Item"]["status"] == "IN_PROGRESS"
    assert "isNew" not in ddb_res["Item"]

    # Cleanup
    table.delete_item(Key={"orderId": order["orderId"]})
def test_get_delivery_pricing(get_order, jwt_token, api_url):
    """
    Test getDeliveryPricing
    """

    order = get_order()

    headers = {"Authorization": jwt_token}

    query = """
    query($input: DeliveryPricingInput!) {
      getDeliveryPricing(input: $input) {
        pricing
      }
    }
    """
    variables = {
        "input": {
            "products": order["products"],
            "address": order["address"]
        }
    }

    print("VARIABLES", variables)

    response = requests.post(api_url,
                             json={
                                 "query": query,
                                 "variables": variables
                             },
                             headers=headers)

    data = response.json()

    print(data)

    assert "data" in data
    assert "getDeliveryPricing" in data["data"]
    assert "pricing" in data["data"]["getDeliveryPricing"]
def order_request(get_order, product, iam_auth, delivery_pricing_api_url):
    """
    Order Request
    """

    order = get_order()

    # Grab the correct delivery price from the backend
    res = requests.post("{}/backend/pricing".format(delivery_pricing_api_url),
                        auth=iam_auth(delivery_pricing_api_url),
                        json={
                            "products": [product],
                            "address": order["address"]
                        })
    delivery_price = res.json()["pricing"]

    return {
        "products": [product],
        "address": order["address"],
        "deliveryPrice": delivery_price,
        "paymentToken": order["paymentToken"]
    }
def test_get_delivery(jwt_token, api_url, delivery_table_name, get_order):
    """
    Test getDelivery
    """

    order = get_order()
    delivery = {
        "orderId": order["orderId"],
        "address": order["address"],
        "isNew": "true",
        "status": "NEW"
    }
    print(delivery)

    # Seed the database
    table = boto3.resource("dynamodb").Table(delivery_table_name)  # pylint: disable=no-member
    table.put_item(Item=delivery)

    # Make request
    query = """
    query($input: DeliveryInput!) {
        getDelivery(input: $input) {
            orderId
            address {
                name
                streetAddress
                city
                country
            }
        }
    }
    """

    res = requests.post(api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": {
                                "input": {
                                    "orderId": order["orderId"]
                                }
                            }
                        })

    data = res.json()
    print(data)
    assert "data" in data
    assert data["data"] is not None
    assert "getDelivery" in data["data"]
    assert "orderId" in data["data"]["getDelivery"]
    assert data["data"]["getDelivery"]["orderId"] == order["orderId"]
    assert data["data"]["getDelivery"]["address"]["name"] == order["address"][
        "name"]
    assert data["data"]["getDelivery"]["address"]["streetAddress"] == order[
        "address"]["streetAddress"]
    assert data["data"]["getDelivery"]["address"]["city"] == order["address"][
        "city"]
    assert data["data"]["getDelivery"]["address"]["country"] == order[
        "address"]["country"]

    # Cleanup
    table.delete_item(Key={"orderId": order["orderId"]})
def test_get_new_deliveries(jwt_token, api_url, delivery_table_name,
                            get_order):
    """
    Test getNewDeliveries
    """

    order = get_order()
    delivery = {
        "orderId": order["orderId"],
        "address": order["address"],
        "isNew": "true",
        "status": "NEW"
    }
    print(delivery)

    # Seed the database
    table = boto3.resource("dynamodb").Table(delivery_table_name)  # pylint: disable=no-member
    table.put_item(Item=delivery)

    # Make requests
    headers = {"Authorization": jwt_token}

    def get_deliveries(next_token=None):
        if next_token:
            req_data = {
                "query": """
                query ($nextToken: String) {
                    getNewDeliveries(nextToken: $nextToken) {
                        nextToken
                        deliveries {
                            orderId
                            address {
                                name
                                streetAddress
                                city
                                country
                            }
                        }
                    }
                }
                """,
                "variables": {
                    "nextToken": next_token
                }
            }
        else:
            req_data = {
                "query":
                """
                query {
                    getNewDeliveries {
                        nextToken
                        deliveries {
                            orderId
                            address {
                                name
                                streetAddress
                                city
                                country
                            }
                        }
                    }
                }
                """
            }

        response = requests.post(api_url, json=req_data, headers=headers)
        data = response.json()

        print(data)

        assert "data" in data
        assert data["data"] is not None
        assert "getNewDeliveries" in data["data"]
        return data["data"]["getNewDeliveries"]

    found = False
    deliveries = get_deliveries()
    for delivery in deliveries["deliveries"]:
        if delivery["orderId"] == order["orderId"]:
            found = True
    while found == False and deliveries.get("nextToken", None) is not None:
        deliveries = get_deliveries(deliveries["nextToken"])
        for delivery in deliveries["deliveries"]:
            if delivery["orderId"] == order["orderId"]:
                found = True

    assert found == True

    # Clean database
    table.delete_item(Key={"orderId": order["orderId"]})
def test_get_packaging_request(jwt_token, api_url, warehouse_table_name,
                               get_order):
    """
    Test getPackagingRequest
    """

    # Create an order
    order = get_order()
    order_metadata = {
        "orderId": order["orderId"],
        "productId": "__metadata",
        "modifiedDate": order["modifiedDate"],
        "newDate": order["modifiedDate"],
        "status": "NEW"
    }

    # Seed the table
    table = boto3.resource("dynamodb").Table(warehouse_table_name)  # pylint: disable=no-member
    with table.batch_writer() as batch:
        batch.put_item(Item=order_metadata)
        for product in order["products"]:
            batch.put_item(
                Item={
                    "orderId": order["orderId"],
                    "productId": product["productId"],
                    "quantity": product.get("quantity", 1)
                })

    # Perform the query
    query = """
    query ($input: PackagingInput!) {
        getPackagingRequest(input: $input) {
            orderId
            status
            products {
                productId
                quantity
            }
        }
    }
    """

    response = requests.post(api_url,
                             headers={"Authorization": jwt_token},
                             json={
                                 "query": query,
                                 "variables": {
                                     "input": {
                                         "orderId": order["orderId"]
                                     }
                                 }
                             })
    data = response.json()
    print(data)

    assert "data" in data
    assert data["data"] is not None
    assert "getPackagingRequest" in data["data"]
    pr = data["data"]["getPackagingRequest"]
    assert pr["orderId"] == order["orderId"]
    assert pr["status"] == order["status"]
    assert len(pr["products"]) == len(order["products"])

    products = {p["productId"]: p for p in pr["products"]}
    for product in order["products"]:
        assert product["productId"] in products.keys()
        assert products[product["productId"]]["quantity"] == product.get(
            "quantity", 1)

    # Cleanup
    with table.batch_writer() as batch:
        batch.delete_item(Key={
            "orderId": order["orderId"],
            "productId": "__metadata"
        })
        for product in order["products"]:
            batch.delete_item(Key={
                "orderId": order["orderId"],
                "productId": product["productId"]
            })
예제 #9
0
def order(get_order):
    return get_order()
def complete_order(get_order):
    """
    Complete order fixture
    """

    return get_order()
예제 #11
0
def order(get_order):
    """
    Generate orders
    """
    return get_order()
예제 #12
0
def test_happy_path(get_order, products_table, jwt_token, frontend_api_url,
                    payment_3p_api_url):
    """
    Test an order journey with a happy path
    """

    # Generate an order request
    order = get_order()
    order_request = {
        "products": order["products"],
        "address": order["address"]
    }
    del order

    # Seed the products table
    # TODO: use backoffice API instead
    with products_table.batch_writer() as batch:
        for product in order_request["products"]:
            batch.put_item(Item=product)

    # Get the delivery price
    query = """
    query($input: DeliveryPricingInput!) {
      getDeliveryPricing(input: $input) {
        pricing
      }
    }
    """
    variables = {
        "input": {
            "products": order_request["products"],
            "address": order_request["address"]
        }
    }
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("GET DELIVERY PRICING", body)
    assert "pricing" in body["data"]["getDeliveryPricing"]
    order_request["deliveryPrice"] = body["data"]["getDeliveryPricing"][
        "pricing"]

    # Get the paymentToken
    total = order_request["deliveryPrice"] + sum(
        [p["price"] * p.get("quantity", 1) for p in order_request["products"]])
    res = requests.post(payment_3p_api_url + "/preauth",
                        json={
                            "cardNumber": "1234567890123456",
                            "amount": total
                        })
    order_request["paymentToken"] = res.json()["paymentToken"]

    # Create the order
    query = """
    mutation ($order: CreateOrderRequest!) {
        createOrder(order: $order) {
            success
            message
            errors
            order {
                orderId
            }
        }
    }
    """
    variables = {"order": order_request}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("CREATE ORDER", body)
    assert body["data"]["createOrder"]["success"] == True

    order_id = body["data"]["createOrder"]["order"]["orderId"]

    # Wait
    time.sleep(5)

    # Retrieve the packaging request
    query = """
    query ($input: PackagingInput!) {
        getPackagingRequest(input: $input) {
            orderId
            status
            products {
                productId
                quantity
            }
        }
    }
    """
    variables = {"input": {"orderId": order_id}}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("GET PACKAGE REQUEST", body)
    pr = body["data"]["getPackagingRequest"]
    packaging_products = {p["productId"]: p for p in pr["products"]}
    for product in order_request["products"]:
        assert product["productId"] in packaging_products.keys()
        assert packaging_products[
            product["productId"]]["quantity"] == product.get("quantity", 1)

    # Start working on the packaging request
    query = """
    mutation ($input: PackagingInput!) {
        startPackaging(input: $input) {
            success
        }
    }
    """
    variables = {"input": {"orderId": order_id}}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("START PACKAGING", body)
    assert body["data"]["startPackaging"]["success"] == True

    # Complete the packaging request
    query = """
    mutation ($input: PackagingInput!) {
        completePackaging(input: $input) {
            success
        }
    }
    """
    variables = {"input": {"orderId": order_id}}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("COMPLETE PACKAGING", body)
    assert body["data"]["completePackaging"]["success"] == True

    # Wait
    time.sleep(5)

    # Check the order
    query = """
    query($orderId: ID!) {
        getOrder(orderId: $orderId) {
            orderId
            status
        }
    }
    """
    variables = {"orderId": order_id}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("CHECK ORDER", body)
    assert body["data"]["getOrder"]["status"] == "PACKAGED"

    # Retrieve the delivery request
    query = """
    query($input: DeliveryInput!) {
        getDelivery(input: $input) {
            orderId
            address {
                name
                companyName
                streetAddress
                postCode
                city
                state
                country
                phoneNumber
            }
        }
    }
    """
    variables = {"input": {"orderId": order_id}}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("GET DELIVERY", body)
    assert body["data"]["getDelivery"]["orderId"] == order_id
    assert body["data"]["getDelivery"]["address"] == order_request["address"]

    # Start delivery
    query = """
    mutation ($input: DeliveryInput!) {
        startDelivery(input: $input) {
            success
        }
    }
    """
    variables = {"input": {"orderId": order_id}}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("START DELIVERY", body)
    assert body["data"]["startDelivery"]["success"] == True

    # Complete delivery
    query = """
    mutation ($input: DeliveryInput!) {
        completeDelivery(input: $input) {
            success
        }
    }
    """
    variables = {"input": {"orderId": order_id}}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("COMPLETE DELIVERY", body)
    assert body["data"]["completeDelivery"]["success"] == True

    # Wait
    time.sleep(5)

    # Check the order
    query = """
    query($orderId: ID!) {
        getOrder(orderId: $orderId) {
            orderId
            status
        }
    }
    """
    variables = {"orderId": order_id}
    res = requests.post(frontend_api_url,
                        headers={"Authorization": jwt_token},
                        json={
                            "query": query,
                            "variables": variables
                        })
    body = res.json()
    print("CHECK ORDER", body)
    assert body["data"]["getOrder"]["status"] == "FULFILLED"

    # Remove products from the products table
    # TODO: use backoffice API instead
    with products_table.batch_writer() as batch:
        for product in order_request["products"]:
            batch.delete_item(Key={"productId": product["productId"]})