125 lines
4.6 KiB
Go
125 lines
4.6 KiB
Go
package format
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/promptkit"
|
|
)
|
|
|
|
func TestFormatPromptInspectionPreservesDeclaredOrderAndEmptyValues(t *testing.T) {
|
|
value := &promptkit.PromptInspection{PromptID: "p", PromptVersion: "1", PromptHash: "hash", Inputs: []promptkit.PromptInputDefinition{{Name: "first", Required: true, ContentType: "text/plain", Description: "first input"}, {Name: "second"}}, OutputContract: promptkit.OutputContract{Format: "text", ValidationMode: promptkit.ValidationNone}}
|
|
text, err := FormatPromptInspection(value, OutputFormatText)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(string(text), "default_profile_id: \ninputs:\n - name: first") || strings.Index(string(text), "name: first") > strings.Index(string(text), "name: second") {
|
|
t.Fatalf("unexpected text inspection: %s", text)
|
|
}
|
|
jsonOutput, err := FormatPromptInspection(value, OutputFormatJSON)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.HasSuffix(string(jsonOutput), "\n") || !strings.Contains(string(jsonOutput), `"default_profile_id": ""`) {
|
|
t.Fatalf("unexpected json inspection: %s", jsonOutput)
|
|
}
|
|
}
|
|
|
|
func TestFormatPromptInspectionRejectsNil(t *testing.T) {
|
|
if _, err := FormatPromptInspection(nil, OutputFormatText); err == nil {
|
|
t.Fatal("expected nil inspection error")
|
|
}
|
|
}
|
|
|
|
func TestFormatProfileInspectionPreservesSafeEffectiveValues(t *testing.T) {
|
|
const secret = "sentinel-secret-must-not-appear"
|
|
t.Setenv("FIXTURE_PROFILE_API_KEY", secret)
|
|
|
|
value := &promptkit.ProfileInspection{
|
|
ProfileID: "custom-derived",
|
|
EffectiveModelParams: promptkit.ExecutionTarget{
|
|
BackendID: "fixture-custom",
|
|
Endpoint: "http://127.0.0.1:11434/v1",
|
|
Model: "fixture-model",
|
|
Temperature: 0.25,
|
|
MaxTokens: 640,
|
|
TopP: 0.9,
|
|
TimeoutSeconds: 45,
|
|
ServiceTier: "flex",
|
|
ReasoningEffort: "high",
|
|
APIKeyEnv: "FIXTURE_PROFILE_API_KEY",
|
|
ExtraParams: map[string]any{
|
|
"zeta": true,
|
|
"alpha": map[string]any{"nested": []any{"first", 2.0}},
|
|
},
|
|
},
|
|
APIKeyRequired: true,
|
|
}
|
|
|
|
jsonOutput, err := FormatProfileInspection(value, OutputFormatJSON)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
secondJSONOutput, err := FormatProfileInspection(value, OutputFormatJSON)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(jsonOutput) != string(secondJSONOutput) || !strings.HasSuffix(string(jsonOutput), "\n") {
|
|
t.Fatalf("expected deterministic newline-terminated JSON, got %q", jsonOutput)
|
|
}
|
|
if strings.Contains(string(jsonOutput), secret) {
|
|
t.Fatalf("inspection exposed an environment secret: %s", jsonOutput)
|
|
}
|
|
|
|
var decoded ProfileInspection
|
|
if err := json.Unmarshal(jsonOutput, &decoded); err != nil {
|
|
t.Fatalf("decode profile inspection: %v", err)
|
|
}
|
|
if decoded.ProfileID != "custom-derived" || decoded.EffectiveModelParams.BackendID != "fixture-custom" {
|
|
t.Fatalf("unexpected profile identity: %+v", decoded)
|
|
}
|
|
if decoded.EffectiveModelParams.APIKeyEnv != "FIXTURE_PROFILE_API_KEY" || !decoded.APIKeyRequired {
|
|
t.Fatalf("unexpected credential metadata: %+v", decoded)
|
|
}
|
|
alpha, ok := decoded.EffectiveModelParams.ExtraParams["alpha"].(map[string]any)
|
|
if !ok || len(alpha["nested"].([]any)) != 2 {
|
|
t.Fatalf("nested extra parameters were not preserved: %#v", decoded.EffectiveModelParams.ExtraParams)
|
|
}
|
|
|
|
textOutput, err := FormatProfileInspection(value, OutputFormatText)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
textValue := string(textOutput)
|
|
if !strings.Contains(textValue, "backend_id: fixture-custom") ||
|
|
!strings.Contains(textValue, "api_key_env: FIXTURE_PROFILE_API_KEY") ||
|
|
!strings.Contains(textValue, `extra_params: {"alpha":{"nested":["first",2]},"zeta":true}`) ||
|
|
!strings.Contains(textValue, "api_key_required: true") {
|
|
t.Fatalf("unexpected text inspection: %s", textValue)
|
|
}
|
|
if strings.Contains(textValue, secret) {
|
|
t.Fatalf("text inspection exposed an environment secret: %s", textValue)
|
|
}
|
|
}
|
|
|
|
func TestFormatProfileInspectionPreservesEmptyBackendAndRejectsNil(t *testing.T) {
|
|
output, err := FormatProfileInspection(&promptkit.ProfileInspection{
|
|
ProfileID: "endpoint-only",
|
|
EffectiveModelParams: promptkit.ExecutionTarget{
|
|
Endpoint: "http://127.0.0.1:8000/v1",
|
|
Model: "fixture-model",
|
|
},
|
|
}, OutputFormatJSON)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !strings.Contains(string(output), `"backend_id": ""`) ||
|
|
!strings.Contains(string(output), `"extra_params": {}`) {
|
|
t.Fatalf("expected explicit empty backend and object extra params, got %s", output)
|
|
}
|
|
if _, err := FormatProfileInspection(nil, OutputFormatText); err == nil {
|
|
t.Fatal("expected nil profile inspection error")
|
|
}
|
|
}
|