From de7f719808325eb22cb58855a54690055959286f Mon Sep 17 00:00:00 2001 From: Sebastian Zuzunaga Date: Thu, 19 Sep 2024 21:00:35 -0500 Subject: [PATCH] test: add tests for profile edit --- reports/sonar-report.xml | 445 +++++++++++---------- src/app/__tests__/_layout.spec.tsx | 5 - src/app/__tests__/editarPerfil.spec.tsx | 97 +++-- src/app/__tests__/reports/sonar-report.xml | 15 +- 4 files changed, 295 insertions(+), 267 deletions(-) diff --git a/reports/sonar-report.xml b/reports/sonar-report.xml index 486e2a57..76de97c8 100644 --- a/reports/sonar-report.xml +++ b/reports/sonar-report.xml @@ -1,33 +1,33 @@ - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + @@ -38,76 +38,76 @@ - + - - + + - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - + + - + - - - + + + - - + + - + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - - - - - - - + + + + + + + - - - - - + + + + + - - + + - - - - - + + + + + - + - + - - - - - - - - - - - - + + + - - - + + + - + - - - - + + + + - - + + - - - - - - + + + + + + - - + + - - - - + + + + - - + + - + - - - + + + - - - - + + + + - - + + - - - + + + - + - - + + - - - - - - + - + - - - - + + + + - - - - - + + + + + - - - + + + + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - + - - + + - - + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + \ No newline at end of file diff --git a/src/app/__tests__/_layout.spec.tsx b/src/app/__tests__/_layout.spec.tsx index 50d06659..20781f7d 100644 --- a/src/app/__tests__/_layout.spec.tsx +++ b/src/app/__tests__/_layout.spec.tsx @@ -56,9 +56,4 @@ describe("TabsLayout", () => { expect(getByTestId('tabs-mock')).toBeTruthy(); }); */ - it("deve configurar os listeners de notificação", () => { - render(); - expect(Notifications.addNotificationReceivedListener).toHaveBeenCalled(); - expect(Notifications.addNotificationResponseReceivedListener).toHaveBeenCalled(); - }); }); diff --git a/src/app/__tests__/editarPerfil.spec.tsx b/src/app/__tests__/editarPerfil.spec.tsx index d84428a1..3e2e48aa 100644 --- a/src/app/__tests__/editarPerfil.spec.tsx +++ b/src/app/__tests__/editarPerfil.spec.tsx @@ -3,8 +3,9 @@ import { render, fireEvent, waitFor } from "@testing-library/react-native"; import EditarPerfil from "../private/pages/editarPerfil"; import { router, useLocalSearchParams } from "expo-router"; import * as ImagePicker from 'expo-image-picker'; +import Toast from "react-native-toast-message"; -// Mock do expo-image-picker +// Mock for expo-image-picker jest.mock('expo-image-picker', () => ({ launchImageLibraryAsync: jest.fn().mockResolvedValue({ canceled: false, @@ -20,7 +21,7 @@ jest.mock('expo-image-picker', () => ({ } })); -// Substituindo o módulo real do expo-router por uma versão mockada +// Mock for expo-router jest.mock('expo-router', () => ({ useLocalSearchParams: jest.fn().mockReturnValue({ id: "123", @@ -29,12 +30,14 @@ jest.mock('expo-router', () => ({ }), router: { push: jest.fn(), - back: jest.fn(), - canGoBack: jest.fn().mockReturnValue(true), replace: jest.fn(), }, })); +jest.mock('react-native-toast-message', () => ({ + show: jest.fn(), +})); + describe("EditarPerfil component", () => { test("Atualiza nome com o input", async () => { const { getByPlaceholderText } = render(); @@ -56,39 +59,34 @@ describe("EditarPerfil component", () => { await waitFor(() => { expect(getByText("Campo obrigatório!")).toBeTruthy(); - }); - - await waitFor(() => { expect(queryByText("O nome completo deve ter pelo menos 5 caractéres.")).toBeNull(); expect(queryByText("O nome completo deve ter no máximo 60 caractéres.")).toBeNull(); }); }); test("Exibe mensagem de erro ao tentar salvar com nome muito curto", async () => { - const { getByText, getByPlaceholderText, findByText } = render(); + const { getByText, getByPlaceholderText } = render(); const nameInput = getByPlaceholderText("Nome completo"); fireEvent.changeText(nameInput, "Jo"); const saveButton = getByText("Salvar"); fireEvent.press(saveButton); - await waitFor(async () => { - const errorMessage = await findByText("O nome completo deve ter pelo menos 5 caractéres."); - expect(errorMessage).toBeTruthy(); + await waitFor(() => { + expect(getByText("O nome completo deve ter pelo menos 5 caractéres.")).toBeTruthy(); }); }); test("Exibe mensagem de erro ao tentar salvar com nome muito longo", async () => { - const { getByText, getByPlaceholderText, findByText } = render(); + const { getByText, getByPlaceholderText } = render(); const nameInput = getByPlaceholderText("Nome completo"); fireEvent.changeText(nameInput, "Lorem Ipsum é apenas um texto fictício da indústria de impressão e composição tipográfica."); const saveButton = getByText("Salvar"); fireEvent.press(saveButton); - await waitFor(async () => { - const errorMessage = await findByText("O nome completo deve ter no máximo 60 caractéres."); - expect(errorMessage).toBeTruthy(); + await waitFor(() => { + expect(getByText("O nome completo deve ter no máximo 60 caractéres.")).toBeTruthy(); }); }); @@ -113,31 +111,26 @@ describe("EditarPerfil component", () => { fireEvent.press(apagarContaButton); - await waitFor(async () => { - const confirmationMessage = await findByText("Prosseguir com a exclusão da conta?"); - expect(confirmationMessage).toBeTruthy(); + await waitFor(() => { + expect(findByText("Prosseguir com a exclusão da conta?")).toBeTruthy(); }); }); test("Apaga a conta corretamente após confirmação", async () => { - const { getByText, findByText } = render(); + const { getByText } = render(); const apagarContaButton = getByText("Apagar Conta"); fireEvent.press(apagarContaButton); + const confirmButton = getByText("Apagar"); + fireEvent.press(confirmButton); - await waitFor(async () => { - const confirmButton = getByText("Apagar"); - fireEvent.press(confirmButton); - }); - - await waitFor(async () => { + await waitFor(() => { expect(router.replace).toHaveBeenCalledWith('/'); }); }); test("Navega para a tela anterior ao clicar no botão de voltar", async () => { const { getByTestId } = render(); - const backButton = getByTestId("back-button-pressable"); fireEvent.press(backButton); @@ -147,32 +140,62 @@ describe("EditarPerfil component", () => { }); }); - // Novo teste para verificar a atualização da foto de perfil - test("Atualiza foto de perfil corretamente", async () => { - const { getByTestId, findByText, getByText } = render(); + test("Perfil editado com sucesso", async () => { + const { getByPlaceholderText, getByText, getByTestId } = render(); + + const nameInput = getByPlaceholderText("Nome completo"); + fireEvent.changeText(nameInput, "Gustavo A"); - // Simula a seleção de uma nova foto const selectPhotoButton = getByTestId("upload-image-botao"); fireEvent.press(selectPhotoButton); - - // Espera a mudança de estado e a resposta do mock + await waitFor(() => { expect(ImagePicker.launchImageLibraryAsync).toHaveBeenCalledWith({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, aspect: [1, 1], base64: true, + quality: 0, + }); + }); + + const saveButton = getByText("Salvar"); + fireEvent.press(saveButton); + + await waitFor(() => { + expect(Toast.show).toHaveBeenCalledWith({ + type: "success", + text1: "Sucesso!", + text2: "Perfil atualizado com sucesso.", }); }); - // Simula a confirmação de atualização da foto + expect(nameInput.props.value).toBe("Gustavo A"); + + await waitFor(() => { + expect(router.push).toHaveBeenCalledWith("/private/tabs/perfil"); + }); + }); + + test("Atualiza foto de perfil corretamente", async () => { + const { getByTestId, getByText } = render(); + + const selectPhotoButton = getByTestId("upload-image-botao"); + fireEvent.press(selectPhotoButton); + + await waitFor(() => { + expect(ImagePicker.launchImageLibraryAsync).toHaveBeenCalled(); + }); + const saveButton = getByText("Salvar"); fireEvent.press(saveButton); - // Verifica se a mensagem de sucesso é exibida após a atualização da foto - await waitFor(async () => { - const successMessage = await findByText("Foto atualizada com sucesso"); - expect(successMessage).toBeTruthy(); + await waitFor(() => { + expect(Toast.show).toHaveBeenCalledWith({ + type: "success", + text1: "Sucesso!", + text2: "Perfil atualizado com sucesso.", + }); }); }); }); diff --git a/src/app/__tests__/reports/sonar-report.xml b/src/app/__tests__/reports/sonar-report.xml index 34c663b7..570dd213 100644 --- a/src/app/__tests__/reports/sonar-report.xml +++ b/src/app/__tests__/reports/sonar-report.xml @@ -1,7 +1,14 @@ - - - - + + + + + + + + + + + \ No newline at end of file