button_test.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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 sm size classes",
  53. fn() {
  54. render(<Button size="sm">Small</Button>);
  55. const btn = screen.getByText("Small");
  56. assertEquals(btn.className.includes("px-2"), true);
  57. assertEquals(btn.className.includes("py-1"), true);
  58. assertEquals(btn.className.includes("text-xs"), true);
  59. cleanup();
  60. },
  61. sanitizeResources: false,
  62. sanitizeOps: false,
  63. });
  64. Deno.test({
  65. name: "Button - applies lg size classes",
  66. fn() {
  67. render(<Button size="lg">Large</Button>);
  68. const btn = screen.getByText("Large");
  69. assertEquals(btn.className.includes("px-4"), true);
  70. assertEquals(btn.className.includes("py-2"), true);
  71. assertEquals(btn.className.includes("text-base"), true);
  72. cleanup();
  73. },
  74. sanitizeResources: false,
  75. sanitizeOps: false,
  76. });
  77. Deno.test({
  78. name: "Button - passes through disabled attribute",
  79. fn() {
  80. render(<Button disabled>Disabled</Button>);
  81. const btn = screen.getByText("Disabled") as HTMLButtonElement;
  82. assertEquals(btn.disabled, true);
  83. cleanup();
  84. },
  85. sanitizeResources: false,
  86. sanitizeOps: false,
  87. });
  88. Deno.test({
  89. name: "Button - fires onClick handler",
  90. fn() {
  91. let clicked = false;
  92. render(
  93. <Button
  94. onClick={() => {
  95. clicked = true;
  96. }}
  97. >
  98. Clickable
  99. </Button>,
  100. );
  101. fireEvent.click(screen.getByText("Clickable"));
  102. assertEquals(clicked, true);
  103. cleanup();
  104. },
  105. sanitizeResources: false,
  106. sanitizeOps: false,
  107. });
  108. Deno.test({
  109. name: "Button - appends custom className",
  110. fn() {
  111. render(<Button className="my-custom">Custom</Button>);
  112. const btn = screen.getByText("Custom");
  113. assertEquals(btn.className.includes("my-custom"), true);
  114. cleanup();
  115. },
  116. sanitizeResources: false,
  117. sanitizeOps: false,
  118. });