summaryrefslogtreecommitdiff
path: root/internal/comic/comic_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/comic/comic_test.go')
-rw-r--r--internal/comic/comic_test.go96
1 files changed, 95 insertions, 1 deletions
diff --git a/internal/comic/comic_test.go b/internal/comic/comic_test.go
index 3506303..3b89871 100644
--- a/internal/comic/comic_test.go
+++ b/internal/comic/comic_test.go
@@ -47,7 +47,7 @@ func TestBuildPanelLayoutUsesFallbackExcerpt(t *testing.T) {
t.Parallel()
got := buildPanelLayout("one two three four five", nil)
- if !strings.Contains(got, "Story excerpt") {
+ if !strings.Contains(got, "Откъс от историята") {
t.Fatalf("buildPanelLayout() = %q", got)
}
}
@@ -142,6 +142,12 @@ func TestDrawComicPagesReturnsErrorWhenRenderFails(t *testing.T) {
func TestArtistAndRunnerEndToEndWithFakes(t *testing.T) {
t.Parallel()
+ originalLeakValidation := validateImagePromptLeakageFn
+ validateImagePromptLeakageFn = func(context.Context, string, string) error { return nil }
+ t.Cleanup(func() {
+ validateImagePromptLeakageFn = originalLeakValidation
+ })
+
tmpDir := t.TempDir()
img := fakeImageProvider{t: t}
genText := &scriptedTextProvider{responses: []string{
@@ -194,8 +200,11 @@ func TestArtistAndRunnerEndToEndWithFakes(t *testing.T) {
func TestRunnerPropagatesRenderFailures(t *testing.T) {
originalSleep := sleep
sleep = func(time.Duration) {}
+ originalLeakValidation := validateImagePromptLeakageFn
+ validateImagePromptLeakageFn = func(context.Context, string, string) error { return nil }
t.Cleanup(func() {
sleep = originalSleep
+ validateImagePromptLeakageFn = originalLeakValidation
})
runner := NewRunner(&RunnerConfig{
@@ -226,6 +235,49 @@ func TestRunnerPropagatesRenderFailures(t *testing.T) {
}
}
+func TestDrawComicPagesUsesOneStyleAcrossTheWholePDF(t *testing.T) {
+ originalLeakValidation := validateImagePromptLeakageFn
+ validateImagePromptLeakageFn = func(context.Context, string, string) error { return nil }
+ t.Cleanup(func() {
+ validateImagePromptLeakageFn = originalLeakValidation
+ })
+
+ renderer := &recordingPromptRenderer{}
+ artist := NewArtist(&ArtistConfig{
+ ImageProvider: fakeImageProvider{t: t},
+ Prompts: renderer,
+ OutputDir: t.TempDir(),
+ UltraRealistic: false,
+ })
+
+ if _, err := artist.DrawComicPages(context.Background(), "история", "библия", "slug", []WordEntry{{Word: "ябълка"}}, nil); err != nil {
+ t.Fatalf("DrawComicPages() error = %v", err)
+ }
+
+ var style string
+ var promptCount int
+ for _, call := range renderer.calls {
+ if !isImagePromptTemplate(call.name) {
+ continue
+ }
+ promptCount++
+ gotStyle, ok := call.data["Style"].(string)
+ if !ok || gotStyle == "" {
+ t.Fatalf("image prompt %q missing style: %#v", call.name, call.data)
+ }
+ if style == "" {
+ style = gotStyle
+ continue
+ }
+ if gotStyle != style {
+ t.Fatalf("image prompt styles diverged: first=%q later=%q in %q", style, gotStyle, call.name)
+ }
+ }
+ if promptCount == 0 {
+ t.Fatal("no image prompts recorded")
+ }
+}
+
func TestConvertToStereoFallsBackToCopyWhenFFmpegMissing(t *testing.T) {
originalLookPath := lookPath
lookPath = func(string) (string, error) {
@@ -274,6 +326,48 @@ func (fakePromptRenderer) RenderPrompt(name string, data any) (string, error) {
}
}
+type recordingPromptRenderer struct {
+ calls []recordedPromptCall
+}
+
+type recordedPromptCall struct {
+ name string
+ data map[string]any
+}
+
+func (r *recordingPromptRenderer) RenderPrompt(name string, data any) (string, error) {
+ if m, ok := data.(map[string]any); ok {
+ copyData := make(map[string]any, len(m))
+ for k, v := range m {
+ copyData[k] = v
+ }
+ r.calls = append(r.calls, recordedPromptCall{name: name, data: copyData})
+ } else {
+ r.calls = append(r.calls, recordedPromptCall{name: name})
+ }
+ switch name {
+ case storySystemPromptTemplate:
+ return "system prompt", nil
+ case storyPromptTemplate, storyFullPromptTemplate:
+ return "prompt", nil
+ case coverPromptTemplate, storyPagePromptTemplate, galleryPagePromptTemplate, backCoverPromptTemplate:
+ return "image prompt", nil
+ case blurbSystemTemplate, introSystemTemplate, conclusionSystemTemplate:
+ return "teaser prompt", nil
+ default:
+ return "", errors.New("unexpected template")
+ }
+}
+
+func isImagePromptTemplate(name string) bool {
+ switch name {
+ case coverPromptTemplate, storyPagePromptTemplate, galleryPagePromptTemplate, backCoverPromptTemplate:
+ return true
+ default:
+ return false
+ }
+}
+
type fakeTextProvider struct{ text string }
func (f fakeTextProvider) Name() string { return "fake-text" }