xtablo-source/xtablo-expo/components/__tests__/signup-screen.test.tsx
2026-05-03 09:28:46 +02:00

95 lines
2.4 KiB
TypeScript

import * as React from "react";
import renderer from "react-test-renderer";
import { Alert } from "react-native";
import SignUp from "@/app/signup";
const mockSignUp = jest.fn();
const InputMock = (props: Record<string, unknown>) => React.createElement("Input", props);
const ButtonMock = (props: Record<string, unknown>) => React.createElement("Button", props);
jest.mock("@/stores/auth", () => ({
useAuthStore: jest.fn((selector: (state: unknown) => unknown) =>
selector({
loading: false,
signUp: mockSignUp,
})
),
}));
jest.mock("@/hooks/useThemeColor", () => ({
useThemeColor: ({ light }: { light: string }) => light,
}));
jest.mock("@/hooks/useColorScheme", () => ({
useColorScheme: () => "light",
}));
jest.mock("@rn-vui/themed", () => {
return {
Button: ButtonMock,
Input: InputMock,
};
});
jest.mock("expo-router", () => {
const React = require("react");
return {
Link: (props: Record<string, unknown> & { children?: React.ReactNode }) =>
React.createElement("Link", props, props.children),
};
});
jest.mock("lucide-react-native", () => {
const React = require("react");
const Icon = () => React.createElement("Icon");
return {
Building2: Icon,
Lock: Icon,
Mail: Icon,
User: Icon,
};
});
describe("SignUp screen", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("shows the signup error to the user when registration fails", async () => {
mockSignUp.mockRejectedValueOnce(new Error("Adresse déjà utilisée"));
const alertSpy = jest.spyOn(Alert, "alert").mockImplementation(jest.fn());
let component: renderer.ReactTestRenderer;
await renderer.act(async () => {
component = renderer.create(<SignUp />);
});
const inputs = component!.root.findAllByType(InputMock);
await renderer.act(async () => {
inputs[0].props.onChangeText("Ada");
inputs[1].props.onChangeText("Lovelace");
inputs[2].props.onChangeText("Analytical Engines");
inputs[3].props.onChangeText("ada@example.com");
inputs[4].props.onChangeText("password123");
});
const button = component!.root.findByType(ButtonMock);
await renderer.act(async () => {
await button.props.onPress();
});
expect(mockSignUp).toHaveBeenCalledWith(
"ada@example.com",
"password123",
"Ada",
"Lovelace",
"Analytical Engines"
);
expect(alertSpy).toHaveBeenCalledWith("Erreur", "Adresse déjà utilisée");
});
});