1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
// SPDX-License-Identifier: GPL-3.0-or-later
package model
import (
"context"
"os"
"path/filepath"
"strings"
"testing"
)
// TestPreviewKinds: a text file comes back as text, a picture as a picture,
// and something krino cannot show says so instead of guessing.
func TestPreviewKinds(t *testing.T) {
dir := t.TempDir()
write := func(name string, body []byte) string {
p := filepath.Join(dir, name)
if err := os.WriteFile(p, body, 0o644); err != nil {
t.Fatal(err)
}
return p
}
text := write("notes.txt", []byte("first line\nsecond line\n"))
png := write("a.png", []byte("\x89PNG\r\n\x1a\nnot really, but the name is what counts here"))
binary := write("a.bin", []byte{0, 1, 2, 3, 0})
tmp := t.TempDir()
if p := MakePreview(context.Background(), text, tmp); p.Kind != PreviewText ||
!strings.Contains(p.Text, "second line") {
t.Errorf("text preview = %+v", p)
}
if p := MakePreview(context.Background(), png, tmp); p.Kind != PreviewImage || p.Image != png {
t.Errorf("image preview = %+v", p)
}
if p := MakePreview(context.Background(), binary, tmp); p.Kind != PreviewNone ||
!strings.Contains(p.Note, "no preview") {
t.Errorf("binary preview = %+v", p)
}
if p := MakePreview(context.Background(), filepath.Join(dir, "gone.txt"), tmp); p.Kind != PreviewNone {
t.Errorf("a missing file = %+v", p)
}
if p := MakePreview(context.Background(), dir, tmp); p.Kind != PreviewNone {
t.Errorf("a directory = %+v", p)
}
}
// TestPreviewReadsOnly: looking at a file changes nothing about it, and
// nothing is left beside it.
func TestPreviewReadsOnly(t *testing.T) {
dir := t.TempDir()
p := filepath.Join(dir, "notes.txt")
body := []byte("one\ntwo\n")
if err := os.WriteFile(p, body, 0o644); err != nil {
t.Fatal(err)
}
before, err := os.Stat(p)
if err != nil {
t.Fatal(err)
}
MakePreview(context.Background(), p, t.TempDir())
after, err := os.Stat(p)
if err != nil {
t.Fatal(err)
}
if !before.ModTime().Equal(after.ModTime()) || before.Size() != after.Size() {
t.Error("the file changed")
}
if entries, _ := os.ReadDir(dir); len(entries) != 1 {
t.Errorf("the directory holds %d files, want the one", len(entries))
}
if on, _ := os.ReadFile(p); string(on) != string(body) {
t.Error("the contents changed")
}
}
// TestPreviewShowsOnlyTheHead: a long file is cut, and says it was.
func TestPreviewShowsOnlyTheHead(t *testing.T) {
dir := t.TempDir()
p := filepath.Join(dir, "long.txt")
var b strings.Builder
for i := 0; i < previewLines*2; i++ {
b.WriteString("line\n")
}
if err := os.WriteFile(p, []byte(b.String()), 0o644); err != nil {
t.Fatal(err)
}
pv := MakePreview(context.Background(), p, t.TempDir())
if pv.Kind != PreviewText {
t.Fatalf("preview = %+v", pv)
}
if n := strings.Count(pv.Text, "\n"); n > previewLines+1 {
t.Errorf("%d lines shown, want at most %d", n, previewLines)
}
if !strings.HasSuffix(pv.Text, "...") {
t.Error("a cut file does not say it was cut")
}
}
|