mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-17 18:39:48 +00:00
91 lines
3.7 KiB
Python
91 lines
3.7 KiB
Python
# 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"
|