|
1 | 1 | import React from "react"; |
2 | | -import { render, screen } from "@testing-library/react"; |
| 2 | +import { render, screen, fireEvent, waitFor } from "@testing-library/react"; |
3 | 3 | import App from "./App"; |
4 | 4 |
|
5 | | -test("renders learn react link", () => { |
6 | | - render(<App />); |
7 | | - const linkElement = screen.getByText(/learn react/i); |
8 | | - expect(linkElement).toBeInTheDocument(); |
| 5 | +describe("App", () => { |
| 6 | + test("renders MathJojo heading", () => { |
| 7 | + render(<App />); |
| 8 | + const heading = screen.getByText(/MathJojo/i); |
| 9 | + expect(heading).toBeInTheDocument(); |
| 10 | + }); |
| 11 | + |
| 12 | + test("renders with default LaTeX value", () => { |
| 13 | + render(<App />); |
| 14 | + const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; |
| 15 | + expect(textarea.value).toBe( |
| 16 | + "\\zeta(s) = \\sum_{n=1}^\\infty \\frac{1}{n^s}" |
| 17 | + ); |
| 18 | + }); |
| 19 | + |
| 20 | + test("updates textarea value on user input", () => { |
| 21 | + render(<App />); |
| 22 | + const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; |
| 23 | + |
| 24 | + fireEvent.change(textarea, { target: { value: "x^2 + y^2 = z^2" } }); |
| 25 | + |
| 26 | + expect(textarea.value).toBe("x^2 + y^2 = z^2"); |
| 27 | + }); |
| 28 | + |
| 29 | + test("shows cheatsheet toggle", () => { |
| 30 | + render(<App />); |
| 31 | + const toggleLink = screen.getByText(/Hide Cheatsheet/i); |
| 32 | + expect(toggleLink).toBeInTheDocument(); |
| 33 | + }); |
| 34 | + |
| 35 | + test("shows settings toggle", () => { |
| 36 | + render(<App />); |
| 37 | + const toggleLink = screen.getByText(/Show Settings/i); |
| 38 | + expect(toggleLink).toBeInTheDocument(); |
| 39 | + }); |
| 40 | + |
| 41 | + test("cheatsheet can be toggled", () => { |
| 42 | + render(<App />); |
| 43 | + |
| 44 | + // Initially shows "Hide Cheatsheet" |
| 45 | + let toggleLink = screen.getByText(/Hide Cheatsheet/i); |
| 46 | + expect(toggleLink).toBeInTheDocument(); |
| 47 | + |
| 48 | + // Click to hide |
| 49 | + fireEvent.click(toggleLink); |
| 50 | + |
| 51 | + // Now shows "Show Cheatsheet" |
| 52 | + toggleLink = screen.getByText(/Show Cheatsheet/i); |
| 53 | + expect(toggleLink).toBeInTheDocument(); |
| 54 | + |
| 55 | + // Click to show again |
| 56 | + fireEvent.click(toggleLink); |
| 57 | + |
| 58 | + // Back to "Hide Cheatsheet" |
| 59 | + toggleLink = screen.getByText(/Hide Cheatsheet/i); |
| 60 | + expect(toggleLink).toBeInTheDocument(); |
| 61 | + }); |
| 62 | + |
| 63 | + test("settings can be toggled", () => { |
| 64 | + render(<App />); |
| 65 | + |
| 66 | + // Initially shows "Show Settings" |
| 67 | + let toggleLink = screen.getByText(/Show Settings/i); |
| 68 | + expect(toggleLink).toBeInTheDocument(); |
| 69 | + |
| 70 | + // Click to show |
| 71 | + fireEvent.click(toggleLink); |
| 72 | + |
| 73 | + // Now shows "Hide Settings" |
| 74 | + toggleLink = screen.getByText(/Hide Settings/i); |
| 75 | + expect(toggleLink).toBeInTheDocument(); |
| 76 | + }); |
| 77 | +}); |
| 78 | + |
| 79 | +describe("URL parameter handling", () => { |
| 80 | + const originalLocation = window.location; |
| 81 | + |
| 82 | + beforeEach(() => { |
| 83 | + // Mock window.location |
| 84 | + delete (window as any).location; |
| 85 | + window.location = { ...originalLocation, search: "" } as any; |
| 86 | + }); |
| 87 | + |
| 88 | + afterEach(() => { |
| 89 | + window.location = originalLocation; |
| 90 | + }); |
| 91 | + |
| 92 | + test("loads value from URL parameter", () => { |
| 93 | + // Set up URL with compressed value |
| 94 | + window.location.search = "?v=NobAgB"; |
| 95 | + |
| 96 | + render(<App />); |
| 97 | + const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; |
| 98 | + |
| 99 | + // The compressed value should be decompressed |
| 100 | + expect(textarea.value).toBeTruthy(); |
| 101 | + }); |
| 102 | + |
| 103 | + test("handles empty compressed value", () => { |
| 104 | + window.location.search = "?v=Q"; |
| 105 | + |
| 106 | + render(<App />); |
| 107 | + const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; |
| 108 | + |
| 109 | + // Should render empty value when v=Q |
| 110 | + expect(textarea.value).toBe(""); |
| 111 | + }); |
| 112 | + |
| 113 | + test("loads displayMode from URL parameter", () => { |
| 114 | + window.location.search = "?displayMode=0"; |
| 115 | + |
| 116 | + render(<App />); |
| 117 | + |
| 118 | + // Open settings to check display mode |
| 119 | + const toggleLink = screen.getByText(/Show Settings/i); |
| 120 | + fireEvent.click(toggleLink); |
| 121 | + |
| 122 | + // The "No" option for display mode should be bold (active) |
| 123 | + const displayModeOptions = screen.getAllByText(/^(Yes|No)$/); |
| 124 | + const noOption = displayModeOptions.find( |
| 125 | + (el) => |
| 126 | + el.textContent === "No" && |
| 127 | + el.getAttribute("href") === "#disable-displaymode" |
| 128 | + ); |
| 129 | + |
| 130 | + expect(noOption).toHaveStyle({ fontWeight: "bold" }); |
| 131 | + }); |
9 | 132 | }); |
0 commit comments