apps/posts/db_test.go 4.9 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 openPostsTestDB(t *testing.T) *sql.DB {
11
	t.Helper()
12
	db, err := sharedsqlite.Open("file:posts-test?mode=memory&cache=shared", postsSchema)
13
	if err != nil {
14
		t.Fatal(err)
15
	}
16
	seedDefaultSettings(db)
17
	return db
18
}
19
20
func strp(s string) *string { return &s }
21
22
func postInput(slug, status string) PostInput {
23
	return PostInput{Title: strp("Title " + slug), Slug: slug, Content: "content " + slug, Status: status, Lang: "en"}
24
}
25
26
func TestPostCRUDPublishedAliasesAndDisplayTitle(t *testing.T) {
27
	db := openPostsTestDB(t)
28
	defer db.Close()
29
	draft, err := createPost(db, postInput("draft", "draft"))
30
	if err != nil {
31
		t.Fatal(err)
32
	}
33
	pubIn := postInput("pub", "published")
34
	pubIn.PublishedDate = strp("2024-01-02")
35
	pubIn.Alias = strp("old")
36
	pub, err := createPost(db, pubIn)
37
	if err != nil {
38
		t.Fatal(err)
39
	}
40
	noTitle, err := createPost(db, PostInput{Slug: "no-title", Content: "body fallback content", Status: "draft", Lang: "en"})
41
	if err != nil {
42
		t.Fatal(err)
43
	}
44
	if noTitle.DisplayTitle() != "body fallback content" {
45
		t.Fatalf("fallback title %q", noTitle.DisplayTitle())
46
	}
47
	if _, err := createPost(db, postInput("pub", "draft")); err == nil {
48
		t.Fatal("expected duplicate slug failure")
49
	}
50
	got, err := getPostByShortID(db, draft.ShortID)
51
	if err != nil || got == nil || got.Slug != "draft" {
52
		t.Fatalf("get by id %#v err %v", got, err)
53
	}
54
	got, err = getPostBySlug(db, "pub")
55
	if err != nil || got == nil || got.ShortID != pub.ShortID {
56
		t.Fatalf("get by slug %#v err %v", got, err)
57
	}
58
	all, err := getAllPosts(db)
59
	if err != nil {
60
		t.Fatal(err)
61
	}
62
	if len(all) != 3 || all[0].ShortID != noTitle.ShortID {
63
		t.Fatalf("all posts not newest first: %#v", all)
64
	}
65
	published, err := getPublishedPosts(db, 10)
66
	if err != nil {
67
		t.Fatal(err)
68
	}
69
	if len(published) != 1 || published[0].ShortID != pub.ShortID {
70
		t.Fatalf("published filter: %#v", published)
71
	}
72
	published, err = getPublishedPosts(db, 1)
73
	if err != nil || len(published) != 1 {
74
		t.Fatalf("published limit: %#v err %v", published, err)
75
	}
76
	redir, err := findAliasRedirect(db, "old")
77
	if err != nil {
78
		t.Fatal(err)
79
	}
80
	if redir != "/posts/pub" {
81
		t.Fatalf("redirect %q", redir)
82
	}
83
	redir, err = findAliasRedirect(db, "missing")
84
	if err != nil || redir != "" {
85
		t.Fatalf("missing redirect %q err %v", redir, err)
86
	}
87
88
	newStatus, err := togglePostStatus(db, draft.ShortID)
89
	if err != nil || newStatus != "published" {
90
		t.Fatalf("toggle draft %#v %v", newStatus, err)
91
	}
92
	newStatus, err = togglePostStatus(db, draft.ShortID)
93
	if err != nil || newStatus != "draft" {
94
		t.Fatalf("toggle published %#v %v", newStatus, err)
95
	}
96
	deleted, err := deletePost(db, pub.ShortID)
97
	if err != nil || !deleted {
98
		t.Fatalf("delete %v %v", deleted, err)
99
	}
100
	deleted, err = deletePost(db, "missing")
101
	if err != nil || deleted {
102
		t.Fatalf("delete missing %v %v", deleted, err)
103
	}
104
}
105
106
func TestPagesSettingsAndFiles(t *testing.T) {
107
	db := openPostsTestDB(t)
108
	defer db.Close()
109
	page, err := createPage(db, "About", "about", "hello", true, 2)
110
	if err != nil {
111
		t.Fatal(err)
112
	}
113
	if got, err := getPageByShortID(db, page.ShortID); err != nil || got == nil || got.Title != "About" {
114
		t.Fatalf("page by id %#v err %v", got, err)
115
	}
116
	if got, err := getPageBySlug(db, "about"); err != nil || got == nil || got.ShortID != page.ShortID {
117
		t.Fatalf("page by slug %#v err %v", got, err)
118
	}
119
	updated, err := updatePage(db, page.ShortID, "About us", "about-us", "hi", false, 1)
120
	if err != nil || updated == nil || updated.IsPublished || updated.NavOrder != 1 {
121
		t.Fatalf("updated page %#v err %v", updated, err)
122
	}
123
	if err := deletePage(db, page.ShortID); err != nil {
124
		t.Fatal(err)
125
	}
126
	if got, err := getPageByShortID(db, page.ShortID); err != nil || got != nil {
127
		t.Fatalf("deleted page %#v err %v", got, err)
128
	}
129
130
	if v, err := getSetting(db, "missing"); err != nil || v != "" {
131
		t.Fatalf("missing setting %q err %v", v, err)
132
	}
133
	if err := setSetting(db, "blog_title", "Andromeda"); err != nil {
134
		t.Fatal(err)
135
	}
136
	if err := setSetting(db, "blog_title", "Updated"); err != nil {
137
		t.Fatal(err)
138
	}
139
	if v, err := getSetting(db, "blog_title"); err != nil || v != "Updated" {
140
		t.Fatalf("setting %q err %v", v, err)
141
	}
142
143
	file, err := createFile(db, "stored.jpg", "photo.jpg", "image/jpeg", 123, "")
144
	if err != nil {
145
		t.Fatal(err)
146
	}
147
	if file.StorageBackend != "local" {
148
		t.Fatalf("backend %q", file.StorageBackend)
149
	}
150
	if got, err := getFileByFilename(db, "stored.jpg"); err != nil || got == nil || got.OriginalName != "photo.jpg" {
151
		t.Fatalf("file %#v err %v", got, err)
152
	}
153
	files, err := getAllFiles(db)
154
	if err != nil || len(files) != 1 {
155
		t.Fatalf("files %#v err %v", files, err)
156
	}
157
	deleted, err := deleteFile(db, file.ShortID)
158
	if err != nil || deleted == nil || deleted.Filename != "stored.jpg" {
159
		t.Fatalf("deleted file %#v err %v", deleted, err)
160
	}
161
	deleted, err = deleteFile(db, "missing")
162
	if err != nil || deleted != nil {
163
		t.Fatalf("missing file %#v err %v", deleted, err)
164
	}
165
}