57 / 89 · 04 API & Contract Testing with AI · Testing Kafka Consumers← prev⊞ allnext →☰ Read as one page
9.3Idempotency Testing
At-least-once delivery means consumers may receive the same event multiple times. Tests must verify idempotent processing.
def test_duplicate_event_idempotent(self, kafka_producer, order_consumer, db):
"""Processing the same event twice should not create duplicate records."""
event = {
"event_type": "order.created",
"event_id": "evt-unique-001", # Idempotency key
"data": {
"order_id": "ord-dup",
"customer_id": "cust-1",
"total": 50.00,
"items": [{"product_id": "prod-1", "quantity": 1}]
}
}
# Send the same event twice
for _ in range(2):
kafka_producer.produce(
'order-events',
key="ord-dup",
value=json.dumps(event).encode('utf-8')
)
kafka_producer.flush()
# Allow consumer to process both
time.sleep(5)
order_consumer.poll(timeout=1.0)
orders = db.get_orders_by_id("ord-dup")
assert len(orders) == 1, (
f"Expected 1 order, got {len(orders)} -- idempotency failure"
)
def test_duplicate_event_with_different_event_ids(self, kafka_producer, order_consumer, db):
"""Same order data but different event IDs should still be idempotent
based on the business key (order_id), not just the event_id."""
for event_id in ["evt-001", "evt-002"]:
event = {
"event_type": "order.created",
"event_id": event_id,
"data": {"order_id": "ord-biz-dup", "customer_id": "cust-1", "total": 75.00}
}
kafka_producer.produce(
'order-events',
key="ord-biz-dup",
value=json.dumps(event).encode('utf-8')
)
kafka_producer.flush()
time.sleep(5)
order_consumer.poll(timeout=1.0)
orders = db.get_orders_by_id("ord-biz-dup")
assert len(orders) == 1, "Business-key idempotency not enforced"