internal/store/snippets_test.go
108 lines · 3541 bytes
1package store
2
3import (
4 "errors"
5 "testing"
6)
7
8func TestSnippets(t *testing.T) {
9 s := open(t)
10 if err := s.MigrateUp(); err != nil {
11 t.Fatal(err)
12 }
13 alice, err := s.CreateUser("alice", false)
14 if err != nil {
15 t.Fatal(err)
16 }
17 id, err := s.CreateSnippet(alice, "abcdef012345", "a log", "unlisted", "build.log", []byte("ok\n"))
18 if err != nil {
19 t.Fatal(err)
20 }
21 if _, err := s.CreateSnippet(alice, "abcdef012345", "", "public", "x", []byte("x")); !errors.Is(err, ErrExists) {
22 t.Fatalf("duplicate public id: %v", err)
23 }
24 sn, err := s.SnippetByPublicID("abcdef012345")
25 if err != nil {
26 t.Fatal(err)
27 }
28 if sn.ID != id || sn.OwnerName != "alice" || sn.Visibility != "unlisted" || sn.Description != "a log" {
29 t.Fatalf("snippet: %+v", sn)
30 }
31 if len(sn.Files) != 1 || sn.Files[0].Name != "build.log" || sn.Files[0].Size != 3 || sn.Files[0].Content != nil {
32 t.Fatalf("files on lookup: %+v", sn.Files)
33 }
34
35 // Set adds, then replaces; remove drops; the file read carries content.
36 if err := s.SetSnippetFile(id, "notes.txt", []byte("one\n")); err != nil {
37 t.Fatal(err)
38 }
39 if err := s.SetSnippetFile(id, "notes.txt", []byte("two\n")); err != nil {
40 t.Fatal(err)
41 }
42 f, err := s.SnippetFile(id, "notes.txt")
43 if err != nil || string(f.Content) != "two\n" || f.Size != 4 {
44 t.Fatalf("file after replace: %+v %v", f, err)
45 }
46 files, err := s.SnippetFiles(id)
47 if err != nil || len(files) != 2 || files[0].Name != "build.log" || string(files[1].Content) != "two\n" {
48 t.Fatalf("files: %+v %v", files, err)
49 }
50 if err := s.RemoveSnippetFile(id, "notes.txt"); err != nil {
51 t.Fatal(err)
52 }
53 if err := s.RemoveSnippetFile(id, "notes.txt"); !errors.Is(err, ErrNotFound) {
54 t.Fatalf("remove missing file: %v", err)
55 }
56 if _, err := s.SnippetFile(id, "notes.txt"); !errors.Is(err, ErrNotFound) {
57 t.Fatalf("read removed file: %v", err)
58 }
59
60 // Listing: public only unless all; newest first; keyset by id.
61 pub, err := s.CreateSnippet(alice, "000000000001", "", "public", "a", []byte("a"))
62 if err != nil {
63 t.Fatal(err)
64 }
65 if _, err := s.CreateSnippet(alice, "000000000002", "", "private", "b", []byte("b")); err != nil {
66 t.Fatal(err)
67 }
68 got, err := s.ListSnippets(alice, false, 0, 0)
69 if err != nil || len(got) != 1 || got[0].ID != pub {
70 t.Fatalf("public list: %+v %v", got, err)
71 }
72 got, err = s.ListSnippets(alice, true, 0, 0)
73 if err != nil || len(got) != 3 || got[0].PublicID != "000000000002" || got[2].ID != id {
74 t.Fatalf("all list: %+v %v", got, err)
75 }
76 got, err = s.ListSnippets(alice, true, 2, got[0].ID)
77 if err != nil || len(got) != 2 || got[0].ID != pub {
78 t.Fatalf("paged list: %+v %v", got, err)
79 }
80 if n, err := s.CountSnippets(alice, false); err != nil || n != 1 {
81 t.Fatalf("public count: %d %v", n, err)
82 }
83 if n, err := s.CountSnippets(alice, true); err != nil || n != 3 {
84 t.Fatalf("all count: %d %v", n, err)
85 }
86
87 // Update, delete, and the owner cascade.
88 if err := s.UpdateSnippet(id, "renamed", "public"); err != nil {
89 t.Fatal(err)
90 }
91 sn, _ = s.SnippetByPublicID("abcdef012345")
92 if sn.Description != "renamed" || sn.Visibility != "public" {
93 t.Fatalf("after update: %+v", sn)
94 }
95 if err := s.DeleteSnippet(id); err != nil {
96 t.Fatal(err)
97 }
98 if _, err := s.SnippetByPublicID("abcdef012345"); !errors.Is(err, ErrNotFound) {
99 t.Fatalf("after delete: %v", err)
100 }
101 if err := s.DeleteUser(alice); err != nil {
102 t.Fatal(err)
103 }
104 var n int
105 if err := s.DB.QueryRow("SELECT COUNT(*) FROM snippet_files").Scan(&n); err != nil || n != 0 {
106 t.Fatalf("files after user delete: %d %v", n, err)
107 }
108}