summaryrefslogtreecommitdiff
path: root/internal/gui/generator_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-01 19:32:58 +0300
committerPaul Buetow <paul@buetow.org>2026-04-01 19:32:58 +0300
commit008d6308ecb767df7194aa944328c6ead6473ca5 (patch)
treeed73bb9601b02a896b1d3993dfc043afaada1854 /internal/gui/generator_test.go
parent27b753192edca7005e6ee20b7be2a0c127294bd8 (diff)
z9: wire Nano Banana into GUI
Diffstat (limited to 'internal/gui/generator_test.go')
-rw-r--r--internal/gui/generator_test.go129
1 files changed, 129 insertions, 0 deletions
diff --git a/internal/gui/generator_test.go b/internal/gui/generator_test.go
new file mode 100644
index 0000000..b17e5ac
--- /dev/null
+++ b/internal/gui/generator_test.go
@@ -0,0 +1,129 @@
+package gui
+
+import (
+ "context"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "codeberg.org/snonux/totalrecall/internal/image"
+)
+
+type fakePromptAwareImageClient struct {
+ searchOpts *image.SearchOptions
+ promptCallback func(string)
+}
+
+func (f *fakePromptAwareImageClient) Search(_ context.Context, opts *image.SearchOptions) ([]image.SearchResult, error) {
+ copyOpts := *opts
+ f.searchOpts = &copyOpts
+ if f.promptCallback != nil {
+ f.promptCallback("nanobanana prompt")
+ }
+
+ return []image.SearchResult{
+ {
+ ID: "fake-id",
+ URL: "https://example.com/image.png",
+ ThumbnailURL: "https://example.com/image.png",
+ Width: 1,
+ Height: 1,
+ Description: "fake result",
+ Attribution: "fake attribution",
+ Source: imageProviderNanoBanana,
+ },
+ }, nil
+}
+
+func (f *fakePromptAwareImageClient) Download(_ context.Context, _ string) (io.ReadCloser, error) {
+ return io.NopCloser(strings.NewReader("fake image bytes")), nil
+}
+
+func (f *fakePromptAwareImageClient) GetAttribution(*image.SearchResult) string {
+ return "fake attribution"
+}
+
+func (f *fakePromptAwareImageClient) Name() string {
+ return imageProviderNanoBanana
+}
+
+func (f *fakePromptAwareImageClient) SetPromptCallback(callback func(prompt string)) {
+ f.promptCallback = callback
+}
+
+func TestGenerateImagesWithPromptUsesNanoBananaProvider(t *testing.T) {
+ originalNanoBananaClient := newNanoBananaImageClient
+ originalOpenAIClient := newOpenAIImageClient
+ t.Cleanup(func() {
+ newNanoBananaImageClient = originalNanoBananaClient
+ newOpenAIImageClient = originalOpenAIClient
+ })
+
+ fakeClient := &fakePromptAwareImageClient{}
+ var capturedConfig *image.NanoBananaConfig
+
+ newNanoBananaImageClient = func(config *image.NanoBananaConfig) promptAwareImageClient {
+ capturedConfig = &image.NanoBananaConfig{
+ APIKey: config.APIKey,
+ Model: config.Model,
+ TextModel: config.TextModel,
+ }
+ return fakeClient
+ }
+ newOpenAIImageClient = func(*image.OpenAIConfig) promptAwareImageClient {
+ t.Fatal("unexpected OpenAI image client construction")
+ return nil
+ }
+
+ tempDir := t.TempDir()
+ app := &Application{
+ config: &Config{
+ ImageProvider: imageProviderNanoBanana,
+ GoogleAPIKey: "google-key",
+ OutputDir: tempDir,
+ },
+ currentWord: "друго",
+ }
+
+ outputPath, err := app.generateImagesWithPrompt(context.Background(), "ябълка", "custom prompt", "apple", tempDir)
+ if err != nil {
+ t.Fatalf("generateImagesWithPrompt() unexpected error: %v", err)
+ }
+
+ if capturedConfig == nil {
+ t.Fatal("expected Nano Banana client constructor to be called")
+ }
+ if capturedConfig.APIKey != "google-key" {
+ t.Fatalf("Nano Banana API key = %q, want %q", capturedConfig.APIKey, "google-key")
+ }
+ if fakeClient.searchOpts == nil {
+ t.Fatal("expected search options to be captured")
+ }
+ if fakeClient.searchOpts.Query != "ябълка" {
+ t.Fatalf("search query = %q, want %q", fakeClient.searchOpts.Query, "ябълка")
+ }
+ if fakeClient.searchOpts.CustomPrompt != "custom prompt" {
+ t.Fatalf("custom prompt = %q, want %q", fakeClient.searchOpts.CustomPrompt, "custom prompt")
+ }
+ if fakeClient.searchOpts.Translation != "apple" {
+ t.Fatalf("translation = %q, want %q", fakeClient.searchOpts.Translation, "apple")
+ }
+
+ promptPath := filepath.Join(tempDir, "image_prompt.txt")
+ promptData, err := os.ReadFile(promptPath)
+ if err != nil {
+ t.Fatalf("expected prompt file %q: %v", promptPath, err)
+ }
+ if got := strings.TrimSpace(string(promptData)); got != "nanobanana prompt" {
+ t.Fatalf("prompt file = %q, want %q", got, "nanobanana prompt")
+ }
+
+ if _, err := os.Stat(outputPath); err != nil {
+ t.Fatalf("expected downloaded image at %q: %v", outputPath, err)
+ }
+ if !strings.HasSuffix(outputPath, ".png") {
+ t.Fatalf("outputPath = %q, want a PNG output file", outputPath)
+ }
+}