package profile import ( "context" "errors" "os" "path/filepath" "testing" ) func TestFilesystemRepository_GetProfile(t *testing.T) { tmpDir, err := os.MkdirTemp("", "execution_profile_test") if err != nil { t.Fatal(err) } defer os.RemoveAll(tmpDir) files, err := os.ReadDir("testdata") if err != nil { t.Fatalf("failed to read testdata: %v", err) } for _, f := range files { src := filepath.Join("testdata", f.Name()) dst := filepath.Join(tmpDir, f.Name()) data, err := os.ReadFile(src) if err != nil { t.Fatal(err) } if err := os.WriteFile(dst, data, 0644); err != nil { t.Fatal(err) } } repo := NewFilesystemRepository(tmpDir) ctx := context.Background() t.Run("valid local profile", func(t *testing.T) { p, err := repo.GetProfile(ctx, "local-default") if err != nil { t.Fatalf("expected no error, got %v", err) } if p.ID != "local-default" { t.Fatalf("unexpected id: %q", p.ID) } if p.Endpoint == "" || p.Model == "" { t.Fatalf("expected endpoint/model to be set: %+v", p) } }) t.Run("valid profile with api_key_env", func(t *testing.T) { p, err := repo.GetProfile(ctx, "local-secure") if err != nil { t.Fatalf("expected no error, got %v", err) } if p.APIKeyEnv != "SCRIPTORIUM_API_KEY" { t.Fatalf("unexpected api_key_env: %q", p.APIKeyEnv) } if p.ReasoningEffort != "medium" { t.Fatalf("unexpected reasoning_effort: %q", p.ReasoningEffort) } }) t.Run("invalid yaml", func(t *testing.T) { _, err := repo.GetProfile(ctx, "invalid_yaml") if !errors.Is(err, ErrInvalidYAML) { t.Fatalf("expected ErrInvalidYAML, got %v", err) } }) t.Run("missing id", func(t *testing.T) { _, err := repo.GetProfile(ctx, "missing_id") if !errors.Is(err, ErrProfileNotFound) { t.Fatalf("expected ErrProfileNotFound, got %v", err) } }) t.Run("missing endpoint", func(t *testing.T) { _, err := repo.GetProfile(ctx, "missing-endpoint") if !errors.Is(err, ErrInvalidProfile) { t.Fatalf("expected ErrInvalidProfile, got %v", err) } }) t.Run("missing model", func(t *testing.T) { _, err := repo.GetProfile(ctx, "missing-model") if !errors.Is(err, ErrInvalidProfile) { t.Fatalf("expected ErrInvalidProfile, got %v", err) } }) t.Run("unknown field", func(t *testing.T) { _, err := repo.GetProfile(ctx, "unknown_field") if !errors.Is(err, ErrInvalidYAML) { t.Fatalf("expected ErrInvalidYAML for strict decode unknown field, got %v", err) } }) t.Run("raw api_key rejected", func(t *testing.T) { _, err := repo.GetProfile(ctx, "raw_api_key") if !errors.Is(err, ErrRawAPIKeyNotAllowed) { t.Fatalf("expected ErrRawAPIKeyNotAllowed, got %v", err) } }) t.Run("profile not found", func(t *testing.T) { _, err := repo.GetProfile(ctx, "does-not-exist") if !errors.Is(err, ErrProfileNotFound) { t.Fatalf("expected ErrProfileNotFound, got %v", err) } }) }