Improve test coverage

This commit is contained in:
2026-03-05 18:07:33 +00:00
parent 1e0bb0be8c
commit ccb8267813
8 changed files with 7550 additions and 49 deletions

916
test_output.txt Normal file
View File

@@ -0,0 +1,916 @@
github.com/ajac-zero/latticelm/cmd/gateway coverage: 0.0% of statements
=== RUN TestInputUnion_UnmarshalJSON
=== RUN TestInputUnion_UnmarshalJSON/string_input
=== RUN TestInputUnion_UnmarshalJSON/empty_string_input
=== RUN TestInputUnion_UnmarshalJSON/null_input
=== RUN TestInputUnion_UnmarshalJSON/array_input_with_single_message
=== RUN TestInputUnion_UnmarshalJSON/array_input_with_multiple_messages
=== RUN TestInputUnion_UnmarshalJSON/empty_array
=== RUN TestInputUnion_UnmarshalJSON/array_with_function_call_output
=== RUN TestInputUnion_UnmarshalJSON/invalid_JSON
=== RUN TestInputUnion_UnmarshalJSON/invalid_type_-_number
=== RUN TestInputUnion_UnmarshalJSON/invalid_type_-_object
--- PASS: TestInputUnion_UnmarshalJSON (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/string_input (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/empty_string_input (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/null_input (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/array_input_with_single_message (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/array_input_with_multiple_messages (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/empty_array (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/array_with_function_call_output (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/invalid_JSON (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/invalid_type_-_number (0.00s)
--- PASS: TestInputUnion_UnmarshalJSON/invalid_type_-_object (0.00s)
=== RUN TestInputUnion_MarshalJSON
=== RUN TestInputUnion_MarshalJSON/string_value
=== RUN TestInputUnion_MarshalJSON/empty_string
=== RUN TestInputUnion_MarshalJSON/array_value
=== RUN TestInputUnion_MarshalJSON/empty_array
=== RUN TestInputUnion_MarshalJSON/nil_values
--- PASS: TestInputUnion_MarshalJSON (0.00s)
--- PASS: TestInputUnion_MarshalJSON/string_value (0.00s)
--- PASS: TestInputUnion_MarshalJSON/empty_string (0.00s)
--- PASS: TestInputUnion_MarshalJSON/array_value (0.00s)
--- PASS: TestInputUnion_MarshalJSON/empty_array (0.00s)
--- PASS: TestInputUnion_MarshalJSON/nil_values (0.00s)
=== RUN TestInputUnion_RoundTrip
=== RUN TestInputUnion_RoundTrip/string
=== RUN TestInputUnion_RoundTrip/array_with_messages
--- PASS: TestInputUnion_RoundTrip (0.00s)
--- PASS: TestInputUnion_RoundTrip/string (0.00s)
--- PASS: TestInputUnion_RoundTrip/array_with_messages (0.00s)
=== RUN TestResponseRequest_NormalizeInput
=== RUN TestResponseRequest_NormalizeInput/string_input_creates_user_message
=== RUN TestResponseRequest_NormalizeInput/message_with_string_content
=== RUN TestResponseRequest_NormalizeInput/assistant_message_with_string_content_uses_output_text
=== RUN TestResponseRequest_NormalizeInput/message_with_content_blocks_array
=== RUN TestResponseRequest_NormalizeInput/message_with_tool_use_blocks
=== RUN TestResponseRequest_NormalizeInput/message_with_mixed_text_and_tool_use
=== RUN TestResponseRequest_NormalizeInput/multiple_tool_use_blocks
=== RUN TestResponseRequest_NormalizeInput/function_call_output_item
=== RUN TestResponseRequest_NormalizeInput/multiple_messages_in_conversation
=== RUN TestResponseRequest_NormalizeInput/complete_tool_calling_flow
=== RUN TestResponseRequest_NormalizeInput/message_without_type_defaults_to_message
=== RUN TestResponseRequest_NormalizeInput/message_with_nil_content
=== RUN TestResponseRequest_NormalizeInput/tool_use_with_empty_input
=== RUN TestResponseRequest_NormalizeInput/content_blocks_with_unknown_types_ignored
--- PASS: TestResponseRequest_NormalizeInput (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/string_input_creates_user_message (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/message_with_string_content (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/assistant_message_with_string_content_uses_output_text (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/message_with_content_blocks_array (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/message_with_tool_use_blocks (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/message_with_mixed_text_and_tool_use (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/multiple_tool_use_blocks (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/function_call_output_item (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/multiple_messages_in_conversation (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/complete_tool_calling_flow (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/message_without_type_defaults_to_message (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/message_with_nil_content (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/tool_use_with_empty_input (0.00s)
--- PASS: TestResponseRequest_NormalizeInput/content_blocks_with_unknown_types_ignored (0.00s)
=== RUN TestResponseRequest_Validate
=== RUN TestResponseRequest_Validate/valid_request_with_string_input
=== RUN TestResponseRequest_Validate/valid_request_with_array_input
=== RUN TestResponseRequest_Validate/nil_request
=== RUN TestResponseRequest_Validate/missing_model
=== RUN TestResponseRequest_Validate/missing_input
=== RUN TestResponseRequest_Validate/empty_string_input_is_invalid
=== RUN TestResponseRequest_Validate/empty_array_input_is_invalid
--- PASS: TestResponseRequest_Validate (0.00s)
--- PASS: TestResponseRequest_Validate/valid_request_with_string_input (0.00s)
--- PASS: TestResponseRequest_Validate/valid_request_with_array_input (0.00s)
--- PASS: TestResponseRequest_Validate/nil_request (0.00s)
--- PASS: TestResponseRequest_Validate/missing_model (0.00s)
--- PASS: TestResponseRequest_Validate/missing_input (0.00s)
--- PASS: TestResponseRequest_Validate/empty_string_input_is_invalid (0.00s)
--- PASS: TestResponseRequest_Validate/empty_array_input_is_invalid (0.00s)
=== RUN TestGetStringField
=== RUN TestGetStringField/existing_string_field
=== RUN TestGetStringField/missing_field
=== RUN TestGetStringField/wrong_type_-_int
=== RUN TestGetStringField/wrong_type_-_bool
=== RUN TestGetStringField/wrong_type_-_object
=== RUN TestGetStringField/empty_string_value
=== RUN TestGetStringField/nil_map
--- PASS: TestGetStringField (0.00s)
--- PASS: TestGetStringField/existing_string_field (0.00s)
--- PASS: TestGetStringField/missing_field (0.00s)
--- PASS: TestGetStringField/wrong_type_-_int (0.00s)
--- PASS: TestGetStringField/wrong_type_-_bool (0.00s)
--- PASS: TestGetStringField/wrong_type_-_object (0.00s)
--- PASS: TestGetStringField/empty_string_value (0.00s)
--- PASS: TestGetStringField/nil_map (0.00s)
=== RUN TestInputItem_ComplexContent
=== RUN TestInputItem_ComplexContent/content_with_nested_objects
=== RUN TestInputItem_ComplexContent/content_with_array_in_input
--- PASS: TestInputItem_ComplexContent (0.00s)
--- PASS: TestInputItem_ComplexContent/content_with_nested_objects (0.00s)
--- PASS: TestInputItem_ComplexContent/content_with_array_in_input (0.00s)
=== RUN TestResponseRequest_CompleteWorkflow
--- PASS: TestResponseRequest_CompleteWorkflow (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/ajac-zero/latticelm/internal/api 0.011s coverage: 100.0% of statements
=== RUN TestNew
=== RUN TestNew/disabled_auth_returns_empty_middleware
=== RUN TestNew/enabled_without_issuer_returns_error
=== RUN TestNew/enabled_with_valid_config_fetches_JWKS
=== RUN TestNew/JWKS_fetch_failure_returns_error
--- PASS: TestNew (0.00s)
--- PASS: TestNew/disabled_auth_returns_empty_middleware (0.00s)
--- PASS: TestNew/enabled_without_issuer_returns_error (0.00s)
--- PASS: TestNew/enabled_with_valid_config_fetches_JWKS (0.00s)
--- PASS: TestNew/JWKS_fetch_failure_returns_error (0.00s)
=== RUN TestMiddleware_Handler
=== RUN TestMiddleware_Handler/missing_authorization_header
=== RUN TestMiddleware_Handler/malformed_authorization_header_-_no_bearer
=== RUN TestMiddleware_Handler/malformed_authorization_header_-_wrong_scheme
=== RUN TestMiddleware_Handler/valid_token_with_correct_claims
=== RUN TestMiddleware_Handler/expired_token
=== RUN TestMiddleware_Handler/token_with_wrong_issuer
=== RUN TestMiddleware_Handler/token_with_wrong_audience
=== RUN TestMiddleware_Handler/token_with_missing_kid
--- PASS: TestMiddleware_Handler (0.01s)
--- PASS: TestMiddleware_Handler/missing_authorization_header (0.00s)
--- PASS: TestMiddleware_Handler/malformed_authorization_header_-_no_bearer (0.00s)
--- PASS: TestMiddleware_Handler/malformed_authorization_header_-_wrong_scheme (0.00s)
--- PASS: TestMiddleware_Handler/valid_token_with_correct_claims (0.00s)
--- PASS: TestMiddleware_Handler/expired_token (0.00s)
--- PASS: TestMiddleware_Handler/token_with_wrong_issuer (0.00s)
--- PASS: TestMiddleware_Handler/token_with_wrong_audience (0.00s)
--- PASS: TestMiddleware_Handler/token_with_missing_kid (0.00s)
=== RUN TestMiddleware_Handler_DisabledAuth
--- PASS: TestMiddleware_Handler_DisabledAuth (0.00s)
=== RUN TestValidateToken
=== RUN TestValidateToken/valid_token_with_all_required_claims
=== RUN TestValidateToken/token_with_audience_as_array
=== RUN TestValidateToken/token_with_audience_array_not_matching
=== RUN TestValidateToken/token_with_invalid_audience_format
=== RUN TestValidateToken/token_signed_with_wrong_key
=== RUN TestValidateToken/token_with_unknown_kid_triggers_JWKS_refresh
=== RUN TestValidateToken/token_with_completely_unknown_kid_after_refresh
=== RUN TestValidateToken/malformed_token
=== RUN TestValidateToken/token_with_non-RSA_signing_method
--- PASS: TestValidateToken (0.80s)
--- PASS: TestValidateToken/valid_token_with_all_required_claims (0.00s)
--- PASS: TestValidateToken/token_with_audience_as_array (0.00s)
--- PASS: TestValidateToken/token_with_audience_array_not_matching (0.00s)
--- PASS: TestValidateToken/token_with_invalid_audience_format (0.00s)
--- PASS: TestValidateToken/token_signed_with_wrong_key (0.15s)
--- PASS: TestValidateToken/token_with_unknown_kid_triggers_JWKS_refresh (0.42s)
--- PASS: TestValidateToken/token_with_completely_unknown_kid_after_refresh (0.22s)
--- PASS: TestValidateToken/malformed_token (0.00s)
--- PASS: TestValidateToken/token_with_non-RSA_signing_method (0.00s)
=== RUN TestValidateToken_NoAudienceConfigured
--- PASS: TestValidateToken_NoAudienceConfigured (0.00s)
=== RUN TestRefreshJWKS
=== RUN TestRefreshJWKS/successful_JWKS_fetch_and_parse
=== RUN TestRefreshJWKS/OIDC_discovery_failure
=== RUN TestRefreshJWKS/JWKS_with_multiple_keys
=== RUN TestRefreshJWKS/JWKS_with_non-RSA_keys_skipped
=== RUN TestRefreshJWKS/JWKS_with_wrong_use_field_skipped
=== RUN TestRefreshJWKS/JWKS_with_invalid_base64_encoding_skipped
--- PASS: TestRefreshJWKS (0.14s)
--- PASS: TestRefreshJWKS/successful_JWKS_fetch_and_parse (0.00s)
--- PASS: TestRefreshJWKS/OIDC_discovery_failure (0.00s)
--- PASS: TestRefreshJWKS/JWKS_with_multiple_keys (0.14s)
--- PASS: TestRefreshJWKS/JWKS_with_non-RSA_keys_skipped (0.00s)
--- PASS: TestRefreshJWKS/JWKS_with_wrong_use_field_skipped (0.00s)
--- PASS: TestRefreshJWKS/JWKS_with_invalid_base64_encoding_skipped (0.00s)
=== RUN TestRefreshJWKS_Concurrency
--- PASS: TestRefreshJWKS_Concurrency (0.01s)
=== RUN TestGetClaims
=== RUN TestGetClaims/context_with_claims
=== RUN TestGetClaims/context_without_claims
=== RUN TestGetClaims/context_with_wrong_type
--- PASS: TestGetClaims (0.00s)
--- PASS: TestGetClaims/context_with_claims (0.00s)
--- PASS: TestGetClaims/context_without_claims (0.00s)
--- PASS: TestGetClaims/context_with_wrong_type (0.00s)
=== RUN TestMiddleware_IssuerWithTrailingSlash
--- PASS: TestMiddleware_IssuerWithTrailingSlash (0.00s)
PASS
coverage: 91.7% of statements
ok github.com/ajac-zero/latticelm/internal/auth 1.251s coverage: 91.7% of statements
=== RUN TestLoad
=== RUN TestLoad/basic_config_with_all_fields
=== RUN TestLoad/config_with_environment_variables
=== RUN TestLoad/minimal_config
=== RUN TestLoad/azure_openai_provider
=== RUN TestLoad/vertex_ai_provider
=== RUN TestLoad/sql_conversation_store
=== RUN TestLoad/redis_conversation_store
=== RUN TestLoad/invalid_model_references_unknown_provider
=== RUN TestLoad/invalid_YAML
=== RUN TestLoad/multiple_models_same_provider
--- PASS: TestLoad (0.01s)
--- PASS: TestLoad/basic_config_with_all_fields (0.00s)
--- PASS: TestLoad/config_with_environment_variables (0.00s)
--- PASS: TestLoad/minimal_config (0.00s)
--- PASS: TestLoad/azure_openai_provider (0.00s)
--- PASS: TestLoad/vertex_ai_provider (0.00s)
--- PASS: TestLoad/sql_conversation_store (0.00s)
--- PASS: TestLoad/redis_conversation_store (0.00s)
--- PASS: TestLoad/invalid_model_references_unknown_provider (0.00s)
--- PASS: TestLoad/invalid_YAML (0.00s)
--- PASS: TestLoad/multiple_models_same_provider (0.00s)
=== RUN TestLoadNonExistentFile
--- PASS: TestLoadNonExistentFile (0.00s)
=== RUN TestConfigValidate
=== RUN TestConfigValidate/valid_config
=== RUN TestConfigValidate/model_references_unknown_provider
=== RUN TestConfigValidate/no_models
=== RUN TestConfigValidate/multiple_models_multiple_providers
--- PASS: TestConfigValidate (0.00s)
--- PASS: TestConfigValidate/valid_config (0.00s)
--- PASS: TestConfigValidate/model_references_unknown_provider (0.00s)
--- PASS: TestConfigValidate/no_models (0.00s)
--- PASS: TestConfigValidate/multiple_models_multiple_providers (0.00s)
=== RUN TestEnvironmentVariableExpansion
--- PASS: TestEnvironmentVariableExpansion (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/ajac-zero/latticelm/internal/config 0.040s coverage: 100.0% of statements
=== RUN TestMemoryStore_CreateAndGet
--- PASS: TestMemoryStore_CreateAndGet (0.00s)
=== RUN TestMemoryStore_GetNonExistent
--- PASS: TestMemoryStore_GetNonExistent (0.00s)
=== RUN TestMemoryStore_Append
--- PASS: TestMemoryStore_Append (0.00s)
=== RUN TestMemoryStore_AppendNonExistent
--- PASS: TestMemoryStore_AppendNonExistent (0.00s)
=== RUN TestMemoryStore_Delete
--- PASS: TestMemoryStore_Delete (0.00s)
=== RUN TestMemoryStore_Size
--- PASS: TestMemoryStore_Size (0.00s)
=== RUN TestMemoryStore_ConcurrentAccess
--- PASS: TestMemoryStore_ConcurrentAccess (0.00s)
=== RUN TestMemoryStore_DeepCopy
--- PASS: TestMemoryStore_DeepCopy (0.00s)
=== RUN TestMemoryStore_TTLCleanup
--- PASS: TestMemoryStore_TTLCleanup (0.15s)
=== RUN TestMemoryStore_NoTTL
--- PASS: TestMemoryStore_NoTTL (0.00s)
=== RUN TestMemoryStore_UpdatedAtTracking
--- PASS: TestMemoryStore_UpdatedAtTracking (0.01s)
=== RUN TestMemoryStore_MultipleConversations
--- PASS: TestMemoryStore_MultipleConversations (0.00s)
=== RUN TestNewRedisStore
--- PASS: TestNewRedisStore (0.00s)
=== RUN TestRedisStore_Create
--- PASS: TestRedisStore_Create (0.00s)
=== RUN TestRedisStore_Get
--- PASS: TestRedisStore_Get (0.00s)
=== RUN TestRedisStore_Append
--- PASS: TestRedisStore_Append (0.00s)
=== RUN TestRedisStore_Delete
--- PASS: TestRedisStore_Delete (0.00s)
=== RUN TestRedisStore_Size
--- PASS: TestRedisStore_Size (0.00s)
=== RUN TestRedisStore_TTL
--- PASS: TestRedisStore_TTL (0.00s)
=== RUN TestRedisStore_KeyStorage
--- PASS: TestRedisStore_KeyStorage (0.00s)
=== RUN TestRedisStore_Concurrent
--- PASS: TestRedisStore_Concurrent (0.01s)
=== RUN TestRedisStore_JSONEncoding
--- PASS: TestRedisStore_JSONEncoding (0.00s)
=== RUN TestRedisStore_EmptyMessages
--- PASS: TestRedisStore_EmptyMessages (0.00s)
=== RUN TestRedisStore_UpdateExisting
--- PASS: TestRedisStore_UpdateExisting (0.01s)
=== RUN TestRedisStore_ContextCancellation
--- PASS: TestRedisStore_ContextCancellation (0.01s)
=== RUN TestRedisStore_ScanPagination
--- PASS: TestRedisStore_ScanPagination (0.00s)
=== RUN TestNewSQLStore
--- PASS: TestNewSQLStore (0.00s)
=== RUN TestSQLStore_Create
--- PASS: TestSQLStore_Create (0.00s)
=== RUN TestSQLStore_Get
--- PASS: TestSQLStore_Get (0.00s)
=== RUN TestSQLStore_Append
--- PASS: TestSQLStore_Append (0.00s)
=== RUN TestSQLStore_Delete
--- PASS: TestSQLStore_Delete (0.00s)
=== RUN TestSQLStore_Size
--- PASS: TestSQLStore_Size (0.00s)
=== RUN TestSQLStore_Cleanup
sql_store_test.go:198:
Error Trace: /home/coder/go-llm-gateway/internal/conversation/sql_store_test.go:198
Error: Not equal:
expected: 0
actual : 1
Test: TestSQLStore_Cleanup
--- FAIL: TestSQLStore_Cleanup (0.50s)
=== RUN TestSQLStore_ConcurrentAccess
--- PASS: TestSQLStore_ConcurrentAccess (0.00s)
=== RUN TestSQLStore_ContextCancellation
--- PASS: TestSQLStore_ContextCancellation (0.00s)
=== RUN TestSQLStore_JSONEncoding
--- PASS: TestSQLStore_JSONEncoding (0.00s)
=== RUN TestSQLStore_EmptyMessages
--- PASS: TestSQLStore_EmptyMessages (0.00s)
=== RUN TestSQLStore_UpdateExisting
--- PASS: TestSQLStore_UpdateExisting (0.01s)
FAIL
coverage: 66.0% of statements
FAIL github.com/ajac-zero/latticelm/internal/conversation 0.768s
github.com/ajac-zero/latticelm/internal/logger coverage: 0.0% of statements
=== RUN TestInitMetrics
--- PASS: TestInitMetrics (0.00s)
=== RUN TestRecordCircuitBreakerStateChange
=== RUN TestRecordCircuitBreakerStateChange/transition_to_closed
=== RUN TestRecordCircuitBreakerStateChange/transition_to_open
=== RUN TestRecordCircuitBreakerStateChange/transition_to_half-open
=== RUN TestRecordCircuitBreakerStateChange/closed_to_half-open
=== RUN TestRecordCircuitBreakerStateChange/half-open_to_closed
=== RUN TestRecordCircuitBreakerStateChange/half-open_to_open
--- PASS: TestRecordCircuitBreakerStateChange (0.00s)
--- PASS: TestRecordCircuitBreakerStateChange/transition_to_closed (0.00s)
--- PASS: TestRecordCircuitBreakerStateChange/transition_to_open (0.00s)
--- PASS: TestRecordCircuitBreakerStateChange/transition_to_half-open (0.00s)
--- PASS: TestRecordCircuitBreakerStateChange/closed_to_half-open (0.00s)
--- PASS: TestRecordCircuitBreakerStateChange/half-open_to_closed (0.00s)
--- PASS: TestRecordCircuitBreakerStateChange/half-open_to_open (0.00s)
=== RUN TestMetricLabels
=== RUN TestMetricLabels/basic_labels
=== RUN TestMetricLabels/different_labels
=== RUN TestMetricLabels/empty_labels
--- PASS: TestMetricLabels (0.00s)
--- PASS: TestMetricLabels/basic_labels (0.00s)
--- PASS: TestMetricLabels/different_labels (0.00s)
--- PASS: TestMetricLabels/empty_labels (0.00s)
=== RUN TestHTTPMetrics
=== RUN TestHTTPMetrics/GET_request
=== RUN TestHTTPMetrics/POST_request
=== RUN TestHTTPMetrics/error_response
--- PASS: TestHTTPMetrics (0.00s)
--- PASS: TestHTTPMetrics/GET_request (0.00s)
--- PASS: TestHTTPMetrics/POST_request (0.00s)
--- PASS: TestHTTPMetrics/error_response (0.00s)
=== RUN TestProviderMetrics
=== RUN TestProviderMetrics/OpenAI_generate_success
=== RUN TestProviderMetrics/Anthropic_stream_success
=== RUN TestProviderMetrics/Google_generate_error
--- PASS: TestProviderMetrics (0.00s)
--- PASS: TestProviderMetrics/OpenAI_generate_success (0.00s)
--- PASS: TestProviderMetrics/Anthropic_stream_success (0.00s)
--- PASS: TestProviderMetrics/Google_generate_error (0.00s)
=== RUN TestConversationStoreMetrics
=== RUN TestConversationStoreMetrics/create_success
=== RUN TestConversationStoreMetrics/get_success
=== RUN TestConversationStoreMetrics/delete_error
--- PASS: TestConversationStoreMetrics (0.00s)
--- PASS: TestConversationStoreMetrics/create_success (0.00s)
--- PASS: TestConversationStoreMetrics/get_success (0.00s)
--- PASS: TestConversationStoreMetrics/delete_error (0.00s)
=== RUN TestMetricHelp
--- PASS: TestMetricHelp (0.00s)
=== RUN TestMetricTypes
--- PASS: TestMetricTypes (0.00s)
=== RUN TestCircuitBreakerInvalidState
--- PASS: TestCircuitBreakerInvalidState (0.00s)
=== RUN TestMetricNaming
--- PASS: TestMetricNaming (0.00s)
=== RUN TestNewInstrumentedProvider
=== RUN TestNewInstrumentedProvider/with_registry_and_tracer
=== RUN TestNewInstrumentedProvider/with_registry_only
=== RUN TestNewInstrumentedProvider/with_tracer_only
=== RUN TestNewInstrumentedProvider/without_observability
--- PASS: TestNewInstrumentedProvider (0.00s)
--- PASS: TestNewInstrumentedProvider/with_registry_and_tracer (0.00s)
--- PASS: TestNewInstrumentedProvider/with_registry_only (0.00s)
--- PASS: TestNewInstrumentedProvider/with_tracer_only (0.00s)
--- PASS: TestNewInstrumentedProvider/without_observability (0.00s)
=== RUN TestInstrumentedProvider_Generate
=== RUN TestInstrumentedProvider_Generate/successful_generation
=== RUN TestInstrumentedProvider_Generate/generation_error
=== RUN TestInstrumentedProvider_Generate/nil_result
=== RUN TestInstrumentedProvider_Generate/empty_tokens
--- PASS: TestInstrumentedProvider_Generate (0.00s)
--- PASS: TestInstrumentedProvider_Generate/successful_generation (0.00s)
--- PASS: TestInstrumentedProvider_Generate/generation_error (0.00s)
--- PASS: TestInstrumentedProvider_Generate/nil_result (0.00s)
--- PASS: TestInstrumentedProvider_Generate/empty_tokens (0.00s)
=== RUN TestInstrumentedProvider_GenerateStream
=== RUN TestInstrumentedProvider_GenerateStream/successful_streaming
provider_wrapper_test.go:438:
Error Trace: /home/coder/go-llm-gateway/internal/observability/provider_wrapper_test.go:438
Error: Not equal:
expected: 4
actual : 2
Test: TestInstrumentedProvider_GenerateStream/successful_streaming
provider_wrapper_test.go:455:
Error Trace: /home/coder/go-llm-gateway/internal/observability/provider_wrapper_test.go:455
Error: Not equal:
expected: 1
actual : 0
Test: TestInstrumentedProvider_GenerateStream/successful_streaming
Messages: stream request counter should be incremented
=== RUN TestInstrumentedProvider_GenerateStream/streaming_error
provider_wrapper_test.go:455:
Error Trace: /home/coder/go-llm-gateway/internal/observability/provider_wrapper_test.go:455
Error: Not equal:
expected: 1
actual : 0
Test: TestInstrumentedProvider_GenerateStream/streaming_error
Messages: stream request counter should be incremented
=== RUN TestInstrumentedProvider_GenerateStream/empty_stream
provider_wrapper_test.go:455:
Error Trace: /home/coder/go-llm-gateway/internal/observability/provider_wrapper_test.go:455
Error: Not equal:
expected: 1
actual : 0
Test: TestInstrumentedProvider_GenerateStream/empty_stream
Messages: stream request counter should be incremented
--- FAIL: TestInstrumentedProvider_GenerateStream (0.61s)
--- FAIL: TestInstrumentedProvider_GenerateStream/successful_streaming (0.20s)
--- FAIL: TestInstrumentedProvider_GenerateStream/streaming_error (0.20s)
--- FAIL: TestInstrumentedProvider_GenerateStream/empty_stream (0.20s)
=== RUN TestInstrumentedProvider_MetricsRecording
--- PASS: TestInstrumentedProvider_MetricsRecording (0.00s)
=== RUN TestInstrumentedProvider_TracingSpans
--- PASS: TestInstrumentedProvider_TracingSpans (0.00s)
=== RUN TestInstrumentedProvider_WithoutObservability
--- PASS: TestInstrumentedProvider_WithoutObservability (0.00s)
=== RUN TestInstrumentedProvider_Name
=== RUN TestInstrumentedProvider_Name/openai_provider
=== RUN TestInstrumentedProvider_Name/anthropic_provider
=== RUN TestInstrumentedProvider_Name/google_provider
--- PASS: TestInstrumentedProvider_Name (0.00s)
--- PASS: TestInstrumentedProvider_Name/openai_provider (0.00s)
--- PASS: TestInstrumentedProvider_Name/anthropic_provider (0.00s)
--- PASS: TestInstrumentedProvider_Name/google_provider (0.00s)
=== RUN TestInstrumentedProvider_ConcurrentCalls
--- PASS: TestInstrumentedProvider_ConcurrentCalls (0.00s)
=== RUN TestInstrumentedProvider_StreamTTFB
--- PASS: TestInstrumentedProvider_StreamTTFB (0.15s)
=== RUN TestInitTracer_StdoutExporter
=== RUN TestInitTracer_StdoutExporter/stdout_exporter_with_always_sampler
tracing_test.go:74:
Error Trace: /home/coder/go-llm-gateway/internal/observability/tracing_test.go:74
Error: Received unexpected error:
failed to create resource: conflicting Schema URL: https://opentelemetry.io/schemas/1.26.0 and https://opentelemetry.io/schemas/1.24.0
Test: TestInitTracer_StdoutExporter/stdout_exporter_with_always_sampler
=== RUN TestInitTracer_StdoutExporter/stdout_exporter_with_never_sampler
tracing_test.go:74:
Error Trace: /home/coder/go-llm-gateway/internal/observability/tracing_test.go:74
Error: Received unexpected error:
failed to create resource: conflicting Schema URL: https://opentelemetry.io/schemas/1.26.0 and https://opentelemetry.io/schemas/1.24.0
Test: TestInitTracer_StdoutExporter/stdout_exporter_with_never_sampler
=== RUN TestInitTracer_StdoutExporter/stdout_exporter_with_probability_sampler
tracing_test.go:74:
Error Trace: /home/coder/go-llm-gateway/internal/observability/tracing_test.go:74
Error: Received unexpected error:
failed to create resource: conflicting Schema URL: https://opentelemetry.io/schemas/1.26.0 and https://opentelemetry.io/schemas/1.24.0
Test: TestInitTracer_StdoutExporter/stdout_exporter_with_probability_sampler
--- FAIL: TestInitTracer_StdoutExporter (0.00s)
--- FAIL: TestInitTracer_StdoutExporter/stdout_exporter_with_always_sampler (0.00s)
--- FAIL: TestInitTracer_StdoutExporter/stdout_exporter_with_never_sampler (0.00s)
--- FAIL: TestInitTracer_StdoutExporter/stdout_exporter_with_probability_sampler (0.00s)
=== RUN TestInitTracer_InvalidExporter
tracing_test.go:102:
Error Trace: /home/coder/go-llm-gateway/internal/observability/tracing_test.go:102
Error: "failed to create resource: conflicting Schema URL: https://opentelemetry.io/schemas/1.26.0 and https://opentelemetry.io/schemas/1.24.0" does not contain "unsupported exporter type"
Test: TestInitTracer_InvalidExporter
--- FAIL: TestInitTracer_InvalidExporter (0.00s)
=== RUN TestCreateSampler
=== RUN TestCreateSampler/always_sampler
=== RUN TestCreateSampler/never_sampler
=== RUN TestCreateSampler/probability_sampler_-_100%
=== RUN TestCreateSampler/probability_sampler_-_0%
=== RUN TestCreateSampler/probability_sampler_-_50%
=== RUN TestCreateSampler/default_sampler_(invalid_type)
--- PASS: TestCreateSampler (0.00s)
--- PASS: TestCreateSampler/always_sampler (0.00s)
--- PASS: TestCreateSampler/never_sampler (0.00s)
--- PASS: TestCreateSampler/probability_sampler_-_100% (0.00s)
--- PASS: TestCreateSampler/probability_sampler_-_0% (0.00s)
--- PASS: TestCreateSampler/probability_sampler_-_50% (0.00s)
--- PASS: TestCreateSampler/default_sampler_(invalid_type) (0.00s)
=== RUN TestShutdown
=== RUN TestShutdown/shutdown_valid_tracer_provider
=== RUN TestShutdown/shutdown_nil_tracer_provider
--- PASS: TestShutdown (0.00s)
--- PASS: TestShutdown/shutdown_valid_tracer_provider (0.00s)
--- PASS: TestShutdown/shutdown_nil_tracer_provider (0.00s)
=== RUN TestShutdown_ContextTimeout
--- PASS: TestShutdown_ContextTimeout (0.00s)
=== RUN TestTracerConfig_ServiceName
=== RUN TestTracerConfig_ServiceName/default_service_name
=== RUN TestTracerConfig_ServiceName/custom_service_name
=== RUN TestTracerConfig_ServiceName/empty_service_name
--- PASS: TestTracerConfig_ServiceName (0.00s)
--- PASS: TestTracerConfig_ServiceName/default_service_name (0.00s)
--- PASS: TestTracerConfig_ServiceName/custom_service_name (0.00s)
--- PASS: TestTracerConfig_ServiceName/empty_service_name (0.00s)
=== RUN TestCreateSampler_EdgeCases
=== RUN TestCreateSampler_EdgeCases/negative_rate
=== RUN TestCreateSampler_EdgeCases/rate_greater_than_1
=== RUN TestCreateSampler_EdgeCases/empty_type
--- PASS: TestCreateSampler_EdgeCases (0.00s)
--- PASS: TestCreateSampler_EdgeCases/negative_rate (0.00s)
--- PASS: TestCreateSampler_EdgeCases/rate_greater_than_1 (0.00s)
--- PASS: TestCreateSampler_EdgeCases/empty_type (0.00s)
=== RUN TestTracerProvider_MultipleShutdowns
--- PASS: TestTracerProvider_MultipleShutdowns (0.00s)
=== RUN TestSamplerDescription
=== RUN TestSamplerDescription/always_sampler_description
=== RUN TestSamplerDescription/never_sampler_description
=== RUN TestSamplerDescription/probability_sampler_description
--- PASS: TestSamplerDescription (0.00s)
--- PASS: TestSamplerDescription/always_sampler_description (0.00s)
--- PASS: TestSamplerDescription/never_sampler_description (0.00s)
--- PASS: TestSamplerDescription/probability_sampler_description (0.00s)
=== RUN TestInitTracer_ResourceAttributes
--- PASS: TestInitTracer_ResourceAttributes (0.00s)
=== RUN TestProbabilitySampler_Boundaries
=== RUN TestProbabilitySampler_Boundaries/rate_0.0_-_never_sample
=== RUN TestProbabilitySampler_Boundaries/rate_1.0_-_always_sample
=== RUN TestProbabilitySampler_Boundaries/rate_0.5_-_probabilistic
--- PASS: TestProbabilitySampler_Boundaries (0.00s)
--- PASS: TestProbabilitySampler_Boundaries/rate_0.0_-_never_sample (0.00s)
--- PASS: TestProbabilitySampler_Boundaries/rate_1.0_-_always_sample (0.00s)
--- PASS: TestProbabilitySampler_Boundaries/rate_0.5_-_probabilistic (0.00s)
FAIL
coverage: 35.1% of statements
FAIL github.com/ajac-zero/latticelm/internal/observability 0.783s
=== RUN TestNewRegistry
=== RUN TestNewRegistry/valid_config_with_OpenAI
=== RUN TestNewRegistry/valid_config_with_multiple_providers
=== RUN TestNewRegistry/no_providers_returns_error
=== RUN TestNewRegistry/Azure_OpenAI_without_endpoint_returns_error
=== RUN TestNewRegistry/Azure_OpenAI_with_endpoint_succeeds
=== RUN TestNewRegistry/Azure_Anthropic_without_endpoint_returns_error
=== RUN TestNewRegistry/Azure_Anthropic_with_endpoint_succeeds
=== RUN TestNewRegistry/Google_provider
=== RUN TestNewRegistry/Vertex_AI_without_project/location_returns_error
=== RUN TestNewRegistry/Vertex_AI_with_project_and_location_succeeds
=== RUN TestNewRegistry/unknown_provider_type_returns_error
=== RUN TestNewRegistry/provider_with_no_API_key_is_skipped
=== RUN TestNewRegistry/model_with_provider_model_id
--- PASS: TestNewRegistry (0.00s)
--- PASS: TestNewRegistry/valid_config_with_OpenAI (0.00s)
--- PASS: TestNewRegistry/valid_config_with_multiple_providers (0.00s)
--- PASS: TestNewRegistry/no_providers_returns_error (0.00s)
--- PASS: TestNewRegistry/Azure_OpenAI_without_endpoint_returns_error (0.00s)
--- PASS: TestNewRegistry/Azure_OpenAI_with_endpoint_succeeds (0.00s)
--- PASS: TestNewRegistry/Azure_Anthropic_without_endpoint_returns_error (0.00s)
--- PASS: TestNewRegistry/Azure_Anthropic_with_endpoint_succeeds (0.00s)
--- PASS: TestNewRegistry/Google_provider (0.00s)
--- PASS: TestNewRegistry/Vertex_AI_without_project/location_returns_error (0.00s)
--- PASS: TestNewRegistry/Vertex_AI_with_project_and_location_succeeds (0.00s)
--- PASS: TestNewRegistry/unknown_provider_type_returns_error (0.00s)
--- PASS: TestNewRegistry/provider_with_no_API_key_is_skipped (0.00s)
--- PASS: TestNewRegistry/model_with_provider_model_id (0.00s)
=== RUN TestRegistry_Get
=== RUN TestRegistry_Get/existing_provider
=== RUN TestRegistry_Get/another_existing_provider
=== RUN TestRegistry_Get/nonexistent_provider
--- PASS: TestRegistry_Get (0.00s)
--- PASS: TestRegistry_Get/existing_provider (0.00s)
--- PASS: TestRegistry_Get/another_existing_provider (0.00s)
--- PASS: TestRegistry_Get/nonexistent_provider (0.00s)
=== RUN TestRegistry_Models
=== RUN TestRegistry_Models/single_model
=== RUN TestRegistry_Models/multiple_models
=== RUN TestRegistry_Models/no_models
--- PASS: TestRegistry_Models (0.00s)
--- PASS: TestRegistry_Models/single_model (0.00s)
--- PASS: TestRegistry_Models/multiple_models (0.00s)
--- PASS: TestRegistry_Models/no_models (0.00s)
=== RUN TestRegistry_ResolveModelID
=== RUN TestRegistry_ResolveModelID/model_without_provider_model_id_returns_model_name
=== RUN TestRegistry_ResolveModelID/model_with_provider_model_id_returns_provider_model_id
=== RUN TestRegistry_ResolveModelID/unknown_model_returns_model_name
--- PASS: TestRegistry_ResolveModelID (0.00s)
--- PASS: TestRegistry_ResolveModelID/model_without_provider_model_id_returns_model_name (0.00s)
--- PASS: TestRegistry_ResolveModelID/model_with_provider_model_id_returns_provider_model_id (0.00s)
--- PASS: TestRegistry_ResolveModelID/unknown_model_returns_model_name (0.00s)
=== RUN TestRegistry_Default
=== RUN TestRegistry_Default/returns_provider_for_known_model
=== RUN TestRegistry_Default/returns_first_provider_for_unknown_model
=== RUN TestRegistry_Default/returns_first_provider_for_empty_model_name
--- PASS: TestRegistry_Default (0.00s)
--- PASS: TestRegistry_Default/returns_provider_for_known_model (0.00s)
--- PASS: TestRegistry_Default/returns_first_provider_for_unknown_model (0.00s)
--- PASS: TestRegistry_Default/returns_first_provider_for_empty_model_name (0.00s)
=== RUN TestBuildProvider
=== RUN TestBuildProvider/OpenAI_provider
=== RUN TestBuildProvider/OpenAI_provider_with_custom_endpoint
=== RUN TestBuildProvider/Anthropic_provider
=== RUN TestBuildProvider/Google_provider
=== RUN TestBuildProvider/provider_without_API_key_returns_nil
=== RUN TestBuildProvider/unknown_provider_type
--- PASS: TestBuildProvider (0.00s)
--- PASS: TestBuildProvider/OpenAI_provider (0.00s)
--- PASS: TestBuildProvider/OpenAI_provider_with_custom_endpoint (0.00s)
--- PASS: TestBuildProvider/Anthropic_provider (0.00s)
--- PASS: TestBuildProvider/Google_provider (0.00s)
--- PASS: TestBuildProvider/provider_without_API_key_returns_nil (0.00s)
--- PASS: TestBuildProvider/unknown_provider_type (0.00s)
PASS
coverage: 63.1% of statements
ok github.com/ajac-zero/latticelm/internal/providers 0.035s coverage: 63.1% of statements
=== RUN TestParseTools
--- PASS: TestParseTools (0.00s)
=== RUN TestParseToolChoice
=== RUN TestParseToolChoice/auto
=== RUN TestParseToolChoice/any
=== RUN TestParseToolChoice/required
=== RUN TestParseToolChoice/specific_tool
--- PASS: TestParseToolChoice (0.00s)
--- PASS: TestParseToolChoice/auto (0.00s)
--- PASS: TestParseToolChoice/any (0.00s)
--- PASS: TestParseToolChoice/required (0.00s)
--- PASS: TestParseToolChoice/specific_tool (0.00s)
PASS
coverage: 16.2% of statements
ok github.com/ajac-zero/latticelm/internal/providers/anthropic 0.016s coverage: 16.2% of statements
=== RUN TestParseTools
=== RUN TestParseTools/flat_format_tool
=== RUN TestParseTools/nested_format_tool
=== RUN TestParseTools/multiple_tools
=== RUN TestParseTools/tool_without_description
=== RUN TestParseTools/tool_without_parameters
=== RUN TestParseTools/tool_without_name_(should_skip)
=== RUN TestParseTools/nil_tools
=== RUN TestParseTools/invalid_JSON
=== RUN TestParseTools/empty_array
--- PASS: TestParseTools (0.00s)
--- PASS: TestParseTools/flat_format_tool (0.00s)
--- PASS: TestParseTools/nested_format_tool (0.00s)
--- PASS: TestParseTools/multiple_tools (0.00s)
--- PASS: TestParseTools/tool_without_description (0.00s)
--- PASS: TestParseTools/tool_without_parameters (0.00s)
--- PASS: TestParseTools/tool_without_name_(should_skip) (0.00s)
--- PASS: TestParseTools/nil_tools (0.00s)
--- PASS: TestParseTools/invalid_JSON (0.00s)
--- PASS: TestParseTools/empty_array (0.00s)
=== RUN TestParseToolChoice
=== RUN TestParseToolChoice/auto_mode
=== RUN TestParseToolChoice/none_mode
=== RUN TestParseToolChoice/required_mode
=== RUN TestParseToolChoice/any_mode
=== RUN TestParseToolChoice/specific_function
=== RUN TestParseToolChoice/nil_tool_choice
=== RUN TestParseToolChoice/unknown_string_mode
=== RUN TestParseToolChoice/invalid_JSON
=== RUN TestParseToolChoice/unsupported_object_format
--- PASS: TestParseToolChoice (0.00s)
--- PASS: TestParseToolChoice/auto_mode (0.00s)
--- PASS: TestParseToolChoice/none_mode (0.00s)
--- PASS: TestParseToolChoice/required_mode (0.00s)
--- PASS: TestParseToolChoice/any_mode (0.00s)
--- PASS: TestParseToolChoice/specific_function (0.00s)
--- PASS: TestParseToolChoice/nil_tool_choice (0.00s)
--- PASS: TestParseToolChoice/unknown_string_mode (0.00s)
--- PASS: TestParseToolChoice/invalid_JSON (0.00s)
--- PASS: TestParseToolChoice/unsupported_object_format (0.00s)
=== RUN TestExtractToolCalls
=== RUN TestExtractToolCalls/single_tool_call
=== RUN TestExtractToolCalls/tool_call_without_ID_generates_one
=== RUN TestExtractToolCalls/response_with_nil_candidates
=== RUN TestExtractToolCalls/empty_candidates
--- PASS: TestExtractToolCalls (0.00s)
--- PASS: TestExtractToolCalls/single_tool_call (0.00s)
--- PASS: TestExtractToolCalls/tool_call_without_ID_generates_one (0.00s)
--- PASS: TestExtractToolCalls/response_with_nil_candidates (0.00s)
--- PASS: TestExtractToolCalls/empty_candidates (0.00s)
=== RUN TestGenerateRandomID
=== RUN TestGenerateRandomID/generates_non-empty_ID
=== RUN TestGenerateRandomID/generates_unique_IDs
=== RUN TestGenerateRandomID/only_contains_valid_characters
--- PASS: TestGenerateRandomID (0.00s)
--- PASS: TestGenerateRandomID/generates_non-empty_ID (0.00s)
--- PASS: TestGenerateRandomID/generates_unique_IDs (0.00s)
--- PASS: TestGenerateRandomID/only_contains_valid_characters (0.00s)
PASS
coverage: 27.7% of statements
ok github.com/ajac-zero/latticelm/internal/providers/google 0.017s coverage: 27.7% of statements
=== RUN TestParseTools
=== RUN TestParseTools/single_tool_with_all_fields
=== RUN TestParseTools/multiple_tools
=== RUN TestParseTools/tool_without_description
=== RUN TestParseTools/tool_without_parameters
=== RUN TestParseTools/nil_tools
=== RUN TestParseTools/invalid_JSON
=== RUN TestParseTools/empty_array
--- PASS: TestParseTools (0.00s)
--- PASS: TestParseTools/single_tool_with_all_fields (0.00s)
--- PASS: TestParseTools/multiple_tools (0.00s)
--- PASS: TestParseTools/tool_without_description (0.00s)
--- PASS: TestParseTools/tool_without_parameters (0.00s)
--- PASS: TestParseTools/nil_tools (0.00s)
--- PASS: TestParseTools/invalid_JSON (0.00s)
--- PASS: TestParseTools/empty_array (0.00s)
=== RUN TestParseToolChoice
=== RUN TestParseToolChoice/auto_string
=== RUN TestParseToolChoice/none_string
=== RUN TestParseToolChoice/required_string
=== RUN TestParseToolChoice/specific_function
=== RUN TestParseToolChoice/nil_tool_choice
=== RUN TestParseToolChoice/invalid_JSON
=== RUN TestParseToolChoice/unsupported_format_(object_without_proper_structure)
--- PASS: TestParseToolChoice (0.00s)
--- PASS: TestParseToolChoice/auto_string (0.00s)
--- PASS: TestParseToolChoice/none_string (0.00s)
--- PASS: TestParseToolChoice/required_string (0.00s)
--- PASS: TestParseToolChoice/specific_function (0.00s)
--- PASS: TestParseToolChoice/nil_tool_choice (0.00s)
--- PASS: TestParseToolChoice/invalid_JSON (0.00s)
--- PASS: TestParseToolChoice/unsupported_format_(object_without_proper_structure) (0.00s)
=== RUN TestExtractToolCalls
=== RUN TestExtractToolCalls/nil_message_returns_nil
--- PASS: TestExtractToolCalls (0.00s)
--- PASS: TestExtractToolCalls/nil_message_returns_nil (0.00s)
=== RUN TestExtractToolCallDelta
=== RUN TestExtractToolCallDelta/empty_delta_returns_nil
--- PASS: TestExtractToolCallDelta (0.00s)
--- PASS: TestExtractToolCallDelta/empty_delta_returns_nil (0.00s)
PASS
coverage: 16.1% of statements
ok github.com/ajac-zero/latticelm/internal/providers/openai 0.024s coverage: 16.1% of statements
=== RUN TestRateLimitMiddleware
=== RUN TestRateLimitMiddleware/disabled_rate_limiting_allows_all_requests
=== RUN TestRateLimitMiddleware/enabled_rate_limiting_enforces_limits
time=2026-03-05T17:59:57.097Z level=WARN msg="rate limit exceeded" ip=192.168.1.1:1234 path=/test
time=2026-03-05T17:59:57.097Z level=WARN msg="rate limit exceeded" ip=192.168.1.1:1234 path=/test
time=2026-03-05T17:59:57.097Z level=WARN msg="rate limit exceeded" ip=192.168.1.1:1234 path=/test
--- PASS: TestRateLimitMiddleware (0.00s)
--- PASS: TestRateLimitMiddleware/disabled_rate_limiting_allows_all_requests (0.00s)
--- PASS: TestRateLimitMiddleware/enabled_rate_limiting_enforces_limits (0.00s)
=== RUN TestGetClientIP
=== RUN TestGetClientIP/uses_X-Forwarded-For_if_present
=== RUN TestGetClientIP/uses_X-Real-IP_if_X-Forwarded-For_not_present
=== RUN TestGetClientIP/uses_RemoteAddr_as_fallback
--- PASS: TestGetClientIP (0.00s)
--- PASS: TestGetClientIP/uses_X-Forwarded-For_if_present (0.00s)
--- PASS: TestGetClientIP/uses_X-Real-IP_if_X-Forwarded-For_not_present (0.00s)
--- PASS: TestGetClientIP/uses_RemoteAddr_as_fallback (0.00s)
=== RUN TestRateLimitRefill
time=2026-03-05T17:59:57.097Z level=WARN msg="rate limit exceeded" ip=192.168.1.1:1234 path=/test
--- PASS: TestRateLimitRefill (0.15s)
PASS
coverage: 87.2% of statements
ok github.com/ajac-zero/latticelm/internal/ratelimit 0.160s coverage: 87.2% of statements
=== RUN TestHealthEndpoint
=== RUN TestHealthEndpoint/GET_returns_healthy_status
=== RUN TestHealthEndpoint/POST_returns_method_not_allowed
--- PASS: TestHealthEndpoint (0.00s)
--- PASS: TestHealthEndpoint/GET_returns_healthy_status (0.00s)
--- PASS: TestHealthEndpoint/POST_returns_method_not_allowed (0.00s)
=== RUN TestReadyEndpoint
=== RUN TestReadyEndpoint/returns_ready_when_all_checks_pass
=== RUN TestReadyEndpoint/returns_not_ready_when_no_providers_configured
--- PASS: TestReadyEndpoint (0.00s)
--- PASS: TestReadyEndpoint/returns_ready_when_all_checks_pass (0.00s)
--- PASS: TestReadyEndpoint/returns_not_ready_when_no_providers_configured (0.00s)
=== RUN TestReadyEndpointMethodNotAllowed
--- PASS: TestReadyEndpointMethodNotAllowed (0.00s)
=== RUN TestPanicRecoveryMiddleware
=== RUN TestPanicRecoveryMiddleware/no_panic_-_request_succeeds
=== RUN TestPanicRecoveryMiddleware/panic_with_string_-_recovers_gracefully
=== RUN TestPanicRecoveryMiddleware/panic_with_error_-_recovers_gracefully
=== RUN TestPanicRecoveryMiddleware/panic_with_struct_-_recovers_gracefully
--- PASS: TestPanicRecoveryMiddleware (0.00s)
--- PASS: TestPanicRecoveryMiddleware/no_panic_-_request_succeeds (0.00s)
--- PASS: TestPanicRecoveryMiddleware/panic_with_string_-_recovers_gracefully (0.00s)
--- PASS: TestPanicRecoveryMiddleware/panic_with_error_-_recovers_gracefully (0.00s)
--- PASS: TestPanicRecoveryMiddleware/panic_with_struct_-_recovers_gracefully (0.00s)
=== RUN TestRequestSizeLimitMiddleware
=== RUN TestRequestSizeLimitMiddleware/small_POST_request_-_succeeds
=== RUN TestRequestSizeLimitMiddleware/exact_size_POST_request_-_succeeds
=== RUN TestRequestSizeLimitMiddleware/oversized_POST_request_-_fails
=== RUN TestRequestSizeLimitMiddleware/large_POST_request_-_fails
=== RUN TestRequestSizeLimitMiddleware/oversized_PUT_request_-_fails
=== RUN TestRequestSizeLimitMiddleware/oversized_PATCH_request_-_fails
=== RUN TestRequestSizeLimitMiddleware/GET_request_-_no_size_limit_applied
=== RUN TestRequestSizeLimitMiddleware/DELETE_request_-_no_size_limit_applied
--- PASS: TestRequestSizeLimitMiddleware (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/small_POST_request_-_succeeds (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/exact_size_POST_request_-_succeeds (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/oversized_POST_request_-_fails (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/large_POST_request_-_fails (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/oversized_PUT_request_-_fails (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/oversized_PATCH_request_-_fails (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/GET_request_-_no_size_limit_applied (0.00s)
--- PASS: TestRequestSizeLimitMiddleware/DELETE_request_-_no_size_limit_applied (0.00s)
=== RUN TestRequestSizeLimitMiddleware_WithJSONDecoding
=== RUN TestRequestSizeLimitMiddleware_WithJSONDecoding/small_JSON_payload_-_succeeds
=== RUN TestRequestSizeLimitMiddleware_WithJSONDecoding/large_JSON_payload_-_fails
--- PASS: TestRequestSizeLimitMiddleware_WithJSONDecoding (0.00s)
--- PASS: TestRequestSizeLimitMiddleware_WithJSONDecoding/small_JSON_payload_-_succeeds (0.00s)
--- PASS: TestRequestSizeLimitMiddleware_WithJSONDecoding/large_JSON_payload_-_fails (0.00s)
=== RUN TestWriteJSONError
=== RUN TestWriteJSONError/simple_error_message
=== RUN TestWriteJSONError/internal_server_error
=== RUN TestWriteJSONError/unauthorized_error
--- PASS: TestWriteJSONError (0.00s)
--- PASS: TestWriteJSONError/simple_error_message (0.00s)
--- PASS: TestWriteJSONError/internal_server_error (0.00s)
--- PASS: TestWriteJSONError/unauthorized_error (0.00s)
=== RUN TestPanicRecoveryMiddleware_Integration
--- PASS: TestPanicRecoveryMiddleware_Integration (0.00s)
=== RUN TestHandleModels
=== RUN TestHandleModels/GET_returns_model_list
=== RUN TestHandleModels/POST_returns_405
=== RUN TestHandleModels/empty_registry_returns_empty_list
--- PASS: TestHandleModels (0.00s)
--- PASS: TestHandleModels/GET_returns_model_list (0.00s)
--- PASS: TestHandleModels/POST_returns_405 (0.00s)
--- PASS: TestHandleModels/empty_registry_returns_empty_list (0.00s)
=== RUN TestHandleResponses_Validation
=== RUN TestHandleResponses_Validation/GET_returns_405
=== RUN TestHandleResponses_Validation/invalid_JSON_returns_400
=== RUN TestHandleResponses_Validation/missing_model_returns_400
=== RUN TestHandleResponses_Validation/missing_input_returns_400
--- PASS: TestHandleResponses_Validation (0.00s)
--- PASS: TestHandleResponses_Validation/GET_returns_405 (0.00s)
--- PASS: TestHandleResponses_Validation/invalid_JSON_returns_400 (0.00s)
--- PASS: TestHandleResponses_Validation/missing_model_returns_400 (0.00s)
--- PASS: TestHandleResponses_Validation/missing_input_returns_400 (0.00s)
=== RUN TestHandleResponses_Sync_Success
=== RUN TestHandleResponses_Sync_Success/simple_text_response
=== RUN TestHandleResponses_Sync_Success/response_with_tool_calls
=== RUN TestHandleResponses_Sync_Success/response_with_multiple_tool_calls
=== RUN TestHandleResponses_Sync_Success/response_with_only_tool_calls_(no_text)
=== RUN TestHandleResponses_Sync_Success/response_echoes_request_parameters
--- PASS: TestHandleResponses_Sync_Success (0.00s)
--- PASS: TestHandleResponses_Sync_Success/simple_text_response (0.00s)
--- PASS: TestHandleResponses_Sync_Success/response_with_tool_calls (0.00s)
--- PASS: TestHandleResponses_Sync_Success/response_with_multiple_tool_calls (0.00s)
--- PASS: TestHandleResponses_Sync_Success/response_with_only_tool_calls_(no_text) (0.00s)
--- PASS: TestHandleResponses_Sync_Success/response_echoes_request_parameters (0.00s)
=== RUN TestHandleResponses_Sync_ConversationHistory
=== RUN TestHandleResponses_Sync_ConversationHistory/without_previous_response_id
=== RUN TestHandleResponses_Sync_ConversationHistory/with_valid_previous_response_id
=== RUN TestHandleResponses_Sync_ConversationHistory/with_instructions_prepends_developer_message
=== RUN TestHandleResponses_Sync_ConversationHistory/nonexistent_conversation_returns_404
=== RUN TestHandleResponses_Sync_ConversationHistory/conversation_store_error_returns_500
--- PASS: TestHandleResponses_Sync_ConversationHistory (0.00s)
--- PASS: TestHandleResponses_Sync_ConversationHistory/without_previous_response_id (0.00s)
--- PASS: TestHandleResponses_Sync_ConversationHistory/with_valid_previous_response_id (0.00s)
--- PASS: TestHandleResponses_Sync_ConversationHistory/with_instructions_prepends_developer_message (0.00s)
--- PASS: TestHandleResponses_Sync_ConversationHistory/nonexistent_conversation_returns_404 (0.00s)
--- PASS: TestHandleResponses_Sync_ConversationHistory/conversation_store_error_returns_500 (0.00s)
=== RUN TestHandleResponses_Sync_ProviderErrors
=== RUN TestHandleResponses_Sync_ProviderErrors/provider_returns_error
=== RUN TestHandleResponses_Sync_ProviderErrors/provider_not_configured
--- PASS: TestHandleResponses_Sync_ProviderErrors (0.00s)
--- PASS: TestHandleResponses_Sync_ProviderErrors/provider_returns_error (0.00s)
--- PASS: TestHandleResponses_Sync_ProviderErrors/provider_not_configured (0.00s)
=== RUN TestHandleResponses_Stream_Success
=== RUN TestHandleResponses_Stream_Success/simple_text_streaming
=== RUN TestHandleResponses_Stream_Success/streaming_with_tool_calls
=== RUN TestHandleResponses_Stream_Success/streaming_with_multiple_tool_calls
--- PASS: TestHandleResponses_Stream_Success (0.00s)
--- PASS: TestHandleResponses_Stream_Success/simple_text_streaming (0.00s)
--- PASS: TestHandleResponses_Stream_Success/streaming_with_tool_calls (0.00s)
--- PASS: TestHandleResponses_Stream_Success/streaming_with_multiple_tool_calls (0.00s)
=== RUN TestHandleResponses_Stream_Errors
=== RUN TestHandleResponses_Stream_Errors/stream_error_returns_failed_event
--- PASS: TestHandleResponses_Stream_Errors (0.00s)
--- PASS: TestHandleResponses_Stream_Errors/stream_error_returns_failed_event (0.00s)
=== RUN TestResolveProvider
=== RUN TestResolveProvider/explicit_provider_selection
=== RUN TestResolveProvider/default_by_model_name
=== RUN TestResolveProvider/provider_not_found_returns_error
--- PASS: TestResolveProvider (0.00s)
--- PASS: TestResolveProvider/explicit_provider_selection (0.00s)
--- PASS: TestResolveProvider/default_by_model_name (0.00s)
--- PASS: TestResolveProvider/provider_not_found_returns_error (0.00s)
=== RUN TestGenerateID
=== RUN TestGenerateID/resp__prefix
=== RUN TestGenerateID/msg__prefix
=== RUN TestGenerateID/item__prefix
--- PASS: TestGenerateID (0.00s)
--- PASS: TestGenerateID/resp__prefix (0.00s)
--- PASS: TestGenerateID/msg__prefix (0.00s)
--- PASS: TestGenerateID/item__prefix (0.00s)
=== RUN TestBuildResponse
=== RUN TestBuildResponse/minimal_response_structure
=== RUN TestBuildResponse/response_with_tool_calls
=== RUN TestBuildResponse/parameter_echoing_with_defaults
=== RUN TestBuildResponse/parameter_echoing_with_custom_values
=== RUN TestBuildResponse/usage_included_when_text_present
=== RUN TestBuildResponse/no_usage_when_no_text
=== RUN TestBuildResponse/instructions_prepended
=== RUN TestBuildResponse/previous_response_id_included
--- PASS: TestBuildResponse (0.00s)
--- PASS: TestBuildResponse/minimal_response_structure (0.00s)
--- PASS: TestBuildResponse/response_with_tool_calls (0.00s)
--- PASS: TestBuildResponse/parameter_echoing_with_defaults (0.00s)
--- PASS: TestBuildResponse/parameter_echoing_with_custom_values (0.00s)
--- PASS: TestBuildResponse/usage_included_when_text_present (0.00s)
--- PASS: TestBuildResponse/no_usage_when_no_text (0.00s)
--- PASS: TestBuildResponse/instructions_prepended (0.00s)
--- PASS: TestBuildResponse/previous_response_id_included (0.00s)
=== RUN TestSendSSE
--- PASS: TestSendSSE (0.00s)
PASS
coverage: 90.8% of statements
ok github.com/ajac-zero/latticelm/internal/server 0.018s coverage: 90.8% of statements
FAIL