apps/cellar/db_test.go 3.1 K raw
1
package main
2
3
import (
4
	"bytes"
5
	"database/sql"
6
	"testing"
7
8
	sharedsqlite "github.com/stevedylandev/andromeda/pkg/sqlite"
9
)
10
11
func openCellarTestDB(t *testing.T) *sql.DB {
12
	t.Helper()
13
	db, err := sharedsqlite.Open("file:cellar-test?mode=memory&cache=shared", cellarSchema)
14
	if err != nil {
15
		t.Fatal(err)
16
	}
17
	return db
18
}
19
20
func validWine(name string) WineInput {
21
	return WineInput{Name: name, Origin: "France", Grape: "Gamay", Notes: "notes", Background: "bg", Sweetness: 3, Acidity: 3, Tannin: 3, Alcohol: 3, Body: 3, Clarity: 3, ColorIntensity: 3, AromaIntensity: 3, NoseComplexity: 3}
22
}
23
24
func TestWineCRUDValidationListsAndImages(t *testing.T) {
25
	db := openCellarTestDB(t)
26
	defer db.Close()
27
28
	cellar, err := createWine(db, validWine("Cellar"), false)
29
	if err != nil {
30
		t.Fatal(err)
31
	}
32
	if cellar.ShortID == "" || cellar.Wishlist {
33
		t.Fatalf("unexpected cellar wine: %#v", cellar)
34
	}
35
	wish, err := createWine(db, validWine("Wish"), true)
36
	if err != nil {
37
		t.Fatal(err)
38
	}
39
	if !wish.Wishlist {
40
		t.Fatalf("expected wishlist wine: %#v", wish)
41
	}
42
43
	bad := validWine("Bad")
44
	bad.Sweetness = 6
45
	if _, err := createWine(db, bad, false); err == nil {
46
		t.Fatal("expected invalid sweetness to fail")
47
	}
48
	bad = validWine("Bad")
49
	bad.Body = 0
50
	if _, err := createWine(db, bad, false); err == nil {
51
		t.Fatal("expected zero rating to fail")
52
	}
53
54
	cellarList, err := getCellarWines(db)
55
	if err != nil {
56
		t.Fatal(err)
57
	}
58
	if len(cellarList) != 1 || cellarList[0].ShortID != cellar.ShortID {
59
		t.Fatalf("unexpected cellar list: %#v", cellarList)
60
	}
61
	wishlist, err := getWishlistWines(db)
62
	if err != nil {
63
		t.Fatal(err)
64
	}
65
	if len(wishlist) != 1 || wishlist[0].ShortID != wish.ShortID {
66
		t.Fatalf("unexpected wishlist: %#v", wishlist)
67
	}
68
69
	promoted, err := promoteWine(db, wish.ShortID)
70
	if err != nil {
71
		t.Fatal(err)
72
	}
73
	if !promoted {
74
		t.Fatal("expected promotion")
75
	}
76
	promoted, err = promoteWine(db, cellar.ShortID)
77
	if err != nil {
78
		t.Fatal(err)
79
	}
80
	if promoted {
81
		t.Fatal("cellar promotion should be no-op")
82
	}
83
84
	updatedInput := validWine("Updated")
85
	updated, err := updateWine(db, cellar.ShortID, updatedInput)
86
	if err != nil {
87
		t.Fatal(err)
88
	}
89
	if updated == nil || updated.Name != "Updated" {
90
		t.Fatalf("unexpected update: %#v", updated)
91
	}
92
	if got, err := updateWishlistWine(db, cellar.ShortID, "x", "y", "z", "n", "b"); err != nil || got != nil {
93
		t.Fatalf("wishlist update on cellar got %#v err %v", got, err)
94
	}
95
96
	img, mime, err := getWineImage(db, cellar.ShortID)
97
	if err != nil {
98
		t.Fatal(err)
99
	}
100
	if img != nil || mime != "" {
101
		t.Fatalf("expected no image, got %q %q", img, mime)
102
	}
103
	wantImg := []byte{1, 2, 3}
104
	if err := updateWineImage(db, cellar.ShortID, wantImg, "image/png"); err != nil {
105
		t.Fatal(err)
106
	}
107
	img, mime, err = getWineImage(db, cellar.ShortID)
108
	if err != nil {
109
		t.Fatal(err)
110
	}
111
	if !bytes.Equal(img, wantImg) || mime != "image/png" {
112
		t.Fatalf("bad image %v %q", img, mime)
113
	}
114
115
	if err := deleteWine(db, cellar.ShortID); err != nil {
116
		t.Fatal(err)
117
	}
118
	if got, err := getWineByShortID(db, cellar.ShortID); err != nil || got != nil {
119
		t.Fatalf("deleted wine got %#v err %v", got, err)
120
	}
121
	if err := deleteWine(db, "missing"); err != nil {
122
		t.Fatal(err)
123
	}
124
}