package common import ( "encoding/json" "reflect" "testing" "github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/setting/model_setting" ) func TestApplyParamOverrideTrimPrefix(t *testing.T) { // trim_prefix example: // {"operations":[{"path":"model","mode":"trim_prefix","value":"openai/"}]} input := []byte(`{"model":"openai/gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "trim_prefix", "value": "openai/", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.7}`, string(out)) } func TestApplyParamOverrideTrimSuffix(t *testing.T) { // trim_suffix example: // {"operations":[{"path":"model","mode":"trim_suffix","value":"-latest"}]} input := []byte(`{"model":"gpt-4-latest","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "trim_suffix", "value": "-latest", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.7}`, string(out)) } func TestApplyParamOverrideTrimNoop(t *testing.T) { // trim_prefix no-op example: // {"operations":[{"path":"model","mode":"trim_prefix","value":"openai/"}]} input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "trim_prefix", "value": "openai/", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.7}`, string(out)) } func TestApplyParamOverrideTrimRequiresValue(t *testing.T) { // trim_prefix requires value example: // {"operations":[{"path":"model","mode":"trim_prefix"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "trim_prefix", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideReplace(t *testing.T) { // replace example: // {"operations":[{"path":"model","mode":"replace","from":"openai/","to":""}]} input := []byte(`{"model":"openai/gpt-4o-mini","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "replace", "from": "openai/", "to": "", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4o-mini","temperature":0.7}`, string(out)) } func TestApplyParamOverrideRegexReplace(t *testing.T) { // regex_replace example: // {"operations":[{"path":"model","mode":"regex_replace","from":"^gpt-","to":"openai/gpt-"}]} input := []byte(`{"model":"gpt-4o-mini","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "regex_replace", "from": "^gpt-", "to": "openai/gpt-", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"openai/gpt-4o-mini","temperature":0.7}`, string(out)) } func TestApplyParamOverrideReplaceRequiresFrom(t *testing.T) { // replace requires from example: // {"operations":[{"path":"model","mode":"replace"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "replace", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideRegexReplaceRequiresPattern(t *testing.T) { // regex_replace requires from(pattern) example: // {"operations":[{"path":"model","mode":"regex_replace"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "regex_replace", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideDelete(t *testing.T) { input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "delete", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } var got map[string]interface{} if err := json.Unmarshal(out, &got); err != nil { t.Fatalf("failed to unmarshal output JSON: %v", err) } if _, exists := got["temperature"]; exists { t.Fatalf("expected temperature to be deleted") } } func TestApplyParamOverrideSet(t *testing.T) { input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.1}`, string(out)) } func TestApplyParamOverrideSetKeepOrigin(t *testing.T) { input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, "keep_origin": true, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.7}`, string(out)) } func TestApplyParamOverrideMove(t *testing.T) { input := []byte(`{"model":"gpt-4","meta":{"x":1}}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "mode": "move", "from": "model", "to": "meta.model", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"meta":{"x":1,"model":"gpt-4"}}`, string(out)) } func TestApplyParamOverrideMoveMissingSource(t *testing.T) { input := []byte(`{"meta":{"x":1}}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "mode": "move", "from": "model", "to": "meta.model", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverridePrependAppendString(t *testing.T) { input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "prepend", "value": "openai/", }, map[string]interface{}{ "path": "model", "mode": "append", "value": "-latest", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"openai/gpt-4-latest"}`, string(out)) } func TestApplyParamOverridePrependAppendArray(t *testing.T) { input := []byte(`{"arr":[1,2]}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "arr", "mode": "prepend", "value": 0, }, map[string]interface{}{ "path": "arr", "mode": "append", "value": []interface{}{3, 4}, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"arr":[0,1,2,3,4]}`, string(out)) } func TestApplyParamOverrideAppendObjectMergeKeepOrigin(t *testing.T) { input := []byte(`{"obj":{"a":1}}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "obj", "mode": "append", "keep_origin": true, "value": map[string]interface{}{ "a": 2, "b": 3, }, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"obj":{"a":1,"b":3}}`, string(out)) } func TestApplyParamOverrideAppendObjectMergeOverride(t *testing.T) { input := []byte(`{"obj":{"a":1}}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "obj", "mode": "append", "value": map[string]interface{}{ "a": 2, "b": 3, }, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"obj":{"a":2,"b":3}}`, string(out)) } func TestApplyParamOverrideConditionORDefault(t *testing.T) { input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, "conditions": []interface{}{ map[string]interface{}{ "path": "model", "mode": "prefix", "value": "gpt", }, map[string]interface{}{ "path": "model", "mode": "prefix", "value": "claude", }, }, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.1}`, string(out)) } func TestApplyParamOverrideConditionAND(t *testing.T) { input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, "logic": "AND", "conditions": []interface{}{ map[string]interface{}{ "path": "model", "mode": "prefix", "value": "gpt", }, map[string]interface{}{ "path": "temperature", "mode": "gt", "value": 0.5, }, }, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.1}`, string(out)) } func TestApplyParamOverrideConditionInvert(t *testing.T) { input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, "conditions": []interface{}{ map[string]interface{}{ "path": "model", "mode": "prefix", "value": "gpt", "invert": true, }, }, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","temperature":0.7}`, string(out)) } func TestApplyParamOverrideConditionPassMissingKey(t *testing.T) { input := []byte(`{"temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, "conditions": []interface{}{ map[string]interface{}{ "path": "model", "mode": "prefix", "value": "gpt", "pass_missing_key": true, }, }, }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"temperature":0.1}`, string(out)) } func TestApplyParamOverrideConditionFromContext(t *testing.T) { input := []byte(`{"temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "temperature", "mode": "set", "value": 0.1, "conditions": []interface{}{ map[string]interface{}{ "path": "model", "mode": "prefix", "value": "gpt", }, }, }, }, } ctx := map[string]interface{}{ "model": "gpt-4", } out, err := ApplyParamOverride(input, override, ctx) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"temperature":0.1}`, string(out)) } func TestApplyParamOverrideNegativeIndexPath(t *testing.T) { input := []byte(`{"arr":[{"model":"a"},{"model":"b"}]}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "arr.-1.model", "mode": "set", "value": "c", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"arr":[{"model":"a"},{"model":"c"}]}`, string(out)) } func TestApplyParamOverrideRegexReplaceInvalidPattern(t *testing.T) { // regex_replace invalid pattern example: // {"operations":[{"path":"model","mode":"regex_replace","from":"(","to":"x"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "regex_replace", "from": "(", "to": "x", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideCopy(t *testing.T) { // copy example: // {"operations":[{"mode":"copy","from":"model","to":"original_model"}]} input := []byte(`{"model":"gpt-4","temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "mode": "copy", "from": "model", "to": "original_model", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4","original_model":"gpt-4","temperature":0.7}`, string(out)) } func TestApplyParamOverrideCopyMissingSource(t *testing.T) { // copy missing source example: // {"operations":[{"mode":"copy","from":"model","to":"original_model"}]} input := []byte(`{"temperature":0.7}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "mode": "copy", "from": "model", "to": "original_model", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideCopyRequiresFromTo(t *testing.T) { // copy requires from/to example: // {"operations":[{"mode":"copy"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "mode": "copy", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideEnsurePrefix(t *testing.T) { // ensure_prefix example: // {"operations":[{"path":"model","mode":"ensure_prefix","value":"openai/"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "ensure_prefix", "value": "openai/", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"openai/gpt-4"}`, string(out)) } func TestApplyParamOverrideEnsurePrefixNoop(t *testing.T) { // ensure_prefix no-op example: // {"operations":[{"path":"model","mode":"ensure_prefix","value":"openai/"}]} input := []byte(`{"model":"openai/gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "ensure_prefix", "value": "openai/", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"openai/gpt-4"}`, string(out)) } func TestApplyParamOverrideEnsureSuffix(t *testing.T) { // ensure_suffix example: // {"operations":[{"path":"model","mode":"ensure_suffix","value":"-latest"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "ensure_suffix", "value": "-latest", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4-latest"}`, string(out)) } func TestApplyParamOverrideEnsureSuffixNoop(t *testing.T) { // ensure_suffix no-op example: // {"operations":[{"path":"model","mode":"ensure_suffix","value":"-latest"}]} input := []byte(`{"model":"gpt-4-latest"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "ensure_suffix", "value": "-latest", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4-latest"}`, string(out)) } func TestApplyParamOverrideEnsureRequiresValue(t *testing.T) { // ensure_prefix requires value example: // {"operations":[{"path":"model","mode":"ensure_prefix"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "ensure_prefix", }, }, } _, err := ApplyParamOverride(input, override, nil) if err == nil { t.Fatalf("expected error, got nil") } } func TestApplyParamOverrideTrimSpace(t *testing.T) { // trim_space example: // {"operations":[{"path":"model","mode":"trim_space"}]} input := []byte("{\"model\":\" gpt-4 \\n\"}") override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "trim_space", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4"}`, string(out)) } func TestApplyParamOverrideToLower(t *testing.T) { // to_lower example: // {"operations":[{"path":"model","mode":"to_lower"}]} input := []byte(`{"model":"GPT-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "to_lower", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"gpt-4"}`, string(out)) } func TestApplyParamOverrideToUpper(t *testing.T) { // to_upper example: // {"operations":[{"path":"model","mode":"to_upper"}]} input := []byte(`{"model":"gpt-4"}`) override := map[string]interface{}{ "operations": []interface{}{ map[string]interface{}{ "path": "model", "mode": "to_upper", }, }, } out, err := ApplyParamOverride(input, override, nil) if err != nil { t.Fatalf("ApplyParamOverride returned error: %v", err) } assertJSONEqual(t, `{"model":"GPT-4"}`, string(out)) } func TestRemoveDisabledFieldsSkipWhenChannelPassThroughEnabled(t *testing.T) { input := `{ "service_tier":"flex", "safety_identifier":"user-123", "store":true, "stream_options":{"include_obfuscation":false} }` settings := dto.ChannelOtherSettings{} out, err := RemoveDisabledFields([]byte(input), settings, true) if err != nil { t.Fatalf("RemoveDisabledFields returned error: %v", err) } assertJSONEqual(t, input, string(out)) } func TestRemoveDisabledFieldsSkipWhenGlobalPassThroughEnabled(t *testing.T) { original := model_setting.GetGlobalSettings().PassThroughRequestEnabled model_setting.GetGlobalSettings().PassThroughRequestEnabled = true t.Cleanup(func() { model_setting.GetGlobalSettings().PassThroughRequestEnabled = original }) input := `{ "service_tier":"flex", "safety_identifier":"user-123", "stream_options":{"include_obfuscation":false} }` settings := dto.ChannelOtherSettings{} out, err := RemoveDisabledFields([]byte(input), settings, false) if err != nil { t.Fatalf("RemoveDisabledFields returned error: %v", err) } assertJSONEqual(t, input, string(out)) } func TestRemoveDisabledFieldsDefaultFiltering(t *testing.T) { input := `{ "service_tier":"flex", "inference_geo":"eu", "safety_identifier":"user-123", "store":true, "stream_options":{"include_obfuscation":false} }` settings := dto.ChannelOtherSettings{} out, err := RemoveDisabledFields([]byte(input), settings, false) if err != nil { t.Fatalf("RemoveDisabledFields returned error: %v", err) } assertJSONEqual(t, `{"store":true}`, string(out)) } func TestRemoveDisabledFieldsAllowInferenceGeo(t *testing.T) { input := `{ "inference_geo":"eu", "store":true }` settings := dto.ChannelOtherSettings{ AllowInferenceGeo: true, } out, err := RemoveDisabledFields([]byte(input), settings, false) if err != nil { t.Fatalf("RemoveDisabledFields returned error: %v", err) } assertJSONEqual(t, `{"inference_geo":"eu","store":true}`, string(out)) } func assertJSONEqual(t *testing.T, want, got string) { t.Helper() var wantObj interface{} var gotObj interface{} if err := json.Unmarshal([]byte(want), &wantObj); err != nil { t.Fatalf("failed to unmarshal want JSON: %v", err) } if err := json.Unmarshal([]byte(got), &gotObj); err != nil { t.Fatalf("failed to unmarshal got JSON: %v", err) } if !reflect.DeepEqual(wantObj, gotObj) { t.Fatalf("json not equal\nwant: %s\ngot: %s", want, got) } }