button_test.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { assertEquals, cleanup, fireEvent, render, screen } from "./setup.ts";
  2. import Button from "../../components/form/Button.tsx";
  3. Deno.test({
  4. name: "Button - renders children text",
  5. fn() {
  6. render(<Button>Click me</Button>);
  7. assertEquals(screen.getByText("Click me").tagName, "BUTTON");
  8. cleanup();
  9. },
  10. sanitizeResources: false,
  11. sanitizeOps: false,
  12. });
  13. Deno.test({
  14. name: "Button - applies default variant classes",
  15. fn() {
  16. render(<Button>Default</Button>);
  17. const btn = screen.getByText("Default");
  18. assertEquals(btn.className.includes("bg-white"), true);
  19. assertEquals(btn.className.includes("text-gray-800"), true);
  20. cleanup();
  21. },
  22. sanitizeResources: false,
  23. sanitizeOps: false,
  24. });
  25. Deno.test({
  26. name: "Button - applies primary variant classes",
  27. fn() {
  28. render(<Button variant="primary">Primary</Button>);
  29. const btn = screen.getByText("Primary");
  30. assertEquals(btn.className.includes("bg-blue-600"), true);
  31. assertEquals(btn.className.includes("text-white"), true);
  32. assertEquals(btn.className.includes("border-blue-600"), true);
  33. cleanup();
  34. },
  35. sanitizeResources: false,
  36. sanitizeOps: false,
  37. });
  38. Deno.test({
  39. name: "Button - applies danger variant classes",
  40. fn() {
  41. render(<Button variant="danger">Danger</Button>);
  42. const btn = screen.getByText("Danger");
  43. assertEquals(btn.className.includes("bg-red-600"), true);
  44. assertEquals(btn.className.includes("text-white"), true);
  45. assertEquals(btn.className.includes("border-red-600"), true);
  46. cleanup();
  47. },
  48. sanitizeResources: false,
  49. sanitizeOps: false,
  50. });
  51. Deno.test({
  52. name: "Button - applies danger-outline variant classes",
  53. fn() {
  54. render(<Button variant="danger-outline">Danger Outline</Button>);
  55. const btn = screen.getByText("Danger Outline");
  56. assertEquals(btn.className.includes("bg-transparent"), true);
  57. assertEquals(btn.className.includes("text-red-600"), true);
  58. assertEquals(btn.className.includes("border-red-600"), true);
  59. cleanup();
  60. },
  61. sanitizeResources: false,
  62. sanitizeOps: false,
  63. });
  64. Deno.test({
  65. name: "Button - applies sm size classes",
  66. fn() {
  67. render(<Button size="sm">Small</Button>);
  68. const btn = screen.getByText("Small");
  69. assertEquals(btn.className.includes("px-2"), true);
  70. assertEquals(btn.className.includes("py-1"), true);
  71. assertEquals(btn.className.includes("text-xs"), true);
  72. cleanup();
  73. },
  74. sanitizeResources: false,
  75. sanitizeOps: false,
  76. });
  77. Deno.test({
  78. name: "Button - applies lg size classes",
  79. fn() {
  80. render(<Button size="lg">Large</Button>);
  81. const btn = screen.getByText("Large");
  82. assertEquals(btn.className.includes("px-4"), true);
  83. assertEquals(btn.className.includes("py-2"), true);
  84. assertEquals(btn.className.includes("text-base"), true);
  85. cleanup();
  86. },
  87. sanitizeResources: false,
  88. sanitizeOps: false,
  89. });
  90. Deno.test({
  91. name: "Button - passes through disabled attribute",
  92. fn() {
  93. render(<Button disabled>Disabled</Button>);
  94. const btn = screen.getByText("Disabled") as HTMLButtonElement;
  95. assertEquals(btn.disabled, true);
  96. cleanup();
  97. },
  98. sanitizeResources: false,
  99. sanitizeOps: false,
  100. });
  101. Deno.test({
  102. name: "Button - fires onClick handler",
  103. fn() {
  104. let clicked = false;
  105. render(
  106. <Button
  107. onClick={() => {
  108. clicked = true;
  109. }}
  110. >
  111. Clickable
  112. </Button>,
  113. );
  114. fireEvent.click(screen.getByText("Clickable"));
  115. assertEquals(clicked, true);
  116. cleanup();
  117. },
  118. sanitizeResources: false,
  119. sanitizeOps: false,
  120. });
  121. Deno.test({
  122. name: "Button - appends custom className",
  123. fn() {
  124. render(<Button className="my-custom">Custom</Button>);
  125. const btn = screen.getByText("Custom");
  126. assertEquals(btn.className.includes("my-custom"), true);
  127. cleanup();
  128. },
  129. sanitizeResources: false,
  130. sanitizeOps: false,
  131. });