package compose import "testing" const hallRaw = "https://forge.example/coulomb/hall-of-helix/raw/branch/main" const fallback = "https://forge.example/coulomb/pr-hall-of-helix/raw/branch/main/assets/helix-forge.png" func TestResolveVisualPrefersRenderedPortrait(t *testing.T) { entry := "# Seat\n\n## Visual prompt\n\n> Constellation dialect.\n\n![Tegwick at work](../visuals/bernd-how-it-started.png)\n\n## Handoff\n" v, err := ResolveVisual(entry, hallRaw, fallback) if err != nil { t.Fatal(err) } if v.Kind != VisualPortrait || v.Path != "visuals/bernd-how-it-started.png" || v.URL != hallRaw+"/visuals/bernd-how-it-started.png" { t.Fatalf("got %+v", v) } } func TestResolveVisualPromptWithoutPortraitNeedsRender(t *testing.T) { entry := "# Seat\n\n## Visual prompt\n\n> Constellation dialect. Square.\n> Brass scales.\n\n" + "\n\n" + "_Draft: portrait not yet rendered, expected as `claude-x-scales.jpg`._\n\n## Handoff\n" v, err := ResolveVisual(entry, hallRaw, fallback) if err != nil { t.Fatal(err) } if v.Kind != VisualNeedsRender || v.URL != "" { t.Fatalf("a commented-out portrait or the fallback was used: %+v", v) } if v.Prompt != "Constellation dialect. Square. Brass scales." { t.Fatalf("prompt = %q", v.Prompt) } if v.Target != "visuals/claude-x-scales.jpg" { t.Fatalf("target = %q", v.Target) } } func TestResolveVisualFallsBackOnlyWithoutPrompt(t *testing.T) { for _, entry := range []string{"", "# Seat\n\n## Handoff\n\nNothing visual.\n"} { v, err := ResolveVisual(entry, hallRaw, fallback) if err != nil { t.Fatal(err) } if v.Kind != VisualFallback || v.URL != fallback { t.Fatalf("entry %q: got %+v", entry, v) } } if _, err := ResolveVisual("", hallRaw, ""); err == nil { t.Fatal("resolved with no fallback configured") } } func TestResolveVisualIgnoresExternalImages(t *testing.T) { entry := "# Seat\n\n![badge](https://img.example/visuals/x.png)\n" v, err := ResolveVisual(entry, hallRaw, fallback) if err != nil { t.Fatal(err) } if v.Kind != VisualFallback { t.Fatalf("got %+v", v) } } func TestResolveVisualTargetFromBareFileName(t *testing.T) { entry := "# Seat\n\n## Visual prompt\n\n> Scales.\n\n_Draft: expected under `visuals/` as `claude-y-scales.jpg`._\n" v, err := ResolveVisual(entry, hallRaw, fallback) if err != nil { t.Fatal(err) } if v.Target != "visuals/claude-y-scales.jpg" { t.Fatalf("target = %q", v.Target) } }