dark_theme_test.tsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import { act, assertEquals, cleanup, render, screen } from "./setup.ts";
  2. import Button from "../../components/form/Button.tsx";
  3. import Input from "../../components/form/Input.tsx";
  4. import Textarea from "../../components/form/Textarea.tsx";
  5. import Checkbox from "../../components/form/Checkbox.tsx";
  6. import Modal from "../../islands/Modal.tsx";
  7. import Loading from "../../islands/Loading.tsx";
  8. import PostList from "../../islands/PostList.tsx";
  9. // --- Button dark theme classes ---
  10. Deno.test({
  11. name: "Dark theme - Button default variant has dark background class",
  12. fn() {
  13. render(<Button>Test</Button>);
  14. const btn = screen.getByText("Test");
  15. assertEquals(btn.className.includes("dark:bg-gray-700"), true);
  16. cleanup();
  17. },
  18. sanitizeResources: false,
  19. sanitizeOps: false,
  20. });
  21. Deno.test({
  22. name: "Dark theme - Button default variant has dark text class",
  23. fn() {
  24. render(<Button>Test</Button>);
  25. const btn = screen.getByText("Test");
  26. assertEquals(btn.className.includes("dark:text-gray-100"), true);
  27. cleanup();
  28. },
  29. sanitizeResources: false,
  30. sanitizeOps: false,
  31. });
  32. Deno.test({
  33. name: "Dark theme - Button has dark border class",
  34. fn() {
  35. render(<Button>Test</Button>);
  36. const btn = screen.getByText("Test");
  37. assertEquals(btn.className.includes("dark:border-gray-600"), true);
  38. cleanup();
  39. },
  40. sanitizeResources: false,
  41. sanitizeOps: false,
  42. });
  43. Deno.test({
  44. name: "Dark theme - Button primary variant does not override with dark bg",
  45. fn() {
  46. render(<Button variant="primary">Primary</Button>);
  47. const btn = screen.getByText("Primary");
  48. // Primary keeps blue-600 in both themes, should not have dark:bg-gray-700
  49. assertEquals(btn.className.includes("bg-blue-600"), true);
  50. assertEquals(btn.className.includes("dark:bg-gray-700"), false);
  51. cleanup();
  52. },
  53. sanitizeResources: false,
  54. sanitizeOps: false,
  55. });
  56. // --- Input dark theme classes ---
  57. Deno.test({
  58. name: "Dark theme - Input has dark background class",
  59. fn() {
  60. render(<Input placeholder="test" />);
  61. const input = screen.getByPlaceholderText("test");
  62. assertEquals(input.className.includes("dark:bg-gray-800"), true);
  63. cleanup();
  64. },
  65. sanitizeResources: false,
  66. sanitizeOps: false,
  67. });
  68. Deno.test({
  69. name: "Dark theme - Input has dark text class",
  70. fn() {
  71. render(<Input placeholder="test" />);
  72. const input = screen.getByPlaceholderText("test");
  73. assertEquals(input.className.includes("dark:text-gray-100"), true);
  74. cleanup();
  75. },
  76. sanitizeResources: false,
  77. sanitizeOps: false,
  78. });
  79. Deno.test({
  80. name: "Dark theme - Input has dark border class when no error",
  81. fn() {
  82. render(<Input placeholder="test" />);
  83. const input = screen.getByPlaceholderText("test");
  84. assertEquals(input.className.includes("dark:border-gray-600"), true);
  85. cleanup();
  86. },
  87. sanitizeResources: false,
  88. sanitizeOps: false,
  89. });
  90. Deno.test({
  91. name: "Dark theme - Input error state does not include dark border override",
  92. fn() {
  93. render(<Input error placeholder="err" />);
  94. const input = screen.getByPlaceholderText("err");
  95. assertEquals(input.className.includes("border-red-600"), true);
  96. assertEquals(input.className.includes("dark:border-gray-600"), false);
  97. cleanup();
  98. },
  99. sanitizeResources: false,
  100. sanitizeOps: false,
  101. });
  102. // --- Textarea dark theme classes ---
  103. Deno.test({
  104. name: "Dark theme - Textarea has dark background class",
  105. fn() {
  106. render(<Textarea placeholder="text" />);
  107. const ta = screen.getByPlaceholderText("text");
  108. assertEquals(ta.className.includes("dark:bg-gray-800"), true);
  109. cleanup();
  110. },
  111. sanitizeResources: false,
  112. sanitizeOps: false,
  113. });
  114. Deno.test({
  115. name: "Dark theme - Textarea has dark text class",
  116. fn() {
  117. render(<Textarea placeholder="text" />);
  118. const ta = screen.getByPlaceholderText("text");
  119. assertEquals(ta.className.includes("dark:text-gray-100"), true);
  120. cleanup();
  121. },
  122. sanitizeResources: false,
  123. sanitizeOps: false,
  124. });
  125. Deno.test({
  126. name: "Dark theme - Textarea has dark border class when no error",
  127. fn() {
  128. render(<Textarea placeholder="text" />);
  129. const ta = screen.getByPlaceholderText("text");
  130. assertEquals(ta.className.includes("dark:border-gray-600"), true);
  131. cleanup();
  132. },
  133. sanitizeResources: false,
  134. sanitizeOps: false,
  135. });
  136. // --- Checkbox dark theme classes ---
  137. Deno.test({
  138. name: "Dark theme - Checkbox label has dark text class",
  139. fn() {
  140. const { container } = render(<Checkbox label="Accept" />);
  141. const span = container.querySelector("span")!;
  142. assertEquals(span.className.includes("dark:text-gray-100"), true);
  143. cleanup();
  144. },
  145. sanitizeResources: false,
  146. sanitizeOps: false,
  147. });
  148. // --- Modal dark theme classes ---
  149. Deno.test({
  150. name: "Dark theme - Modal panel has dark background class",
  151. fn() {
  152. const { container } = render(<Modal />);
  153. act(() => {
  154. globalThis.$modal!.show("Title", "Content", []);
  155. });
  156. const panel = container.querySelector(".bg-white")!;
  157. assertEquals(panel.className.includes("dark:bg-gray-800"), true);
  158. cleanup();
  159. },
  160. sanitizeResources: false,
  161. sanitizeOps: false,
  162. });
  163. Deno.test({
  164. name: "Dark theme - Modal panel has dark border class",
  165. fn() {
  166. const { container } = render(<Modal />);
  167. act(() => {
  168. globalThis.$modal!.show("Title", "Content", []);
  169. });
  170. const panel = container.querySelector(".bg-white")!;
  171. assertEquals(panel.className.includes("dark:border-gray-700"), true);
  172. cleanup();
  173. },
  174. sanitizeResources: false,
  175. sanitizeOps: false,
  176. });
  177. Deno.test({
  178. name: "Dark theme - Modal title border has dark class",
  179. fn() {
  180. const { container } = render(<Modal />);
  181. act(() => {
  182. globalThis.$modal!.show("Title", "Content", []);
  183. });
  184. const titleDiv = screen.getByText("Title");
  185. assertEquals(titleDiv.className.includes("dark:border-gray-700"), true);
  186. cleanup();
  187. },
  188. sanitizeResources: false,
  189. sanitizeOps: false,
  190. });
  191. // --- Loading dark theme classes ---
  192. Deno.test({
  193. name: "Dark theme - Loading spinner has dark background class",
  194. fn() {
  195. const { container } = render(<Loading />);
  196. const spinner = container.querySelector(".bg-white")!;
  197. assertEquals(spinner.className.includes("dark:bg-gray-200"), true);
  198. cleanup();
  199. },
  200. sanitizeResources: false,
  201. sanitizeOps: false,
  202. });
  203. // --- PostList dark theme classes ---
  204. Deno.test({
  205. name: "Dark theme - PostList card has dark border class",
  206. fn() {
  207. const posts = [{
  208. id: "1",
  209. title: "Test",
  210. content: "Content",
  211. shared: false,
  212. }];
  213. const { container } = render(<PostList posts={posts} />);
  214. const card = container.querySelector(".grid > div")!;
  215. assertEquals(card.className.includes("dark:border-gray-700"), true);
  216. cleanup();
  217. },
  218. sanitizeResources: false,
  219. sanitizeOps: false,
  220. });
  221. Deno.test({
  222. name: "Dark theme - PostList card has dark background class",
  223. fn() {
  224. const posts = [{
  225. id: "1",
  226. title: "Test",
  227. content: "Content",
  228. shared: false,
  229. }];
  230. const { container } = render(<PostList posts={posts} />);
  231. const card = container.querySelector(".grid > div")!;
  232. assertEquals(card.className.includes("dark:bg-gray-800"), true);
  233. cleanup();
  234. },
  235. sanitizeResources: false,
  236. sanitizeOps: false,
  237. });