Modern QA2026Idempotency Testing — tiles
Log inJoin
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"