import React from "react";
import { render, fireEvent, waitFor } from "@testing-library/react-native";
import { LoginManager, AccessToken } from "react-native-fbsdk-next";
import LoginScreen from "../screens/LoginScreen";
jest.mock("react-native-fbsdk-next");
describe("LoginScreen", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("successfully logs in user", async () => {
const mockLoginResult = {
isCancelled: false,
grantedPermissions: ["public_profile", "email"],
};
const mockAccessToken = {
accessToken: "test-token-123",
userID: "123456789",
};
jest.spyOn(LoginManager, "logInWithPermissions")
.mockResolvedValue(mockLoginResult);
jest.spyOn(AccessToken, "getCurrentAccessToken")
.mockResolvedValue(mockAccessToken);
const { getByTestId } = render(<LoginScreen />);
const loginButton = getByTestId("facebook-login-button");
fireEvent.press(loginButton);
await waitFor(() => {
expect(LoginManager.logInWithPermissions).toHaveBeenCalledWith(
["public_profile", "email"]
);
expect(AccessToken.getCurrentAccessToken).toHaveBeenCalled();
});
});
it("handles login cancellation", async () => {
jest.spyOn(LoginManager, "logInWithPermissions")
.mockResolvedValue({ isCancelled: true });
const { getByTestId, getByText } = render(<LoginScreen />);
const loginButton = getByTestId("facebook-login-button");
fireEvent.press(loginButton);
await waitFor(() => {
expect(getByText("Login cancelled")).toBeTruthy();
});
});
it("handles login errors", async () => {
jest.spyOn(LoginManager, "logInWithPermissions")
.mockRejectedValue(new Error("Network error"));
const { getByTestId, getByText } = render(<LoginScreen />);
const loginButton = getByTestId("facebook-login-button");
fireEvent.press(loginButton);
await waitFor(() => {
expect(getByText("Login failed")).toBeTruthy();
});
});
});