storage_test.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  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, badMenuItemsTable, 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. Data: []byte("abc123xyz098"),
  282. },
  283. shouldSeed: true,
  284. err: nil,
  285. },
  286. {
  287. seed: Image{
  288. Ident: Identifier("zxcvbnm"),
  289. },
  290. shouldSeed: false,
  291. err: ErrNotExists,
  292. },
  293. } {
  294. if tc.shouldSeed {
  295. _, err := db.Exec("INSERT INTO images (id, title, desc, created) VALUES (?,?,?,?)", string(tc.seed.Ident), tc.seed.Title, tc.seed.Desc, "2024-12-31")
  296. if err != nil {
  297. t.Error(err)
  298. }
  299. testDb.imageIO.Put(tc.seed.Data, tc.seed.Ident)
  300. }
  301. got, err := testDb.GetImage(tc.seed.Ident)
  302. if err != nil {
  303. assert.Equal(t, tc.err, err)
  304. } else {
  305. assert.Equal(t, tc.seed, got)
  306. }
  307. }
  308. }
  309. func TestGetAllImages(t *testing.T) {
  310. testDb, db := newTestDb(t.TempDir(), true)
  311. type testcase struct {
  312. seed []Image
  313. }
  314. for _, tc := range []testcase{
  315. {
  316. seed: []Image{
  317. {
  318. Ident: Identifier("abc123"),
  319. Title: "xyz098",
  320. Data: []byte("abc123xyz098"),
  321. Created: "2024-12-31",
  322. Desc: "description",
  323. },
  324. {
  325. Ident: Identifier("xyz098"),
  326. Title: "abc123",
  327. Data: []byte("abc123xyz098"),
  328. Created: "2024-12-31",
  329. Desc: "description",
  330. },
  331. },
  332. },
  333. } {
  334. for i := range tc.seed {
  335. _, err := db.Exec("INSERT INTO images (id, title, desc, created) VALUES (?,?,?,?)", string(tc.seed[i].Ident), tc.seed[i].Title, tc.seed[i].Desc, tc.seed[i].Created)
  336. if err != nil {
  337. t.Error(err)
  338. }
  339. testDb.imageIO.Put(tc.seed[i].Data, tc.seed[i].Ident)
  340. }
  341. got := testDb.GetAllImages()
  342. assert.Equal(t, tc.seed, got)
  343. }
  344. }
  345. func TestAllDocuments(t *testing.T) {
  346. testDb, db := newTestDb(t.TempDir(), true)
  347. type testcase struct {
  348. seed []Document
  349. }
  350. for _, tc := range []testcase{
  351. {
  352. seed: []Document{
  353. {
  354. Row: 1,
  355. Ident: Identifier("qwerty"),
  356. Title: "abc 123",
  357. Created: "2024-12-31",
  358. Body: "blog post body etc",
  359. Category: BLOG,
  360. Sample: "this is a sample",
  361. },
  362. {
  363. Row: 2,
  364. Ident: Identifier("poiuyt"),
  365. Title: "abc 123",
  366. Created: "2024-12-31",
  367. Body: "blog post body etc",
  368. Category: BLOG,
  369. Sample: "this is a sample",
  370. },
  371. },
  372. },
  373. } {
  374. stmt, _ := db.Prepare("INSERT INTO posts(id, title, created, body, category, sample) VALUES (?,?,?,?,?,?)")
  375. for i := range tc.seed {
  376. _, 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)
  377. if err != nil {
  378. t.Error(err)
  379. }
  380. }
  381. got := testDb.AllDocuments()
  382. assert.Equal(t, tc.seed, got)
  383. }
  384. }
  385. func TestUpdateDocument(t *testing.T) {
  386. type testcase struct {
  387. migrate bool
  388. seed Document
  389. input Document
  390. err error
  391. }
  392. for _, tc := range []testcase{
  393. {
  394. migrate: true,
  395. seed: Document{
  396. Row: 1,
  397. Ident: Identifier("qwerty"),
  398. Title: "abc 123",
  399. Created: "2024-12-31",
  400. Body: "blog post body etc",
  401. Category: BLOG,
  402. Sample: "this is a sample",
  403. },
  404. input: Document{
  405. Row: 1,
  406. Ident: Identifier("qwerty"),
  407. Title: "new title",
  408. Created: "2024-12-31",
  409. Body: "new updated post that must be reflected after the update",
  410. Category: BLOG,
  411. Sample: "new updated post that must be reflected after the update",
  412. },
  413. err: nil,
  414. },
  415. {
  416. migrate: true,
  417. seed: Document{
  418. Row: 1,
  419. Ident: Identifier("asdf"),
  420. Title: "abc 123",
  421. Created: "2024-12-31",
  422. Body: "blog post body etc",
  423. Category: BLOG,
  424. Sample: "this is a sample",
  425. },
  426. input: Document{
  427. Row: 1,
  428. Ident: Identifier("This id does not exist"),
  429. Title: "new title",
  430. Created: "2024-12-31",
  431. Body: "new updated post that must be reflected after the update",
  432. Category: BLOG,
  433. Sample: "new updated post that must be reflected after the update",
  434. },
  435. err: ErrNotExists,
  436. },
  437. {
  438. migrate: false, // not creating the database tables so we can error out the SQL statement execution
  439. seed: Document{
  440. Row: 1,
  441. Ident: Identifier("asdf"),
  442. Title: "abc 123",
  443. Created: "2024-12-31",
  444. Body: "blog post body etc",
  445. Category: BLOG,
  446. Sample: "this is a sample",
  447. },
  448. input: Document{
  449. Row: 1,
  450. Ident: Identifier("This id does not exist"),
  451. Title: "new title",
  452. Created: "2024-12-31",
  453. Body: "new updated post that must be reflected after the update",
  454. Category: BLOG,
  455. Sample: "new updated post that must be reflected after the update",
  456. },
  457. err: errors.New("no such column: title"),
  458. },
  459. } {
  460. testDb, db := newTestDb(t.TempDir(), tc.migrate)
  461. if tc.migrate {
  462. stmt, _ := db.Prepare("INSERT INTO posts(id, title, created, body, category, sample) VALUES (?,?,?,?,?,?)")
  463. _, err := stmt.Exec(tc.seed.Ident, tc.seed.Title, tc.seed.Created, tc.seed.Body, tc.seed.Category, tc.seed.Sample)
  464. if err != nil {
  465. t.Error(err)
  466. }
  467. }
  468. err := testDb.UpdateDocument(tc.input)
  469. if err != nil {
  470. assert.Equal(t, tc.err.Error(), err.Error())
  471. } else {
  472. row := db.QueryRow("SELECT * FROM posts WHERE id = ?", tc.seed.Ident)
  473. var got Document
  474. if err := row.Scan(&got.Row, &got.Ident, &got.Title, &got.Created, &got.Body, &got.Category, &got.Sample); err != nil {
  475. assert.Equal(t, tc.err, err)
  476. }
  477. assert.Equal(t, tc.input, got)
  478. }
  479. }
  480. }
  481. func TestAddImage(t *testing.T) {
  482. type testcase struct {
  483. data []byte
  484. title string
  485. desc string
  486. err error
  487. }
  488. testDb, _ := newTestDb(t.TempDir(), true)
  489. for _, tc := range []testcase{
  490. {
  491. data: []byte("abc123xyz098"),
  492. title: "dont matter",
  493. desc: "also dont matter",
  494. },
  495. } {
  496. id, err := testDb.AddImage(tc.data, tc.title, tc.desc)
  497. if err != nil {
  498. assert.Equal(t, tc.err, err)
  499. } else {
  500. b, err := testDb.imageIO.Get(id)
  501. if err != nil {
  502. t.Error(err)
  503. }
  504. assert.Equal(t, tc.data, b)
  505. }
  506. }
  507. }
  508. func TestAddMenuItem(t *testing.T) {
  509. type testcase struct {
  510. input []LinkPair
  511. err error
  512. }
  513. testDb, db := newTestDb(t.TempDir(), true)
  514. for _, tc := range []testcase{
  515. {
  516. input: []LinkPair{
  517. {
  518. Text: "abc 123",
  519. Link: "/abc/123",
  520. },
  521. },
  522. err: nil,
  523. },
  524. } {
  525. for i := range tc.input {
  526. err := testDb.AddMenuItem(tc.input[i])
  527. if err != nil {
  528. assert.Equal(t, tc.err, err)
  529. }
  530. rows, err := db.Query("SELECT * FROM menu")
  531. var got []LinkPair
  532. defer rows.Close()
  533. for rows.Next() {
  534. var id int
  535. var item LinkPair
  536. err = rows.Scan(&id, &item.Link, &item.Text)
  537. if err != nil {
  538. log.Fatal(err)
  539. }
  540. got = append(got, item)
  541. }
  542. assert.Equal(t, tc.input, got)
  543. }
  544. }
  545. }
  546. func TestAddNavbarItem(t *testing.T) {
  547. type testcase struct {
  548. input []NavBarItem
  549. err error
  550. }
  551. testDb, db := newTestDb(t.TempDir(), true)
  552. for _, tc := range []testcase{
  553. {
  554. input: []NavBarItem{
  555. {
  556. Redirect: "",
  557. Link: "",
  558. Png: []byte(""),
  559. },
  560. },
  561. },
  562. } {
  563. for i := range tc.input {
  564. err := testDb.AddNavbarItem(tc.input[i])
  565. if err != nil {
  566. assert.Equal(t, tc.err, err)
  567. }
  568. }
  569. rows, err := db.Query("SELECT * FROM navbar")
  570. var got []NavBarItem
  571. defer rows.Close()
  572. for rows.Next() {
  573. var item NavBarItem
  574. var id int
  575. err = rows.Scan(&id, &item.Png, &item.Link, &item.Redirect)
  576. if err != nil {
  577. log.Fatal(err)
  578. }
  579. got = append(got, item)
  580. }
  581. assert.Equal(t, tc.input, got)
  582. }
  583. }
  584. func TestAddAsset(t *testing.T) {
  585. type testcase struct {
  586. input []Asset
  587. err error
  588. }
  589. testDb, db := newTestDb(t.TempDir(), true)
  590. for _, tc := range []testcase{
  591. {
  592. input: []Asset{
  593. {
  594. Data: []byte(""),
  595. Name: "",
  596. },
  597. },
  598. },
  599. } {
  600. for i := range tc.input {
  601. err := testDb.AddAsset(tc.input[i].Name, tc.input[i].Data)
  602. if err != nil {
  603. assert.Equal(t, tc.err, err)
  604. }
  605. }
  606. rows, err := db.Query("SELECT * FROM assets")
  607. var assets []Asset
  608. defer rows.Close()
  609. for rows.Next() {
  610. var item Asset
  611. var id int
  612. err = rows.Scan(&id, &item.Name, &item.Data)
  613. if err != nil {
  614. log.Fatal(err)
  615. }
  616. assets = append(assets, item)
  617. }
  618. }
  619. }
  620. func TestAddDocument(t *testing.T) {
  621. testDb, db := newTestDb(t.TempDir(), true)
  622. type testcase struct {
  623. seed Document
  624. err error
  625. }
  626. for _, tc := range []testcase{
  627. {
  628. seed: Document{
  629. Title: "abc 123",
  630. Body: "blog post body etc",
  631. Created: "2024-12-31",
  632. Category: BLOG,
  633. Sample: "this is a sample",
  634. },
  635. err: nil,
  636. },
  637. } {
  638. id, err := testDb.AddDocument(tc.seed)
  639. if err != nil {
  640. assert.Equal(t, tc.err, err)
  641. }
  642. row := db.QueryRow("SELECT * FROM posts WHERE id = ?", id)
  643. var got Document
  644. var rowNum int
  645. if err := row.Scan(&rowNum, &got.Ident, &got.Title, &got.Created, &got.Body, &got.Category, &got.Sample); err != nil {
  646. assert.Equal(t, tc.err, err)
  647. }
  648. want := Document{
  649. Ident: id,
  650. Title: tc.seed.Title,
  651. Body: tc.seed.Body,
  652. Category: tc.seed.Category,
  653. Created: tc.seed.Created,
  654. Sample: tc.seed.MakeSample(),
  655. }
  656. assert.Equal(t, want, got)
  657. }
  658. }
  659. func TestAddAdminTableEntry(t *testing.T) {
  660. type testcase struct {
  661. input AdminPage
  662. err error
  663. }
  664. testDb, db := newTestDb(t.TempDir(), true)
  665. for _, tc := range []testcase{
  666. {
  667. input: AdminPage{
  668. Tables: map[string][]TableData{
  669. "test category": {
  670. {
  671. DisplayName: "abc 123",
  672. Link: "/abc/123",
  673. },
  674. },
  675. },
  676. },
  677. err: nil,
  678. },
  679. } {
  680. for ctg, tables := range tc.input.Tables {
  681. for i := range tables {
  682. err := testDb.AddAdminTableEntry(tables[i], ctg)
  683. if err != nil {
  684. assert.Equal(t, tc.err, err)
  685. }
  686. }
  687. }
  688. rows, err := db.Query("SELECT * FROM admin")
  689. got := AdminPage{Tables: map[string][]TableData{}}
  690. defer rows.Close()
  691. for rows.Next() {
  692. var item TableData
  693. var id int
  694. var category string
  695. err = rows.Scan(&id, &item.DisplayName, &item.Link, &category)
  696. if err != nil {
  697. log.Fatal(err)
  698. }
  699. got.Tables[category] = append(got.Tables[category], item)
  700. }
  701. assert.Equal(t, tc.input, got)
  702. }
  703. }
  704. func TestDeleteDocument(t *testing.T) {
  705. type testcase struct {
  706. input Document
  707. err error
  708. }
  709. testDb, db := newTestDb(t.TempDir(), true)
  710. for _, tc := range []testcase{
  711. {
  712. input: Document{
  713. Title: "abc 123",
  714. Body: "blog post body etc",
  715. Created: "2024-12-31",
  716. Category: BLOG,
  717. Sample: "this is a sample",
  718. },
  719. err: nil,
  720. },
  721. } {
  722. id, err := testDb.AddDocument(tc.input)
  723. if err != nil {
  724. t.Error("failed to add doc: ", err)
  725. }
  726. err = testDb.DeleteDocument(id)
  727. if err != nil {
  728. assert.Equal(t, tc.err, err)
  729. }
  730. row, _ := db.Query("SELECT * FROM posts")
  731. if row.Next() {
  732. t.Error("Too many rows returned after deleting")
  733. }
  734. }
  735. }
  736. func TestGetImageStore(t *testing.T) {
  737. // testDb, db := newTestDb(t.TempDir(), true)
  738. }
  739. func TestNewIdentifier(t *testing.T) {
  740. // testDb, db := newTestDb(t.TempDir(), true)
  741. }