aboutsummaryrefslogtreecommitdiff
path: root/gui/internal/model/preview_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'gui/internal/model/preview_test.go')
-rw-r--r--gui/internal/model/preview_test.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/gui/internal/model/preview_test.go b/gui/internal/model/preview_test.go
index 8c19922..b620a92 100644
--- a/gui/internal/model/preview_test.go
+++ b/gui/internal/model/preview_test.go
@@ -5,6 +5,7 @@ package model
import (
"context"
"os"
+ "os/exec"
"path/filepath"
"strings"
"testing"
@@ -96,3 +97,58 @@ func TestPreviewShowsOnlyTheHead(t *testing.T) {
t.Error("a cut file does not say it was cut")
}
}
+
+// TestPdfPreviewsDoNotMixUp: two PDFs looked at one after the other each
+// get their own rendered page. pdftoppm names its file after the page
+// number, so previews sharing a directory would collide - one of his ended
+// up showing another document's cover.
+func TestPdfPreviewsDoNotMixUp(t *testing.T) {
+ if _, err := exec.LookPath("pdftoppm"); err != nil {
+ t.Skip("pdftoppm is not installed")
+ }
+ if _, err := exec.LookPath("groff"); err != nil {
+ t.Skip("groff is not installed, so there is nothing to make a PDF with")
+ }
+ dir := t.TempDir()
+ pdf := func(name, text string) string {
+ p := filepath.Join(dir, name)
+ f, err := os.Create(p)
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+ cmd := exec.Command("groff", "-Tpdf", "-ms")
+ cmd.Stdin = strings.NewReader(".TL\n" + text + "\n")
+ cmd.Stdout = f
+ if err := cmd.Run(); err != nil {
+ t.Skipf("groff cannot write a PDF here: %v", err)
+ }
+ return p
+ }
+ first := pdf("first.pdf", "The first document")
+ second := pdf("second.pdf", "The second document")
+
+ tmp := t.TempDir()
+ a := MakePreview(context.Background(), first, tmp)
+ b := MakePreview(context.Background(), second, tmp)
+ if a.Kind != PreviewImage || b.Kind != PreviewImage {
+ t.Fatalf("previews = %+v, %+v", a, b)
+ }
+ if a.Image == b.Image {
+ t.Fatalf("both previews point at %s", a.Image)
+ }
+ sameBytes := func(x, y string) bool {
+ bx, err1 := os.ReadFile(x)
+ by, err2 := os.ReadFile(y)
+ return err1 == nil && err2 == nil && string(bx) == string(by)
+ }
+ if sameBytes(a.Image, b.Image) {
+ t.Error("the second preview is a copy of the first page rendered")
+ }
+ // The caller is told where to clean up.
+ for _, p := range []Preview{a, b} {
+ if p.Dir == "" {
+ t.Error("a rendered page comes with no directory to remove")
+ }
+ }
+}