Skip to content

Commit

Permalink
feat(fga-eps-mds/2024.2-ARANDU-DOC#66): teste de funcoes subjects
Browse files Browse the repository at this point in the history
  • Loading branch information
Joao151104 committed Feb 1, 2025
1 parent 6b33da2 commit 7174071
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 36 deletions.
36 changes: 5 additions & 31 deletions src/app/subjects/[...pointId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import {
import Popup from '@/components/ui/popup';
import { SubjectForm } from '@/components/forms/subject.form';
import { toast } from 'sonner';
import { updateSubject, addSubject } from './subject.functions';
import { updateSubject, addSubject, handleSubjectAction, handleRemoveSubject, handleMenuOpen } from './subject.functions';

export default function SubjectPage({
params,
Expand Down Expand Up @@ -83,37 +83,10 @@ export default function SubjectPage({
}, [searchQuery, listSubjects]);


const handleMenuOpen = (
event: React.MouseEvent<HTMLButtonElement>,
subject: Subject,
) => {
setAnchorEl(event.currentTarget);
setSelectedSubject(subject);
};

const handleMenuClose = () => {
setAnchorEl(null);
};

const handleSubjectAction = (action: string) => {
if (action === 'editar') setEditionDialogOpen(true);
if (action === 'excluir') setExclusionDialogOpen(true);
};

const handleRemoveSubject = async (subject: Subject) => {
const response = await deleteSubjects({
id: subject._id,
token: JSON.parse(localStorage.getItem('token')!),
});
if (response.data) {
toast.success('Disciplina excluída com sucesso!');
setListSubjects(listSubjects.filter((s) => s._id !== subject._id));
setExclusionDialogOpen(false);
} else {
toast.error('Erro ao excluir disciplina. Tente novamente mais tarde!');
}
};

if (isLoading) {
return <CircularProgress />;
}
Expand All @@ -140,9 +113,10 @@ export default function SubjectPage({
<SubjectTable
subjects={filteredSubjects}
anchorEl={anchorEl}
onMenuClick={handleMenuOpen}
onMenuClick={(event, subject) => handleMenuOpen(event, subject, setAnchorEl, setSelectedSubject)}
onMenuClose={handleMenuClose}
onSubjectAction={handleSubjectAction}
onSubjectAction={(action) => handleSubjectAction(action, setEditionDialogOpen, setExclusionDialogOpen)}

/>
</Box>

Expand Down Expand Up @@ -189,7 +163,7 @@ export default function SubjectPage({
Cancelar
</Button>
<Button
onClick={() => handleRemoveSubject(selectedSubject!)}
onClick={() => handleRemoveSubject(selectedSubject!, listSubjects, setListSubjects, setExclusionDialogOpen)}
color="primary"
>
Confirmar
Expand Down
32 changes: 32 additions & 0 deletions src/app/subjects/[...pointId]/subject.functions.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// subjectFunctions.ts
import { Subject } from '@/lib/interfaces/subjetc.interface';
import { deleteSubjects } from '@/services/studioMaker.service';
import { toast } from 'sonner';

export const updateSubject = (subject: Subject, listSubjects: Subject[], setListSubjects: React.Dispatch<React.SetStateAction<Subject[]>>) => {
// Verificar se listSubjects não é undefined ou null
Expand Down Expand Up @@ -35,3 +37,33 @@ export const handleSubjectAction = (
setExclusionDialogOpen(true);
}
};

export const handleRemoveSubject = async (
subject: Subject,
listSubjects: Subject[],
setListSubjects: React.Dispatch<React.SetStateAction<Subject[]>>,
setExclusionDialogOpen: React.Dispatch<React.SetStateAction<boolean>>
) => {
const response = await deleteSubjects({
id: subject._id,
token: JSON.parse(localStorage.getItem('token')!),
});
if (response.data) {
toast.success('Disciplina excluída com sucesso!');
setListSubjects(listSubjects.filter((s) => s._id !== subject._id));
setExclusionDialogOpen(false);
} else {
toast.error('Erro ao excluir disciplina. Tente novamente mais tarde!');
}
};

export const handleMenuOpen = (
event: React.MouseEvent<HTMLButtonElement>,
subject: Subject,
setAnchorEl: React.Dispatch<React.SetStateAction<null | HTMLElement>>,
setSelectedSubject: React.Dispatch<React.SetStateAction<Subject | null>>
) => {
setAnchorEl(event.currentTarget);
setSelectedSubject(subject);
};

2 changes: 1 addition & 1 deletion test/app/services/studioMaker.service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ describe('Serviço de Jornadas e Trilhas', () => {
expect(studioMakerApi.get).toHaveBeenCalledWith(`/points/user/${userId}`);
});

test('Deve falhar ao buscar pontos de partida do usuário', async () => {
it('Deve falhar ao buscar pontos de partida do usuário', async () => {
const userId = '321';
(studioMakerApi.get as jest.Mock).mockRejectedValue(
new Error('Falha ao buscar pontos de partida do usuário'),
Expand Down
117 changes: 113 additions & 4 deletions test/app/subjects/[...pointid]/page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import { act, render, renderHook, screen, waitFor } from '@testing-library/react
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import '@testing-library/jest-dom';
import SubjectPage from '@/app/subjects/[...pointId]/page';
import { GetSubjects, GetSubjectsByUserId } from '@/services/studioMaker.service';
import { deleteSubjects, GetSubjects, GetSubjectsByUserId } from '@/services/studioMaker.service';
import { toast } from 'sonner';
import { useState } from 'react';
import { subjectSchema } from '@/lib/schemas/subjects.schema';
import { Subject } from '@/lib/interfaces/subjetc.interface';
import { addSubject, updateSubject } from '@/app/subjects/[...pointId]/subject.functions';
import { addSubject, handleRemoveSubject, handleSubjectAction, updateSubject } from '@/app/subjects/[...pointId]/subject.functions';
// Mock de dados
const mockSubjects = [
{
Expand Down Expand Up @@ -40,6 +40,7 @@ const mockSubjects = [
jest.mock('@/services/studioMaker.service', () => ({
GetSubjectsByUserId: jest.fn(),
GetSubjects: jest.fn(),
deleteSubjects: jest.fn(),
}));

// Mock do Toast
Expand Down Expand Up @@ -147,7 +148,115 @@ describe('SubjectPage', () => {
mockSubjects[1], // O segundo item permanece inalterado
]);
});
}
);
describe("handleSubjectAction", () => {
it("Deve abrir o Menu Editar se clicado em editar", async () => {
const setEditionDialogOpen = jest.fn();
const setExclusionDialogOpen = jest.fn();

handleSubjectAction("editar", setEditionDialogOpen, setExclusionDialogOpen);

}
);
expect(setEditionDialogOpen).toHaveBeenCalledWith(true);
expect(setExclusionDialogOpen).not.toHaveBeenCalled();
});

it("Deve abrir o Menu Excluir se clicado em Excluir", async () => {
const setEditionDialogOpen = jest.fn();
const setExclusionDialogOpen = jest.fn();

handleSubjectAction("excluir", setEditionDialogOpen, setExclusionDialogOpen);

expect(setExclusionDialogOpen).toHaveBeenCalledWith(true);
expect(setEditionDialogOpen).not.toHaveBeenCalled();
});
});
describe("handleRemoveSubject", () => {

const mockSubjectsRemove = {
_id: '2',
name: 'História',
shortName: 'HIST',
description: 'Disciplina de História',
user: 'user2',
journeys: ['journey2'],
order: 2,
createdAt: '2024-01-03T12:00:00Z',
updatedAt: '2024-01-04T12:00:00Z',
__v: 0,
};
it("Deve excluir a disciplina se solicitado", async () => {
// Simulando a resposta de sucesso do deleteSubjects
(deleteSubjects as jest.Mock).mockResolvedValue({ data: true }); // Mock de resposta bem-sucedida

const { result } = renderHook(() => {
const [listSubjects, setListSubjects] = useState(mockSubjects);
return { listSubjects, setListSubjects };
});

const setExclusionDialogOpen = jest.fn();

await act(async () => {
await handleRemoveSubject(
mockSubjectsRemove,
result.current.listSubjects,
result.current.setListSubjects,
setExclusionDialogOpen
);
});

// Verifica se a lista de subjects foi atualizada corretamente (a disciplina 'História' deve ser removida)
expect(result.current.listSubjects).toEqual([
{
_id: '1',
name: 'Matemática',
shortName: 'MAT',
description: 'Disciplina de Matemática',
user: 'user1',
journeys: ['journey1'],
order: 1,
createdAt: '2024-01-01T12:00:00Z',
updatedAt: '2024-01-02T12:00:00Z',
__v: 0,
},
]);

// Verificando se o setExclusionDialogOpen foi chamado com o valor correto
expect(setExclusionDialogOpen).toHaveBeenCalledWith(false);

// Verificando se a mensagem de sucesso foi chamada corretamente
expect(toast.success).toHaveBeenCalledWith("Disciplina excluída com sucesso!");
});
it("Deve excluir a disciplina se solicitado", async () => {
// Simulando a resposta de erro do deleteSubjects (sem a propriedade 'data' ou com erro na resposta)
(deleteSubjects as jest.Mock).mockResolvedValue({}); // Resposta sem a propriedade 'data'

const { result } = renderHook(() => {
const [listSubjects, setListSubjects] = useState(mockSubjects);
return { listSubjects, setListSubjects };
});

const setExclusionDialogOpen = jest.fn();

await act(async () => {
await handleRemoveSubject(
mockSubjectsRemove,
result.current.listSubjects,
result.current.setListSubjects,
setExclusionDialogOpen
);
});

// Aqui o teste vai falhar, pois a resposta não contém a propriedade 'data'
// Verificando se a lista de subjects não foi modificada (a disciplina 'História' não foi removida)
expect(result.current.listSubjects).toEqual(mockSubjects); // Espera que a lista original não tenha mudado

// Verificando se o setExclusionDialogOpen não foi chamado com o valor correto
expect(setExclusionDialogOpen).not.toHaveBeenCalled();

// Verificando se a mensagem de erro foi chamada corretamente
expect(toast.error).toHaveBeenCalledWith('Erro ao excluir disciplina. Tente novamente mais tarde!');
});


});

0 comments on commit 7174071

Please sign in to comment.