|
4 | 4 |
|
5 | 5 |
|
6 | 6 | def test_create_order_returns_order_id(api_endpoint): |
7 | | - resp = requests.post(f"{api_endpoint}/orders", json={"item": "book", "quantity": 2}) |
| 7 | + resp = requests.post(f"{api_endpoint}/orders", json={"item": "LocalStack T-Shirt", "quantity": 2}) |
8 | 8 | assert resp.status_code == 201 |
9 | 9 | data = resp.json() |
10 | 10 | assert "order_id" in data |
11 | 11 | assert data["status"] == "pending" |
12 | 12 |
|
13 | 13 |
|
14 | 14 | def test_order_persisted_in_dynamodb(api_endpoint, dynamodb): |
15 | | - resp = requests.post(f"{api_endpoint}/orders", json={"item": "mug", "quantity": 1}) |
| 15 | + resp = requests.post(f"{api_endpoint}/orders", json={"item": "LocalStack Mug", "quantity": 1}) |
16 | 16 | order_id = resp.json()["order_id"] |
17 | 17 |
|
18 | 18 | table = dynamodb.Table("orders") |
19 | 19 | item = table.get_item(Key={"order_id": order_id})["Item"] |
20 | | - assert item["item"] == "mug" |
| 20 | + assert item["item"] == "LocalStack Mug" |
21 | 21 | assert item["status"] == "pending" |
22 | 22 |
|
23 | 23 |
|
24 | | -def test_order_processed_and_receipt_in_s3(api_endpoint, dynamodb, s3): |
25 | | - resp = requests.post(f"{api_endpoint}/orders", json={"item": "t-shirt", "quantity": 3}) |
| 24 | +def test_order_fulfilled_and_receipt_in_s3(api_endpoint, dynamodb, s3): |
| 25 | + resp = requests.post(f"{api_endpoint}/orders", json={"item": "LocalStack Hoodie", "quantity": 1}) |
| 26 | + assert resp.status_code == 201 |
26 | 27 | order_id = resp.json()["order_id"] |
27 | 28 |
|
28 | | - # Wait for async SQS → Lambda processing (up to 10s) |
| 29 | + # Wait for full pipeline: SQS → Lambda → Step Functions → ECS (up to 60s) |
29 | 30 | table = dynamodb.Table("orders") |
30 | | - for _ in range(20): |
| 31 | + for _ in range(120): |
31 | 32 | item = table.get_item(Key={"order_id": order_id})["Item"] |
32 | | - if item["status"] == "processed": |
| 33 | + if item["status"] in ("fulfilled", "failed"): |
33 | 34 | break |
34 | 35 | time.sleep(0.5) |
35 | 36 | else: |
36 | | - raise AssertionError(f"Order {order_id} never reached 'processed' status") |
| 37 | + raise AssertionError(f"Order {order_id} never reached terminal status (last: {item['status']})") |
| 38 | + |
| 39 | + assert item["status"] == "fulfilled", f"Expected fulfilled, got {item['status']}" |
37 | 40 |
|
38 | | - # Verify receipt uploaded to S3 |
| 41 | + # Verify receipt uploaded to S3 by the ECS fulfillment task |
39 | 42 | obj = s3.get_object(Bucket="order-receipts", Key=f"receipts/{order_id}.json") |
40 | 43 | receipt = json.loads(obj["Body"].read()) |
41 | 44 | assert receipt["order_id"] == order_id |
42 | | - assert receipt["status"] == "processed" |
| 45 | + assert receipt["status"] == "fulfilled" |
| 46 | + |
| 47 | + |
| 48 | +def test_products_listed(api_endpoint): |
| 49 | + resp = requests.get(f"{api_endpoint}/products") |
| 50 | + assert resp.status_code == 200 |
| 51 | + products = resp.json() |
| 52 | + assert len(products) > 0 |
| 53 | + names = [p["name"] for p in products] |
| 54 | + assert any("LocalStack" in n for n in names) |
0 commit comments