db_test.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. import { assertEquals, assertExists } from "@std/assert";
  2. import { del, find, insert, update } from "utils/db.ts";
  3. const TEST_DB_PATH = "data/test_postdown.db";
  4. function cleanup() {
  5. try {
  6. Deno.removeSync(TEST_DB_PATH);
  7. } catch {
  8. // File may not exist
  9. }
  10. }
  11. Deno.test("db - insert and find a User", () => {
  12. cleanup();
  13. try {
  14. const result = insert("User", {
  15. name: "testuser",
  16. email: "test@example.com",
  17. password: "hashedpassword",
  18. }, TEST_DB_PATH);
  19. assertEquals(result.length, 1);
  20. assertExists(result[0]["id"]);
  21. const found = find(
  22. "User",
  23. { email: "test@example.com" },
  24. ["name", "email"],
  25. undefined,
  26. TEST_DB_PATH,
  27. );
  28. assertEquals(found.length, 1);
  29. assertEquals(found[0]["name"], "testuser");
  30. assertEquals(found[0]["email"], "test@example.com");
  31. } finally {
  32. cleanup();
  33. }
  34. });
  35. Deno.test("db - find with no results returns empty array", () => {
  36. cleanup();
  37. try {
  38. const found = find(
  39. "User",
  40. { email: "nonexistent@example.com" },
  41. ["id"],
  42. undefined,
  43. TEST_DB_PATH,
  44. );
  45. assertEquals(found.length, 0);
  46. } finally {
  47. cleanup();
  48. }
  49. });
  50. Deno.test("db - find with targetKeys returns only specified columns", () => {
  51. cleanup();
  52. try {
  53. insert("User", {
  54. name: "testuser",
  55. email: "test@example.com",
  56. password: "hashedpassword",
  57. }, TEST_DB_PATH);
  58. const found = find(
  59. "User",
  60. { email: "test@example.com" },
  61. ["name"],
  62. undefined,
  63. TEST_DB_PATH,
  64. );
  65. assertEquals(found.length, 1);
  66. assertEquals(Object.keys(found[0]).length, 1);
  67. assertEquals(found[0]["name"], "testuser");
  68. } finally {
  69. cleanup();
  70. }
  71. });
  72. Deno.test("db - find with limit", () => {
  73. cleanup();
  74. try {
  75. insert("User", {
  76. name: "user1",
  77. email: "user1@example.com",
  78. password: "pass1",
  79. }, TEST_DB_PATH);
  80. insert("User", {
  81. name: "user2",
  82. email: "user2@example.com",
  83. password: "pass2",
  84. }, TEST_DB_PATH);
  85. const found = find("User", { name: "user1" }, ["id"], 1, TEST_DB_PATH);
  86. assertEquals(found.length, 1);
  87. } finally {
  88. cleanup();
  89. }
  90. });
  91. Deno.test("db - update a User record", () => {
  92. cleanup();
  93. try {
  94. const inserted = insert("User", {
  95. name: "oldname",
  96. email: "test@example.com",
  97. password: "hashedpassword",
  98. }, TEST_DB_PATH);
  99. const userId = inserted[0]["id"] as string | number;
  100. const result = update("User", userId, { name: "newname" }, TEST_DB_PATH);
  101. assertEquals(result.length, 1);
  102. const found = find(
  103. "User",
  104. { id: userId },
  105. ["name"],
  106. undefined,
  107. TEST_DB_PATH,
  108. );
  109. assertEquals(found[0]["name"], "newname");
  110. } finally {
  111. cleanup();
  112. }
  113. });
  114. Deno.test("db - delete a User record", () => {
  115. cleanup();
  116. try {
  117. const inserted = insert("User", {
  118. name: "deleteme",
  119. email: "delete@example.com",
  120. password: "hashedpassword",
  121. }, TEST_DB_PATH);
  122. const userId = inserted[0]["id"] as string | number;
  123. const result = del("User", { id: userId }, TEST_DB_PATH);
  124. assertEquals(result, true);
  125. const found = find("User", { id: userId }, ["id"], undefined, TEST_DB_PATH);
  126. assertEquals(found.length, 0);
  127. } finally {
  128. cleanup();
  129. }
  130. });
  131. Deno.test("db - insert and find a Post", () => {
  132. cleanup();
  133. try {
  134. const result = insert("Post", {
  135. id: "abc123",
  136. title: "Test Post",
  137. content: "# Hello World",
  138. user_id: 1,
  139. shared: 0,
  140. }, TEST_DB_PATH);
  141. assertEquals(result.length, 1);
  142. assertEquals(result[0]["id"], "abc123");
  143. const found = find(
  144. "Post",
  145. { id: "abc123" },
  146. ["title", "content"],
  147. undefined,
  148. TEST_DB_PATH,
  149. );
  150. assertEquals(found.length, 1);
  151. assertEquals(found[0]["title"], "Test Post");
  152. assertEquals(found[0]["content"], "# Hello World");
  153. } finally {
  154. cleanup();
  155. }
  156. });
  157. Deno.test("db - insert and find a Token", () => {
  158. cleanup();
  159. try {
  160. const result = insert("Token", {
  161. token: "test-token-123",
  162. user_id: 1,
  163. }, TEST_DB_PATH);
  164. assertEquals(result.length, 1);
  165. const found = find(
  166. "Token",
  167. { token: "test-token-123" },
  168. ["user_id"],
  169. undefined,
  170. TEST_DB_PATH,
  171. );
  172. assertEquals(found.length, 1);
  173. assertEquals(found[0]["user_id"], 1);
  174. } finally {
  175. cleanup();
  176. }
  177. });
  178. Deno.test("db - update Post shared status", () => {
  179. cleanup();
  180. try {
  181. insert("Post", {
  182. id: "share-test",
  183. title: "Share Test",
  184. content: "content",
  185. user_id: 1,
  186. shared: 0,
  187. }, TEST_DB_PATH);
  188. update("Post", "share-test", { shared: 1 }, TEST_DB_PATH);
  189. const found = find(
  190. "Post",
  191. { id: "share-test" },
  192. ["shared"],
  193. undefined,
  194. TEST_DB_PATH,
  195. );
  196. assertEquals(found[0]["shared"], 1);
  197. } finally {
  198. cleanup();
  199. }
  200. });
  201. Deno.test("db - del returns true on non-existent record", () => {
  202. cleanup();
  203. try {
  204. const result = del("User", { id: 99999 }, TEST_DB_PATH);
  205. assertEquals(result, true);
  206. } finally {
  207. cleanup();
  208. }
  209. });
  210. Deno.test("db - insert duplicate name returns empty array", () => {
  211. cleanup();
  212. try {
  213. insert("User", {
  214. name: "dupuser",
  215. email: "first@example.com",
  216. password: "pass1",
  217. }, TEST_DB_PATH);
  218. const result = insert("User", {
  219. name: "dupuser",
  220. email: "second@example.com",
  221. password: "pass2",
  222. }, TEST_DB_PATH);
  223. assertEquals(result.length, 0);
  224. } finally {
  225. cleanup();
  226. }
  227. });