storage_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. package storage
  2. import (
  3. "database/sql"
  4. "errors"
  5. "log"
  6. "testing"
  7. _ "github.com/mattn/go-sqlite3"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. const badPostsTable = `
  11. CREATE TABLE IF NOT EXISTS posts(
  12. row INTEGER PRIMARY KEY AUTOINCREMENT
  13. );
  14. `
  15. const badImagesTable = `
  16. CREATE TABLE IF NOT EXISTS images(
  17. row INTEGER PRIMARY KEY AUTOINCREMENT
  18. );
  19. `
  20. const badMenuItemsTable = `
  21. CREATE TABLE IF NOT EXISTS menu(
  22. row INTEGER PRIMARY KEY AUTOINCREMENT
  23. );
  24. `
  25. const badNavbarItemsTable = `
  26. CREATE TABLE IF NOT EXISTS navbar(
  27. row INTEGER PRIMARY KEY AUTOINCREMENT
  28. );`
  29. const badAssetTable = `
  30. CREATE TABLE IF NOT EXISTS assets(
  31. row INTEGER PRIMARY KEY AUTOINCREMENT
  32. );
  33. `
  34. const badAdminTable = `
  35. CREATE TABLE IF NOT EXISTS admin(
  36. row INTEGER PRIMARY KEY AUTOINCREMENT
  37. );
  38. `
  39. var unpopulatedTables = []string{badPostsTable, badImagesTable, badNavbarItemsTable, badMenuItemsTable, badAssetTable, badAdminTable}
  40. /*
  41. creates in memory db and SQLiteRepo struct
  42. :param tmp: path to the temp directory for the filesystem IO struct to write images to
  43. :param migrate: choose to 'migrate' the database and create all the tables
  44. */
  45. func newTestDb(tmp string, migrate bool) (*SQLiteRepo, *sql.DB) {
  46. db, err := sql.Open("sqlite3", ":memory:")
  47. if err != nil {
  48. log.Fatal(err)
  49. }
  50. testDb := &SQLiteRepo{db: db, imageIO: FilesystemImageIO{RootDir: tmp}}
  51. if migrate {
  52. err = testDb.Migrate(RequiredTables)
  53. } else {
  54. err = testDb.Migrate(unpopulatedTables)
  55. }
  56. if err != nil {
  57. log.Fatal("failed to start the test database: ", err)
  58. }
  59. return testDb, db
  60. }
  61. func TestMigrate(t *testing.T) {
  62. requiredTables := []string{
  63. "posts",
  64. "images",
  65. "menu",
  66. "navbar",
  67. "assets",
  68. "admin",
  69. }
  70. db, err := sql.Open("sqlite3", ":memory:")
  71. if err != nil {
  72. log.Fatal(err)
  73. }
  74. testDb := &SQLiteRepo{db: db}
  75. err = testDb.Migrate(RequiredTables)
  76. if err != nil {
  77. t.Error(err)
  78. }
  79. for i := range requiredTables {
  80. name := requiredTables[i]
  81. row := db.QueryRow("SELECT name FROM sqlite_master WHERE type='table' AND name='?'", name)
  82. if row.Err() != nil {
  83. t.Errorf("error querying table: %s", name)
  84. }
  85. if row == nil {
  86. t.Errorf("no table returned: %s", name)
  87. }
  88. }
  89. }
  90. func TestGetDropdownElements(t *testing.T) {
  91. type testcase struct {
  92. seed []LinkPair
  93. }
  94. testDb, db := newTestDb(t.TempDir(), true)
  95. for _, tc := range []testcase{
  96. {
  97. seed: []LinkPair{
  98. {
  99. Text: "abc123",
  100. Link: "/abc/123",
  101. },
  102. },
  103. },
  104. } {
  105. stmt, _ := db.Prepare("INSERT INTO menu(link, text) VALUES (?,?)")
  106. for i := range tc.seed {
  107. _, err := stmt.Exec(tc.seed[i].Link, tc.seed[i].Text)
  108. if err != nil {
  109. t.Errorf("failed to seed: %s", err)
  110. }
  111. }
  112. got := testDb.GetDropdownElements()
  113. assert.Equal(t, got, tc.seed)
  114. }
  115. }
  116. func TestGetNavBarLinks(t *testing.T) {
  117. type testcase struct {
  118. seed []NavBarItem
  119. }
  120. testDb, db := newTestDb(t.TempDir(), true)
  121. for _, tc := range []testcase{
  122. {
  123. seed: []NavBarItem{
  124. {
  125. Link: "/abc/123",
  126. Redirect: "/abc/123/site",
  127. Png: []byte("xzy123abc098"),
  128. },
  129. },
  130. },
  131. } {
  132. stmt, _ := db.Prepare("INSERT INTO navbar(png, link, redirect) VALUES (?,?,?)")
  133. for i := range tc.seed {
  134. _, err := stmt.Exec(tc.seed[i].Png, tc.seed[i].Link, tc.seed[i].Redirect)
  135. if err != nil {
  136. t.Errorf("failed to seed: %s", err)
  137. }
  138. }
  139. got := testDb.GetNavBarLinks()
  140. assert.Equal(t, tc.seed, got)
  141. }
  142. }
  143. func TestGetAssets(t *testing.T) {
  144. type testcase struct {
  145. seed []Asset
  146. }
  147. testDb, db := newTestDb(t.TempDir(), true)
  148. for _, tc := range []testcase{
  149. {
  150. seed: []Asset{
  151. {
  152. Data: []byte("abc123xyz098"),
  153. Name: "asset1",
  154. },
  155. },
  156. },
  157. } {
  158. stmt, _ := db.Prepare("INSERT INTO assets(data, name) VALUES (?,?)")
  159. for i := range tc.seed {
  160. _, err := stmt.Exec(tc.seed[i].Data, tc.seed[i].Name)
  161. if err != nil {
  162. t.Error(err)
  163. }
  164. }
  165. got := testDb.GetAssets()
  166. assert.Equal(t, tc.seed, got)
  167. }
  168. }
  169. func TestGetAdminTables(t *testing.T) {
  170. type testcase struct {
  171. seed AdminPage
  172. }
  173. testDb, db := newTestDb(t.TempDir(), true)
  174. for _, tc := range []testcase{
  175. {
  176. seed: AdminPage{
  177. Tables: map[string][]TableData{
  178. "test": {
  179. {
  180. DisplayName: "abc123",
  181. Link: "xyz098",
  182. },
  183. },
  184. },
  185. },
  186. },
  187. } {
  188. stmt, _ := db.Prepare("INSERT INTO admin(display_name, link, category) VALUES (?,?,?)")
  189. for k, table := range tc.seed.Tables {
  190. for i := range table {
  191. _, err := stmt.Exec(table[i].DisplayName, table[i].Link, k)
  192. if err != nil {
  193. t.Error(err)
  194. }
  195. }
  196. }
  197. got := testDb.GetAdminTables()
  198. assert.Equal(t, tc.seed, got)
  199. }
  200. }
  201. func TestGetDocument(t *testing.T) {
  202. type testcase struct {
  203. seed Document
  204. }
  205. testDb, db := newTestDb(t.TempDir(), true)
  206. for _, tc := range []testcase{
  207. {
  208. seed: Document{
  209. Ident: Identifier("qwerty"),
  210. Title: "abc 123",
  211. Created: "2024-12-31",
  212. Body: "blog post body etc",
  213. Category: BLOG,
  214. Sample: "this is a sample",
  215. },
  216. },
  217. } {
  218. stmt, _ := db.Prepare("INSERT INTO posts(id, title, created, body, category, sample) VALUES (?,?,?,?,?,?)")
  219. _, err := stmt.Exec(tc.seed.Ident, tc.seed.Title, tc.seed.Created, tc.seed.Body, tc.seed.Category, tc.seed.Sample)
  220. if err != nil {
  221. t.Error(err)
  222. }
  223. got, _ := testDb.GetDocument(Identifier("qwerty"))
  224. assert.Equal(t, tc.seed, got)
  225. }
  226. }
  227. func TestGetByCategory(t *testing.T) {
  228. type testcase struct {
  229. seed []Document
  230. }
  231. testDb, db := newTestDb(t.TempDir(), true)
  232. for _, tc := range []testcase{
  233. {
  234. seed: []Document{
  235. {
  236. Row: 1,
  237. Ident: Identifier("qwerty"),
  238. Title: "abc 123",
  239. Created: "2024-12-31",
  240. Body: "blog post body etc",
  241. Category: BLOG,
  242. Sample: "this is a sample",
  243. },
  244. {
  245. Row: 2,
  246. Ident: Identifier("poiuyt"),
  247. Title: "abc 123",
  248. Created: "2024-12-31",
  249. Body: "blog post body etc",
  250. Category: BLOG,
  251. Sample: "this is a sample",
  252. },
  253. },
  254. },
  255. } {
  256. stmt, _ := db.Prepare("INSERT INTO posts(id, title, created, body, category, sample) VALUES (?,?,?,?,?,?)")
  257. for i := range tc.seed {
  258. _, err := stmt.Exec(tc.seed[i].Ident, tc.seed[i].Title, tc.seed[i].Created, tc.seed[i].Body, tc.seed[i].Category, tc.seed[i].Sample)
  259. if err != nil {
  260. t.Error(err)
  261. }
  262. }
  263. got := testDb.GetByCategory(BLOG)
  264. assert.Equal(t, tc.seed, got)
  265. }
  266. }
  267. func TestGetImage(t *testing.T) {
  268. testDb, db := newTestDb(t.TempDir(), true)
  269. type testcase struct {
  270. seed Image
  271. shouldSeed bool
  272. err error
  273. }
  274. for _, tc := range []testcase{
  275. {
  276. seed: Image{
  277. Ident: Identifier("abc123"),
  278. Title: "xyz098",
  279. Desc: "description",
  280. Created: "2024-12-31",
  281. Category: "homepage",
  282. Data: []byte("abc123xyz098"),
  283. },
  284. shouldSeed: true,
  285. err: nil,
  286. },
  287. {
  288. seed: Image{
  289. Ident: Identifier("zxcvbnm"),
  290. },
  291. shouldSeed: false,
  292. err: ErrNotExists,
  293. },
  294. } {
  295. if tc.shouldSeed {
  296. _, err := db.Exec("INSERT INTO images (id, title, desc, created, category) VALUES (?,?,?,?,?)", string(tc.seed.Ident), tc.seed.Title, tc.seed.Desc, "2024-12-31", tc.seed.Category)
  297. if err != nil {
  298. t.Error(err)
  299. }
  300. testDb.imageIO.Put(tc.seed.Data, tc.seed.Ident)
  301. }
  302. got, err := testDb.GetImage(tc.seed.Ident)
  303. if err != nil {
  304. assert.Equal(t, tc.err, err)
  305. } else {
  306. assert.Equal(t, tc.seed, got)
  307. }
  308. }
  309. }
  310. func TestGetAllImages(t *testing.T) {
  311. testDb, db := newTestDb(t.TempDir(), true)
  312. type testcase struct {
  313. seed []Image
  314. }
  315. for _, tc := range []testcase{
  316. {
  317. seed: []Image{
  318. {
  319. Ident: Identifier("abc123"),
  320. Title: "xyz098",
  321. Data: []byte("abc123xyz098"),
  322. Created: "2024-12-31",
  323. Desc: "description",
  324. Category: "homepage",
  325. },
  326. {
  327. Ident: Identifier("xyz098"),
  328. Title: "abc123",
  329. Data: []byte("abc123xyz098"),
  330. Created: "2024-12-31",
  331. Desc: "description",
  332. Category: "homepage",
  333. },
  334. },
  335. },
  336. } {
  337. for i := range tc.seed {
  338. _, err := db.Exec("INSERT INTO images (id, title, desc, created, category) VALUES (?,?,?,?,?)", string(tc.seed[i].Ident), tc.seed[i].Title, tc.seed[i].Desc, tc.seed[i].Created, tc.seed[i].Category)
  339. if err != nil {
  340. t.Error(err)
  341. }
  342. testDb.imageIO.Put(tc.seed[i].Data, tc.seed[i].Ident)
  343. }
  344. got := testDb.GetAllImages()
  345. assert.Equal(t, tc.seed, got)
  346. }
  347. }
  348. func TestAllDocuments(t *testing.T) {
  349. testDb, db := newTestDb(t.TempDir(), true)
  350. type testcase struct {
  351. seed []Document
  352. }
  353. for _, tc := range []testcase{
  354. {
  355. seed: []Document{
  356. {
  357. Row: 1,
  358. Ident: Identifier("qwerty"),
  359. Title: "abc 123",
  360. Created: "2024-12-31",
  361. Body: "blog post body etc",
  362. Category: BLOG,
  363. Sample: "this is a sample",
  364. },
  365. {
  366. Row: 2,
  367. Ident: Identifier("poiuyt"),
  368. Title: "abc 123",
  369. Created: "2024-12-31",
  370. Body: "blog post body etc",
  371. Category: BLOG,
  372. Sample: "this is a sample",
  373. },
  374. },
  375. },
  376. } {
  377. stmt, _ := db.Prepare("INSERT INTO posts(id, title, created, body, category, sample) VALUES (?,?,?,?,?,?)")
  378. for i := range tc.seed {
  379. _, err := stmt.Exec(tc.seed[i].Ident, tc.seed[i].Title, tc.seed[i].Created, tc.seed[i].Body, tc.seed[i].Category, tc.seed[i].Sample)
  380. if err != nil {
  381. t.Error(err)
  382. }
  383. }
  384. got := testDb.AllDocuments()
  385. assert.Equal(t, tc.seed, got)
  386. }
  387. }
  388. func TestUpdateDocument(t *testing.T) {
  389. type testcase struct {
  390. migrate bool
  391. seed Document
  392. input Document
  393. err error
  394. }
  395. for _, tc := range []testcase{
  396. {
  397. migrate: true,
  398. seed: Document{
  399. Row: 1,
  400. Ident: Identifier("qwerty"),
  401. Title: "abc 123",
  402. Created: "2024-12-31",
  403. Body: "blog post body etc",
  404. Category: BLOG,
  405. Sample: "this is a sample",
  406. },
  407. input: Document{
  408. Row: 1,
  409. Ident: Identifier("qwerty"),
  410. Title: "new title",
  411. Created: "2024-12-31",
  412. Body: "new updated post that must be reflected after the update",
  413. Category: BLOG,
  414. Sample: "new updated post that must be reflected after the update",
  415. },
  416. err: nil,
  417. },
  418. {
  419. migrate: true,
  420. seed: Document{
  421. Row: 1,
  422. Ident: Identifier("asdf"),
  423. Title: "abc 123",
  424. Created: "2024-12-31",
  425. Body: "blog post body etc",
  426. Category: BLOG,
  427. Sample: "this is a sample",
  428. },
  429. input: Document{
  430. Row: 1,
  431. Ident: Identifier("This id does not exist"),
  432. Title: "new title",
  433. Created: "2024-12-31",
  434. Body: "new updated post that must be reflected after the update",
  435. Category: BLOG,
  436. Sample: "new updated post that must be reflected after the update",
  437. },
  438. err: ErrNotExists,
  439. },
  440. {
  441. migrate: false, // not creating the database tables so we can error out the SQL statement execution
  442. seed: Document{
  443. Row: 1,
  444. Ident: Identifier("asdf"),
  445. Title: "abc 123",
  446. Created: "2024-12-31",
  447. Body: "blog post body etc",
  448. Category: BLOG,
  449. Sample: "this is a sample",
  450. },
  451. input: Document{
  452. Row: 1,
  453. Ident: Identifier("This id does not exist"),
  454. Title: "new title",
  455. Created: "2024-12-31",
  456. Body: "new updated post that must be reflected after the update",
  457. Category: BLOG,
  458. Sample: "new updated post that must be reflected after the update",
  459. },
  460. err: errors.New("no such column: title"),
  461. },
  462. } {
  463. testDb, db := newTestDb(t.TempDir(), tc.migrate)
  464. if tc.migrate {
  465. stmt, _ := db.Prepare("INSERT INTO posts(id, title, created, body, category, sample) VALUES (?,?,?,?,?,?)")
  466. _, err := stmt.Exec(tc.seed.Ident, tc.seed.Title, tc.seed.Created, tc.seed.Body, tc.seed.Category, tc.seed.Sample)
  467. if err != nil {
  468. t.Error(err)
  469. }
  470. }
  471. err := testDb.UpdateDocument(tc.input)
  472. if err != nil {
  473. assert.Equal(t, tc.err.Error(), err.Error())
  474. } else {
  475. row := db.QueryRow("SELECT * FROM posts WHERE id = ?", tc.seed.Ident)
  476. var got Document
  477. if err := row.Scan(&got.Row, &got.Ident, &got.Title, &got.Created, &got.Body, &got.Category, &got.Sample); err != nil {
  478. assert.Equal(t, tc.err, err)
  479. }
  480. assert.Equal(t, tc.input, got)
  481. }
  482. }
  483. }
  484. func TestAddImage(t *testing.T) {
  485. type testcase struct {
  486. data []byte
  487. title string
  488. desc string
  489. category string
  490. err error
  491. }
  492. testDb, _ := newTestDb(t.TempDir(), true)
  493. for _, tc := range []testcase{
  494. {
  495. data: []byte("abc123xyz098"),
  496. title: "dont matter",
  497. desc: "also dont matter",
  498. category: "homepage",
  499. },
  500. } {
  501. id, err := testDb.AddImage(tc.data, tc.title, tc.desc, tc.category)
  502. if err != nil {
  503. assert.Equal(t, tc.err, err)
  504. } else {
  505. b, err := testDb.imageIO.Get(id)
  506. if err != nil {
  507. t.Error(err)
  508. }
  509. assert.Equal(t, tc.data, b)
  510. }
  511. }
  512. }
  513. func TestAddMenuItem(t *testing.T) {
  514. type testcase struct {
  515. input []LinkPair
  516. err error
  517. }
  518. testDb, _ := newTestDb(t.TempDir(), true)
  519. for _, tc := range []testcase{
  520. {
  521. input: []LinkPair{
  522. {
  523. Text: "abc 123",
  524. Link: "/abc/123",
  525. },
  526. },
  527. err: nil,
  528. },
  529. } {
  530. for i := range tc.input {
  531. err := testDb.AddMenuItem(tc.input[i])
  532. if err != nil {
  533. // assert.Equal(expected, actual)
  534. assert.Equal(t, tc.err, err)
  535. }
  536. rows, err := testDb.db.Query("SELECT * FROM menu")
  537. var got []LinkPair
  538. defer rows.Close()
  539. for rows.Next() {
  540. var item LinkPair
  541. var id int
  542. err = rows.Scan(&id, &item.Link, &item.Text)
  543. if err != nil {
  544. t.Errorf("failed: %s", err.Error())
  545. }
  546. got = append(got, item)
  547. }
  548. assert.Equal(t, tc.input, got)
  549. }
  550. }
  551. }
  552. func TestAddNavbarItem(t *testing.T) {
  553. type testcase struct {
  554. input []NavBarItem
  555. err error
  556. }
  557. testDb, _ := newTestDb(t.TempDir(), true)
  558. for _, tc := range []testcase{
  559. {
  560. input: []NavBarItem{
  561. {
  562. Redirect: "http://whatever.com",
  563. Link: "api/stuff/picture.jpeg",
  564. Png: []byte(""),
  565. },
  566. },
  567. },
  568. } {
  569. for i := range tc.input {
  570. err := testDb.AddNavbarItem(tc.input[i])
  571. if err != nil {
  572. assert.Equal(t, tc.err, err)
  573. }
  574. }
  575. rows, err := testDb.db.Query("SELECT * FROM navbar")
  576. var got []NavBarItem
  577. defer rows.Close()
  578. for rows.Next() {
  579. var item NavBarItem
  580. var id int
  581. err = rows.Scan(&id, &item.Png, &item.Link, &item.Redirect)
  582. if err != nil {
  583. log.Fatal(err)
  584. }
  585. got = append(got, item)
  586. }
  587. assert.Equal(t, tc.input, got)
  588. }
  589. }
  590. func TestAddAsset(t *testing.T) {
  591. type testcase struct {
  592. input []Asset
  593. err error
  594. }
  595. testDb, _ := newTestDb(t.TempDir(), true)
  596. for _, tc := range []testcase{
  597. {
  598. input: []Asset{
  599. {
  600. Data: []byte(""),
  601. Name: "",
  602. },
  603. },
  604. },
  605. } {
  606. for i := range tc.input {
  607. err := testDb.AddAsset(tc.input[i].Name, tc.input[i].Data)
  608. if err != nil {
  609. assert.Equal(t, tc.err, err)
  610. }
  611. }
  612. rows, err := testDb.db.Query("SELECT * FROM assets")
  613. var assets []Asset
  614. defer rows.Close()
  615. for rows.Next() {
  616. var item Asset
  617. var id int
  618. err = rows.Scan(&id, &item.Name, &item.Data)
  619. if err != nil {
  620. log.Fatal(err)
  621. }
  622. assets = append(assets, item)
  623. }
  624. }
  625. }
  626. func TestAddDocument(t *testing.T) {
  627. testDb, db := newTestDb(t.TempDir(), true)
  628. type testcase struct {
  629. seed Document
  630. err error
  631. }
  632. for _, tc := range []testcase{
  633. {
  634. seed: Document{
  635. Title: "abc 123",
  636. Body: "blog post body etc",
  637. Created: "2024-12-31",
  638. Category: BLOG,
  639. Sample: "this is a sample",
  640. },
  641. err: nil,
  642. },
  643. } {
  644. id, err := testDb.AddDocument(tc.seed)
  645. if err != nil {
  646. assert.Equal(t, tc.err, err)
  647. }
  648. row := db.QueryRow("SELECT * FROM posts WHERE id = ?", id)
  649. var got Document
  650. var rowNum int
  651. if err := row.Scan(&rowNum, &got.Ident, &got.Title, &got.Created, &got.Body, &got.Category, &got.Sample); err != nil {
  652. assert.Equal(t, tc.err, err)
  653. }
  654. want := Document{
  655. Ident: id,
  656. Title: tc.seed.Title,
  657. Body: tc.seed.Body,
  658. Category: tc.seed.Category,
  659. Created: tc.seed.Created,
  660. Sample: tc.seed.MakeSample(),
  661. }
  662. assert.Equal(t, want, got)
  663. }
  664. }
  665. func TestAddAdminTableEntry(t *testing.T) {
  666. type testcase struct {
  667. input AdminPage
  668. err error
  669. }
  670. testDb, _ := newTestDb(t.TempDir(), true)
  671. for _, tc := range []testcase{
  672. {
  673. input: AdminPage{
  674. Tables: map[string][]TableData{
  675. "test category": {
  676. {
  677. DisplayName: "abc 123",
  678. Link: "/abc/123",
  679. },
  680. },
  681. },
  682. },
  683. err: nil,
  684. },
  685. } {
  686. for ctg, tables := range tc.input.Tables {
  687. for i := range tables {
  688. err := testDb.AddAdminTableEntry(tables[i], ctg)
  689. if err != nil {
  690. assert.Equal(t, tc.err, err)
  691. }
  692. }
  693. }
  694. rows, err := testDb.db.Query("SELECT * FROM admin")
  695. got := AdminPage{Tables: map[string][]TableData{}}
  696. defer rows.Close()
  697. for rows.Next() {
  698. var item TableData
  699. var id int
  700. var category string
  701. err = rows.Scan(&id, &item.DisplayName, &item.Link, &category)
  702. if err != nil {
  703. log.Fatal(err)
  704. }
  705. got.Tables[category] = append(got.Tables[category], item)
  706. }
  707. assert.Equal(t, tc.input, got)
  708. }
  709. }
  710. func TestDeleteDocument(t *testing.T) {
  711. type testcase struct {
  712. input Document
  713. err error
  714. }
  715. testDb, db := newTestDb(t.TempDir(), true)
  716. for _, tc := range []testcase{
  717. {
  718. input: Document{
  719. Title: "abc 123",
  720. Body: "blog post body etc",
  721. Created: "2024-12-31",
  722. Category: BLOG,
  723. Sample: "this is a sample",
  724. },
  725. err: nil,
  726. },
  727. } {
  728. id, err := testDb.AddDocument(tc.input)
  729. if err != nil {
  730. t.Error("failed to add doc: ", err)
  731. }
  732. err = testDb.DeleteDocument(id)
  733. if err != nil {
  734. assert.Equal(t, tc.err, err)
  735. }
  736. row, _ := db.Query("SELECT * FROM posts")
  737. if row.Next() {
  738. t.Error("Too many rows returned after deleting")
  739. }
  740. }
  741. }
  742. func TestGetImageStore(t *testing.T) {
  743. // testDb, db := newTestDb(t.TempDir(), true)
  744. }
  745. func TestNewIdentifier(t *testing.T) {
  746. // testDb, db := newTestDb(t.TempDir(), true)
  747. }