Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/components/analytics/AnalyticsPageViewsTable.test.tsx
T

58 lines
2.0 KiB
TypeScript

import React from "react";
import { render, screen } from "@testing-library/react";
import AnalyticsPageViewsTable from "./AnalyticsPageViewsTable";
import { BrowserRouter as Router } from "react-router";
import { AnalyticsPageView } from "@toolctrl/db/prisma-browser";
import { vi, describe, expect, test } from "vitest";
vi.mock("react-i18next", () => ({
useTranslation: () => {
return { t: (str: string) => str, i18n: { exists: (key: string) => ["analytics.url", "analytics.viewed"].includes(key) } };
},
}));
const d = "2023-03-21";
const items = [
{ id: "1", url: "/page1", route: "/page1", createdAt: d, uniqueVisitorId: "1" },
{ id: "2", url: "/page2", route: "/page2", createdAt: d, uniqueVisitorId: "1" },
] as unknown as AnalyticsPageView[];
describe("AnalyticsPageViewsTable", () => {
test("renders table with correct headers and values", () => {
const result = render(
<Router>
<AnalyticsPageViewsTable items={items} />
</Router>
);
const table = result.container.getElementsByTagName("table")[0];
// Check number of rows
const rows = screen.getAllByRole("row");
expect(rows.length).toBe(items.length + 1); // Include header row
// Check number of columns
const headerRow = table.getElementsByTagName("thead")[0];
const headers = headerRow.getElementsByTagName("th");
expect(headers.length).toBe(2);
// Check header titles
const headerTitles = [...headers].map((header) => header.textContent);
expect(headerTitles).toContain("analytics.url");
expect(headerTitles).toContain("analytics.viewed");
// Check cell values
items.forEach((item, i) => {
const tbody = table.getElementsByTagName("tbody")[0];
const row = tbody.getElementsByTagName("tr")[i];
const cells = row.getElementsByTagName("td");
expect(cells.length).toBe(2);
expect(cells[0].textContent).toContain(item.url);
expect(cells[0].textContent).toContain(item.route);
expect(cells[1].textContent).toMatch(/21\.03\.2023|Mar 21, 2023/);
});
});
});