| 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 | } |