internal/store/snippets_test.go

v1.31.1
gitbay/internal/store/snippets_test.go history · blame · raw

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}