modal_test.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { cleanup, assertEquals, render, screen, fireEvent, act } from "./setup.ts";
  2. import Modal from "../../islands/Modal.tsx";
  3. Deno.test({
  4. name: "Modal - initially hidden",
  5. fn() {
  6. const { container } = render(<Modal />);
  7. const overlay = container.firstElementChild!;
  8. assertEquals(overlay.className.includes("hidden"), true);
  9. cleanup();
  10. },
  11. sanitizeResources: false,
  12. sanitizeOps: false,
  13. });
  14. Deno.test({
  15. name: "Modal - registers globalThis.$modal",
  16. fn() {
  17. render(<Modal />);
  18. assertEquals(typeof globalThis.$modal, "object");
  19. assertEquals(typeof globalThis.$modal!.show, "function");
  20. assertEquals(typeof globalThis.$modal!.hide, "function");
  21. cleanup();
  22. },
  23. sanitizeResources: false,
  24. sanitizeOps: false,
  25. });
  26. Deno.test({
  27. name: "Modal - show() displays with title and content",
  28. fn() {
  29. const { container } = render(<Modal />);
  30. act(() => {
  31. globalThis.$modal!.show("Test Title", "Test Content", []);
  32. });
  33. const overlay = container.firstElementChild!;
  34. assertEquals(overlay.className.includes("hidden"), false);
  35. assertEquals(screen.getByText("Test Title") !== null, true);
  36. assertEquals(screen.getByText("Test Content") !== null, true);
  37. cleanup();
  38. },
  39. sanitizeResources: false,
  40. sanitizeOps: false,
  41. });
  42. Deno.test({
  43. name: "Modal - renders action buttons",
  44. fn() {
  45. render(<Modal />);
  46. act(() => {
  47. globalThis.$modal!.show("Title", "Content", [
  48. { text: "OK" },
  49. { text: "Cancel" },
  50. ]);
  51. });
  52. assertEquals(screen.getByText("OK").tagName, "BUTTON");
  53. assertEquals(screen.getByText("Cancel").tagName, "BUTTON");
  54. cleanup();
  55. },
  56. sanitizeResources: false,
  57. sanitizeOps: false,
  58. });
  59. Deno.test({
  60. name: "Modal - action button with onClick calls handler",
  61. fn() {
  62. let clicked = "";
  63. render(<Modal />);
  64. act(() => {
  65. globalThis.$modal!.show("Title", "Content", [
  66. { text: "Confirm", onClick: (text: string) => { clicked = text; } },
  67. ]);
  68. });
  69. fireEvent.click(screen.getByText("Confirm"));
  70. assertEquals(clicked, "Confirm");
  71. cleanup();
  72. },
  73. sanitizeResources: false,
  74. sanitizeOps: false,
  75. });
  76. Deno.test({
  77. name: "Modal - action button without onClick hides modal",
  78. fn() {
  79. const { container } = render(<Modal />);
  80. act(() => {
  81. globalThis.$modal!.show("Title", "Content", [{ text: "Close" }]);
  82. });
  83. act(() => {
  84. fireEvent.click(screen.getByText("Close"));
  85. });
  86. const overlay = container.firstElementChild!;
  87. assertEquals(overlay.className.includes("hidden"), true);
  88. cleanup();
  89. },
  90. sanitizeResources: false,
  91. sanitizeOps: false,
  92. });
  93. Deno.test({
  94. name: "Modal - close icon hides modal",
  95. fn() {
  96. const { container } = render(<Modal />);
  97. act(() => {
  98. globalThis.$modal!.show("Title", "Content", []);
  99. });
  100. const closeIcon = container.querySelector(".bi-x")!;
  101. act(() => {
  102. fireEvent.click(closeIcon);
  103. });
  104. const overlay = container.firstElementChild!;
  105. assertEquals(overlay.className.includes("hidden"), true);
  106. cleanup();
  107. },
  108. sanitizeResources: false,
  109. sanitizeOps: false,
  110. });
  111. Deno.test({
  112. name: "Modal - cleans up globalThis.$modal on unmount",
  113. fn() {
  114. render(<Modal />);
  115. assertEquals(globalThis.$modal !== undefined, true);
  116. cleanup();
  117. assertEquals(globalThis.$modal, undefined);
  118. },
  119. sanitizeResources: false,
  120. sanitizeOps: false,
  121. });