first commit
This commit is contained in:
132
core/providers/huggingface/chat_test.go
Normal file
132
core/providers/huggingface/chat_test.go
Normal file
@@ -0,0 +1,132 @@
|
||||
package huggingface
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
schemas "github.com/maximhq/bifrost/core/schemas"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestToHuggingFaceChatCompletionRequest_ResponseFormat(t *testing.T) {
|
||||
makeReq := func(rf *interface{}) *schemas.BifrostChatRequest {
|
||||
return &schemas.BifrostChatRequest{
|
||||
Model: "test-model",
|
||||
Input: []schemas.ChatMessage{{Role: schemas.ChatMessageRoleUser, Content: &schemas.ChatMessageContent{ContentStr: schemas.Ptr("hello")}}},
|
||||
Params: &schemas.ChatParameters{
|
||||
ResponseFormat: rf,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
responseFormat *interface{}
|
||||
wantErr bool
|
||||
validate func(t *testing.T, result *HuggingFaceChatRequest)
|
||||
}{
|
||||
{
|
||||
name: "nil_response_format",
|
||||
responseFormat: nil,
|
||||
validate: func(t *testing.T, result *HuggingFaceChatRequest) {
|
||||
assert.Nil(t, result.ResponseFormat)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "map_type_only",
|
||||
responseFormat: func() *interface{} {
|
||||
var rf interface{} = map[string]interface{}{"type": "json_object"}
|
||||
return &rf
|
||||
}(),
|
||||
validate: func(t *testing.T, result *HuggingFaceChatRequest) {
|
||||
require.NotNil(t, result.ResponseFormat)
|
||||
assert.Equal(t, "json_object", result.ResponseFormat.Type)
|
||||
assert.Nil(t, result.ResponseFormat.JSONSchema)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "map_with_json_schema",
|
||||
responseFormat: func() *interface{} {
|
||||
var rf interface{} = map[string]interface{}{
|
||||
"type": "json_schema",
|
||||
"json_schema": map[string]interface{}{
|
||||
"name": "my_schema",
|
||||
"description": "A test schema",
|
||||
"strict": true,
|
||||
"schema": map[string]interface{}{
|
||||
"type": "object",
|
||||
"properties": map[string]interface{}{
|
||||
"answer": map[string]interface{}{"type": "string"},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
return &rf
|
||||
}(),
|
||||
validate: func(t *testing.T, result *HuggingFaceChatRequest) {
|
||||
require.NotNil(t, result.ResponseFormat)
|
||||
assert.Equal(t, "json_schema", result.ResponseFormat.Type)
|
||||
require.NotNil(t, result.ResponseFormat.JSONSchema)
|
||||
assert.Equal(t, "my_schema", result.ResponseFormat.JSONSchema.Name)
|
||||
assert.Equal(t, "A test schema", result.ResponseFormat.JSONSchema.Description)
|
||||
require.NotNil(t, result.ResponseFormat.JSONSchema.Strict)
|
||||
assert.True(t, *result.ResponseFormat.JSONSchema.Strict)
|
||||
require.NotNil(t, result.ResponseFormat.JSONSchema.Schema)
|
||||
// Verify schema content round-tripped correctly
|
||||
var schemaMap map[string]interface{}
|
||||
err := json.Unmarshal(result.ResponseFormat.JSONSchema.Schema, &schemaMap)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "object", schemaMap["type"])
|
||||
props, ok := schemaMap["properties"].(map[string]interface{})
|
||||
require.True(t, ok)
|
||||
assert.Contains(t, props, "answer")
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "struct_fallback_via_convert",
|
||||
responseFormat: func() *interface{} {
|
||||
var rf interface{} = HuggingFaceResponseFormat{
|
||||
Type: "json_schema",
|
||||
JSONSchema: &HuggingFaceJSONSchema{
|
||||
Name: "fallback_schema",
|
||||
Strict: schemas.Ptr(true),
|
||||
},
|
||||
}
|
||||
return &rf
|
||||
}(),
|
||||
validate: func(t *testing.T, result *HuggingFaceChatRequest) {
|
||||
require.NotNil(t, result.ResponseFormat, "ResponseFormat should not be nil — ConvertViaJSON fallback must handle struct values")
|
||||
assert.Equal(t, "json_schema", result.ResponseFormat.Type)
|
||||
require.NotNil(t, result.ResponseFormat.JSONSchema)
|
||||
assert.Equal(t, "fallback_schema", result.ResponseFormat.JSONSchema.Name)
|
||||
require.NotNil(t, result.ResponseFormat.JSONSchema.Strict)
|
||||
assert.True(t, *result.ResponseFormat.JSONSchema.Strict)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "inconvertible_value_graceful_nil",
|
||||
responseFormat: func() *interface{} {
|
||||
var rf interface{} = 42
|
||||
return &rf
|
||||
}(),
|
||||
validate: func(t *testing.T, result *HuggingFaceChatRequest) {
|
||||
assert.Nil(t, result.ResponseFormat, "inconvertible value should gracefully result in nil ResponseFormat")
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
req := makeReq(tt.responseFormat)
|
||||
result, err := ToHuggingFaceChatCompletionRequest(req)
|
||||
if tt.wantErr {
|
||||
require.Error(t, err)
|
||||
return
|
||||
}
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, result)
|
||||
tt.validate(t, result)
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user