package prompt import ( "context" "testing" "gitea.maximumdirect.net/eric/scriptorium/internal/domain" ) func TestGoRenderer_Render(t *testing.T) { renderer := NewGoRenderer() ctx := context.Background() profile := &domain.PromptProfile{ ID: "test-profile", ExpectedInputs: []string{"transcript"}, Templates: []domain.PromptMessageTemplate{ {Role: "system", Content: "You are a {{.role}}."}, {Role: "user", Content: "Analyze this: {{input \"transcript\"}}"}, }, } inputs := map[string]*domain.Artifact{ "transcript": {Body: []byte("The quick brown fox.")}, } vars := map[string]string{ "role": "helpful assistant", } t.Run("successful render", func(t *testing.T) { res, err := renderer.Render(ctx, profile, inputs, vars) if err != nil { t.Fatalf("unexpected error: %v", err) } if len(res.Messages) != 2 { t.Errorf("expected 2 messages, got %d", len(res.Messages)) } if res.Messages[0].Content != "You are a helpful assistant." { t.Errorf("unexpected system message: %s", res.Messages[0].Content) } if res.Messages[1].Content != "Analyze this: The quick brown fox." { t.Errorf("unexpected user message: %s", res.Messages[1].Content) } }) t.Run("missing required input", func(t *testing.T) { emptyInputs := map[string]*domain.Artifact{} _, err := renderer.Render(ctx, profile, emptyInputs, vars) if err == nil || (err != ErrMissingRequiredInput && err.Error() != "missing required input artifact: transcript") { t.Errorf("expected ErrMissingRequiredInput, got %v", err) } }) t.Run("unknown input in template", func(t *testing.T) { profileUnknown := &domain.PromptProfile{ Templates: []domain.PromptMessageTemplate{ {Role: "user", Content: "Hello {{input \"ghost\"}}"}, }, } _, err := renderer.Render(ctx, profileUnknown, inputs, vars) if err == nil { t.Error("expected error for unknown input") } }) t.Run("invalid template syntax", func(t *testing.T) { profileInvalid := &domain.PromptProfile{ Templates: []domain.PromptMessageTemplate{ {Role: "user", Content: "Hello {{.unclosed"}, }, } _, err := renderer.Render(ctx, profileInvalid, inputs, vars) if err == nil { t.Error("expected error for invalid template syntax") } }) t.Run("empty message role", func(t *testing.T) { profileNoRole := &domain.PromptProfile{ Templates: []domain.PromptMessageTemplate{ {Role: "", Content: "Hello"}, }, } _, err := renderer.Render(ctx, profileNoRole, inputs, vars) if err == nil { t.Error("expected error for empty message role") } }) }