# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the terms described in the LICENSE file in # the root directory of this source tree. """ Integration tests for batch idempotency functionality using the OpenAI client library. This module tests the idempotency feature in the batches API using the OpenAI-compatible client interface. These tests verify that the idempotency key (idempotency_key) works correctly in a real client-server environment. Test Categories: 1. Successful Idempotency: Same key returns same batch with identical parameters - test_idempotent_batch_creation_successful: Verifies that requests with the same idempotency key return identical batches, even with different metadata order 2. Conflict Detection: Same key with conflicting parameters raises HTTP 409 errors - test_idempotency_conflict_with_different_params: Verifies that reusing an idempotency key with truly conflicting parameters (both file ID and metadata values) raises ConflictError """ import time import pytest from openai import ConflictError class TestBatchesIdempotencyIntegration: """Integration tests for batch idempotency using OpenAI client.""" def test_idempotent_batch_creation_successful(self, openai_client): """Test that identical requests with same idempotency key return the same batch.""" batch1 = openai_client.batches.create( input_file_id="bogus-id", endpoint="/v1/chat/completions", completion_window="24h", metadata={ "test_type": "idempotency_success", "purpose": "integration_test", }, extra_body={"idempotency_key": "test-idempotency-token-1"}, ) # sleep to ensure different timestamps time.sleep(1) batch2 = openai_client.batches.create( input_file_id="bogus-id", endpoint="/v1/chat/completions", completion_window="24h", metadata={ "purpose": "integration_test", "test_type": "idempotency_success", }, # Different order extra_body={"idempotency_key": "test-idempotency-token-1"}, ) assert batch1.id == batch2.id assert batch1.input_file_id == batch2.input_file_id assert batch1.endpoint == batch2.endpoint assert batch1.completion_window == batch2.completion_window assert batch1.metadata == batch2.metadata assert batch1.created_at == batch2.created_at def test_idempotency_conflict_with_different_params(self, openai_client): """Test that using same idempotency key with different params raises conflict error.""" batch1 = openai_client.batches.create( input_file_id="bogus-id-1", endpoint="/v1/chat/completions", completion_window="24h", metadata={"test_type": "conflict_test_1"}, extra_body={"idempotency_key": "conflict-token"}, ) with pytest.raises(ConflictError) as exc_info: openai_client.batches.create( input_file_id="bogus-id-2", # Different file ID endpoint="/v1/chat/completions", completion_window="24h", metadata={"test_type": "conflict_test_2"}, # Different metadata extra_body={"idempotency_key": "conflict-token"}, # Same token ) assert exc_info.value.status_code == 409 assert "conflict" in str(exc_info.value).lower() retrieved_batch = openai_client.batches.retrieve(batch1.id) assert retrieved_batch.id == batch1.id assert retrieved_batch.input_file_id == "bogus-id-1"