Add dependency injection to ChatCompletionStream for improved testability #1016
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Describe the change
This PR refactors the
ChatCompletionStream
to use dependency injection by introducing aChatStreamReader
interface. This allows for injecting custom stream readers, primarily for testing purposes, making the streaming functionality more testable and maintainable.Describe your solution
The changes include:
ChatStreamReader
interface that defines the contract for reading chat completion streamsChatCompletionStream
to use composition with aChatStreamReader
instead of embeddingstreamReader
NewChatCompletionStream()
constructor function to enable dependency injectionRecv()
,Close()
,Header()
,GetRateLimitHeaders()
) onChatCompletionStream
var _ ChatStreamReader = (*streamReader[ChatCompletionStreamResponse])(nil)
This approach maintains backward compatibility while enabling easier mocking and testing of streaming functionality.
Tests
Added comprehensive tests demonstrating the new functionality:
TestChatCompletionStream_MockInjection
: Tests basic mock injection with the new constructormock_streaming_demo_test.go
: A complete demonstration file showing how to create mock clients and stream readers for testing, including:MockOpenAIStreamClient
: Full mock client implementationmockStreamReader
: Custom stream reader for controlled test responsesTestMockOpenAIStreamClient_Demo
: Demonstrates assembling multiple stream chunksTestMockOpenAIStreamClient_ErrorHandling
: Shows error handling patternsAdditional context
This refactoring improves the testability of code that depends on go-openai streaming without introducing breaking changes. The existing public API remains unchanged, but now supports dependency injection for testing scenarios. The new demo test file serves as documentation for users who want to mock streaming responses in their own tests.