diff --git a/pkg/providers/schema_test.go b/pkg/providers/schema_test.go new file mode 100644 index 0000000..219efec --- /dev/null +++ b/pkg/providers/schema_test.go @@ -0,0 +1,79 @@ +package providers + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" +) + +type verifyWrapper struct { + Verify VerifySpec `yaml:"verify"` +} + +func TestVerifySpec_NewFieldsParse(t *testing.T) { + y := ` +verify: + method: POST + url: https://api.example.com/v1/models + headers: + Authorization: "Bearer {{KEY}}" + body: '{"api_key":"{{KEY}}"}' + success_codes: [200, 201] + failure_codes: [401, 403] + rate_limit_codes: [429, 529] + metadata_paths: + org: organization.name + tier: rate_limit.tier +` + var w verifyWrapper + require.NoError(t, yaml.Unmarshal([]byte(y), &w)) + + assert.Equal(t, "POST", w.Verify.Method) + assert.Equal(t, `{"api_key":"{{KEY}}"}`, w.Verify.Body) + assert.Equal(t, []int{200, 201}, w.Verify.SuccessCodes) + assert.Equal(t, []int{401, 403}, w.Verify.FailureCodes) + assert.Equal(t, []int{429, 529}, w.Verify.RateLimitCodes) + assert.Equal(t, "organization.name", w.Verify.MetadataPaths["org"]) + assert.Equal(t, "rate_limit.tier", w.Verify.MetadataPaths["tier"]) +} + +func TestVerifySpec_LegacyFieldsStillWork(t *testing.T) { + y := ` +verify: + method: GET + url: https://api.example.com/v1/models + valid_status: [200, 204] + invalid_status: [401, 403, 404] +` + var w verifyWrapper + require.NoError(t, yaml.Unmarshal([]byte(y), &w)) + + assert.Equal(t, []int{200, 204}, w.Verify.ValidStatus) + assert.Equal(t, []int{401, 403, 404}, w.Verify.InvalidStatus) + // Effective* should fall back to legacy when canonical fields are empty + assert.Equal(t, []int{200, 204}, w.Verify.EffectiveSuccessCodes()) + assert.Equal(t, []int{401, 403, 404}, w.Verify.EffectiveFailureCodes()) + assert.Equal(t, []int{429}, w.Verify.EffectiveRateLimitCodes()) +} + +func TestVerifySpec_Defaults(t *testing.T) { + var v VerifySpec + assert.Equal(t, []int{200}, v.EffectiveSuccessCodes()) + assert.Equal(t, []int{401, 403}, v.EffectiveFailureCodes()) + assert.Equal(t, []int{429}, v.EffectiveRateLimitCodes()) +} + +func TestVerifySpec_CanonicalFieldsPreferred(t *testing.T) { + v := VerifySpec{ + SuccessCodes: []int{201}, + FailureCodes: []int{400}, + RateLimitCodes: []int{503}, + ValidStatus: []int{200}, + InvalidStatus: []int{401}, + } + assert.Equal(t, []int{201}, v.EffectiveSuccessCodes()) + assert.Equal(t, []int{400}, v.EffectiveFailureCodes()) + assert.Equal(t, []int{503}, v.EffectiveRateLimitCodes()) +}