openai_codex_models_pinned_test.go 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. //go:build unit
  2. package service
  3. import (
  4. "encoding/json"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestMergeCodexModelsManifestBodiesUnionAndOrder(t *testing.T) {
  9. first := `{"object":"codex.manifest","models":[{"slug":"model-a","display_name":"A from first"},{"slug":"model-b"}]}`
  10. second := `{"object":"codex.manifest","models":[{"slug":"model-a","display_name":"A from second"},{"slug":"model-c"}]}`
  11. merged, err := mergeCodexModelsManifestBodies([][]byte{[]byte(first), []byte(second)})
  12. require.NoError(t, err)
  13. var envelope map[string]json.RawMessage
  14. require.NoError(t, json.Unmarshal(merged, &envelope))
  15. var objectField string
  16. require.NoError(t, json.Unmarshal(envelope["object"], &objectField))
  17. require.Equal(t, "codex.manifest", objectField)
  18. var models []map[string]any
  19. require.NoError(t, json.Unmarshal(envelope["models"], &models))
  20. require.Len(t, models, 3)
  21. require.Equal(t, "model-a", models[0]["slug"])
  22. require.Equal(t, "A from first", models[0]["display_name"], "重复 slug 必须取配置顺序靠前账号的条目")
  23. require.Equal(t, "model-b", models[1]["slug"])
  24. require.Equal(t, "model-c", models[2]["slug"])
  25. }
  26. func TestMergeCodexModelsManifestBodiesEnvelopeFromFirstBody(t *testing.T) {
  27. first := `{"object":"codex.manifest","extra_field":"from-first","models":[{"slug":"model-a"}]}`
  28. second := `{"object":"other","extra_field":"from-second","another":"only-in-second","models":[]}`
  29. merged, err := mergeCodexModelsManifestBodies([][]byte{[]byte(first), []byte(second)})
  30. require.NoError(t, err)
  31. var envelope map[string]any
  32. require.NoError(t, json.Unmarshal(merged, &envelope))
  33. require.Equal(t, "codex.manifest", envelope["object"])
  34. require.Equal(t, "from-first", envelope["extra_field"], "顶层字段以第一个信封为基底")
  35. require.NotContains(t, envelope, "another")
  36. }
  37. func TestMergeCodexModelsManifestBodiesHandlesSluglessEntries(t *testing.T) {
  38. first := `{"models":[{"slug":"model-a"},{"display_name":"no slug one"}]}`
  39. second := `{"models":[{"display_name":"no slug one"},{"display_name":"no slug two"},{"slug":"model-a"}]}`
  40. merged, err := mergeCodexModelsManifestBodies([][]byte{[]byte(first), []byte(second)})
  41. require.NoError(t, err)
  42. var envelope struct {
  43. Models []map[string]any `json:"models"`
  44. }
  45. require.NoError(t, json.Unmarshal(merged, &envelope))
  46. require.Len(t, envelope.Models, 3)
  47. require.Equal(t, "model-a", envelope.Models[0]["slug"])
  48. require.Equal(t, "no slug one", envelope.Models[1]["display_name"], "无 slug 条目按出现顺序保留一次")
  49. require.Equal(t, "no slug two", envelope.Models[2]["display_name"])
  50. }
  51. func TestMergeCodexModelsManifestBodiesSingleBody(t *testing.T) {
  52. body := `{"models":[{"slug":"model-a"}]}`
  53. merged, err := mergeCodexModelsManifestBodies([][]byte{[]byte(body)})
  54. require.NoError(t, err)
  55. require.JSONEq(t, body, string(merged))
  56. }
  57. func TestMergeCodexModelsManifestBodiesRejectsInvalidInput(t *testing.T) {
  58. _, err := mergeCodexModelsManifestBodies(nil)
  59. require.Error(t, err)
  60. _, err = mergeCodexModelsManifestBodies([][]byte{[]byte(`{`)})
  61. require.Error(t, err)
  62. _, err = mergeCodexModelsManifestBodies([][]byte{[]byte(`{}`), []byte(`{"models":{}`)})
  63. require.Error(t, err, "models 非数组必须报错")
  64. }