Skip to content

Commit c9a6f6e

Browse files
committed
feat: implement dark mode UI and improve accessibility in JobsHeaderCard
test: update JobsHeaderCard tests for accessibility and theme toggle test: enhance JobsFiltersCard tests with meta data and actions fix: update vitest configuration for setup files chore: add vitest setup for matchMedia polyfill
1 parent b081101 commit c9a6f6e

7 files changed

Lines changed: 44 additions & 50 deletions

File tree

frontend/src/components/JobsHeaderCard.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,17 @@ import {
22
CardDescription,
33
CardTitle,
44
} from "@/components/ui/card";
5-
import type { JobsMeta } from "@/types/jobs";
6-
import type { ReactNode } from "react";
75
import Logo from "../assets/logo-painel-vagas.svg";
86
import { ThemeToggle } from "@/components/ui/theme-toggle";
97
import { useTheme } from "@/hooks/useTheme";
108

11-
interface JobsHeaderCardProps {
12-
meta: JobsMeta;
13-
actions?: ReactNode;
14-
}
15-
169
export function JobsHeaderCard() {
1710
const { resolvedTheme, toggleTheme } = useTheme();
1811
return (
1912
<>
2013
<div className="w-screen bg-[#004726] dark:bg-[#003318] p-6 -mx-8 flex items-end">
2114
<CardTitle className="text-3xl text-white">
22-
<img src={Logo} />
15+
<img src={Logo} alt="Painel de Vagas" />
2316
</CardTitle>
2417
<CardDescription className="text-white">
2518
Leitura automatica dos arquivos XLSX gerados em output.

frontend/tests/unit/components/JobsFiltersCard.test.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,23 @@ describe("JobsFiltersCard", () => {
1919
selectedFile="vagas.xlsx"
2020
setSelectedFile={setSelectedFile}
2121
files={[{ file: "vagas.xlsx" }]}
22-
loading={false}
23-
onRefresh={onRefresh}
22+
meta={{ file: "vagas.xlsx", modifiedAt: Date.now(), total: 1 }}
23+
actions={
24+
<button type="button" onClick={onRefresh}>
25+
Atualizar
26+
</button>
27+
}
2428
/>,
2529
);
2630

2731
fireEvent.change(screen.getByPlaceholderText(/buscar/i), { target: { value: "node" } });
28-
fireEvent.click(screen.getByRole("button"));
32+
fireEvent.click(screen.getByRole("button", { name: /atualizar/i }));
2933

3034
expect(setSearch).toHaveBeenCalled();
3135
expect(onRefresh).toHaveBeenCalledTimes(1);
3236
});
3337

34-
it("desabilita refresh e aplica spinner quando loading", () => {
38+
it("renderiza badge de arquivo e total de vagas", () => {
3539
render(
3640
<JobsFiltersCard
3741
search=""
@@ -42,16 +46,12 @@ describe("JobsFiltersCard", () => {
4246
selectedFile="vagas.xlsx"
4347
setSelectedFile={vi.fn()}
4448
files={[{ file: "vagas.xlsx" }]}
45-
loading
46-
onRefresh={vi.fn()}
49+
meta={{ file: "vagas.xlsx", modifiedAt: Date.now(), total: 1 }}
4750
/>,
4851
);
4952

50-
const refreshButton = screen.getByRole("button");
51-
expect(refreshButton).toBeDisabled();
52-
53-
const spinnerIcon = refreshButton.querySelector(".animate-spin");
54-
expect(spinnerIcon).not.toBeNull();
53+
expect(screen.getAllByText("vagas.xlsx").length).toBeGreaterThan(0);
54+
expect(screen.getByText("1 vagas")).toBeInTheDocument();
5555
});
5656

5757
it("dispara mudancas nos filtros de keyword e arquivo", () => {
@@ -68,8 +68,7 @@ describe("JobsFiltersCard", () => {
6868
selectedFile="vagas.xlsx"
6969
setSelectedFile={setSelectedFile}
7070
files={[{ file: "vagas.xlsx" }, { file: "historico.xlsx" }]}
71-
loading={false}
72-
onRefresh={vi.fn()}
71+
meta={{ file: "vagas.xlsx", modifiedAt: Date.now(), total: 2 }}
7372
/>,
7473
);
7574

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
import { JobsHeaderCard } from "@/components/JobsHeaderCard";
22
import { render, screen } from "@testing-library/react";
3-
import { describe, expect, it } from "vitest";
3+
import { describe, expect, it, vi } from "vitest";
4+
5+
vi.mock("@/hooks/useTheme", () => ({
6+
useTheme: () => ({ resolvedTheme: "light", toggleTheme: vi.fn() }),
7+
}));
48

59
describe("JobsHeaderCard", () => {
6-
it("exibe metadados e acoes", () => {
7-
render(
8-
<JobsHeaderCard
9-
meta={{ file: "vagas.xlsx", modifiedAt: Date.now(), total: 42 }}
10-
actions={<button type="button">acao</button>}
11-
/>,
12-
);
10+
it("renderiza logo acessivel e descricao", () => {
11+
render(<JobsHeaderCard />);
1312

14-
expect(screen.getByText("Painel de Vagas")).toBeInTheDocument();
15-
expect(screen.getByText("vagas.xlsx")).toBeInTheDocument();
16-
expect(screen.getByText("42 vagas")).toBeInTheDocument();
17-
expect(screen.getByRole("button", { name: "acao" })).toBeInTheDocument();
13+
expect(screen.getByAltText("Painel de Vagas")).toBeInTheDocument();
14+
expect(screen.getByText("Leitura automatica dos arquivos XLSX gerados em output.")).toBeInTheDocument();
1815
});
1916

20-
it("usa fallback de arquivo quando meta.file esta vazio", () => {
21-
render(<JobsHeaderCard meta={{ file: "", modifiedAt: Date.now(), total: 0 }} />);
17+
it("renderiza o botao de alternar tema", () => {
18+
render(<JobsHeaderCard />);
2219

23-
expect(screen.getByText("Sem arquivo")).toBeInTheDocument();
24-
expect(screen.getByText("0 vagas")).toBeInTheDocument();
20+
expect(screen.getByRole("button", { name: "Ativar tema escuro" })).toBeInTheDocument();
2521
});
2622
});

frontend/tests/unit/pages/App.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,6 @@ import App from "@/App";
4646
describe("App", () => {
4747
it("renderiza painel principal", () => {
4848
render(<App />);
49-
expect(screen.getByText("Painel de Vagas")).toBeInTheDocument();
49+
expect(screen.getByAltText("Painel de Vagas")).toBeInTheDocument();
5050
});
5151
});

frontend/vitest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export default defineConfig({
1515
test: {
1616
globals: true,
1717
environment: "jsdom",
18-
setupFiles: "./tests/setup.js",
18+
setupFiles: ["./vitest.setup.ts"],
1919
coverage: {
2020
provider: "v8",
2121
reporter: ["text", "html"],

frontend/vitest.setup.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import "@testing-library/jest-dom/vitest";
2+
3+
if (!window.matchMedia) {
4+
Object.defineProperty(window, "matchMedia", {
5+
writable: true,
6+
value: (query: string) => ({
7+
matches: false,
8+
media: query,
9+
onchange: null,
10+
addListener: () => {},
11+
removeListener: () => {},
12+
addEventListener: () => {},
13+
removeEventListener: () => {},
14+
dispatchEvent: () => false,
15+
}),
16+
});
17+
}

package-lock.json

Lines changed: 0 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)