apps/library/db_test.go 2.2 K raw
1
package main
2
3
import (
4
	"database/sql"
5
	"testing"
6
7
	sharedsqlite "github.com/stevedylandev/andromeda/pkg/sqlite"
8
)
9
10
func openLibraryTestDB(t *testing.T) *sql.DB {
11
	t.Helper()
12
	db, err := sharedsqlite.Open("file:library-test?mode=memory&cache=shared", booksSchema)
13
	if err != nil {
14
		t.Fatal(err)
15
	}
16
	return db
17
}
18
19
func sp(s string) *string { return &s }
20
21
func TestBookCRUDSearchSettingsAndGoogleHelpers(t *testing.T) {
22
	db := openLibraryTestDB(t)
23
	defer db.Close()
24
	id, err := insertBook(db, NewBook{GoogleID: sp("gid"), Title: "Dune", Authors: "Frank Herbert", ISBN: sp("123"), CoverURL: sp("https://cover"), Notes: sp("note"), Status: "want"})
25
	if err != nil {
26
		t.Fatal(err)
27
	}
28
	book, err := getBook(db, id)
29
	if err != nil || book == nil || book.Title != "Dune" || book.GoogleID == nil || *book.GoogleID != "gid" {
30
		t.Fatalf("book %#v err %v", book, err)
31
	}
32
	if err := updateBookStatus(db, id, "reading"); err != nil {
33
		t.Fatal(err)
34
	}
35
	note := "updated"
36
	if err := updateBookNotes(db, id, &note); err != nil {
37
		t.Fatal(err)
38
	}
39
	book, _ = getBook(db, id)
40
	if book.Status != "reading" || book.Notes == nil || *book.Notes != note {
41
		t.Fatalf("updated book %#v", book)
42
	}
43
	books, err := listBooks(db, "reading")
44
	if err != nil || len(books) != 1 || books[0].ID != id {
45
		t.Fatalf("filtered %#v err %v", books, err)
46
	}
47
	books, err = searchBooks(db, "herbert")
48
	if err != nil || len(books) != 1 {
49
		t.Fatalf("search %#v err %v", books, err)
50
	}
51
	if err := deleteBook(db, id); err != nil {
52
		t.Fatal(err)
53
	}
54
	if got, err := getBook(db, id); err != nil || got != nil {
55
		t.Fatalf("deleted %#v err %v", got, err)
56
	}
57
58
	if _, ok, err := getSetting(db, "missing"); err != nil || ok {
59
		t.Fatalf("missing setting ok=%v err=%v", ok, err)
60
	}
61
	if err := setSetting(db, "category_label.want", "Wishlist"); err != nil {
62
		t.Fatal(err)
63
	}
64
	labels, err := getCategoryLabels(db)
65
	if err != nil {
66
		t.Fatal(err)
67
	}
68
	if labels.Want != "Wishlist" || labels.Read == "" || labels.Reading == "" {
69
		t.Fatalf("labels %#v", labels)
70
	}
71
72
	if got := pickISBN([]identifier{{Kind: "ISBN_10", Identifier: "ten"}, {Kind: "ISBN_13", Identifier: "thirteen"}}); got != "thirteen" {
73
		t.Fatalf("isbn %q", got)
74
	}
75
	if !isISBNChars("123456789X") || isISBNChars("123ABC") {
76
		t.Fatal("isbn char validation failed")
77
	}
78
}