packages/frontend/src/data/firebase/__tests__/authentication.test.js
import firebase from 'firebase/app';
import {
sendPasswordResetEmail,
signInWithEmailAndPassword,
signOut,
createUserWithEmailAndPassword,
} from '../authentication';
import { User } from '../../../domain/entities';
jest.mock('firebase/app', function() {
const mockFirebaseAuth = {
setPersistence: jest.fn(),
signInWithEmailAndPassword: jest.fn(),
createUserWithEmailAndPassword: jest.fn(),
sendPasswordResetEmail: jest.fn(),
signOut: jest.fn(),
};
const auth = () => mockFirebaseAuth;
auth.Auth = {
Persistence: {
LOCAL: 'local',
},
};
return {
auth,
};
});
const email = 'email@email.com';
const password = 'password';
const mockFirebaseUser = { uid: 'some_uid', email, emailVerified: true };
describe('Firebase Auth Module', function() {
it('signs user in with LOCAL session persistence', async function() {
const expectedUser = new User(mockFirebaseUser.uid, {
emailVerified: mockFirebaseUser.emailVerified,
email: mockFirebaseUser.email,
});
firebase
.auth()
.signInWithEmailAndPassword.mockImplementation(() =>
Promise.resolve({ user: mockFirebaseUser }),
);
const user = await signInWithEmailAndPassword(email, password);
expect(user).toEqual(expectedUser);
expect(firebase.auth().setPersistence).toHaveBeenCalledWith(
firebase.auth.Auth.Persistence.LOCAL,
);
});
it('signs user up with LOCAL session persistence', async function() {
const expectedUser = new User(mockFirebaseUser.uid, {
emailVerified: mockFirebaseUser.emailVerified,
email: mockFirebaseUser.email,
});
firebase
.auth()
.createUserWithEmailAndPassword.mockImplementation(() =>
Promise.resolve({ user: mockFirebaseUser }),
);
const user = await createUserWithEmailAndPassword(email, password);
expect(user).toEqual(expectedUser);
expect(firebase.auth().setPersistence).toHaveBeenCalledWith(
firebase.auth.Auth.Persistence.LOCAL,
);
});
it("recovers user's password", async function() {
await sendPasswordResetEmail(email);
expect(firebase.auth().sendPasswordResetEmail).toHaveBeenCalledWith(email);
});
it('signs user out', async function() {
await signOut(email);
expect(firebase.auth().signOut).toHaveBeenCalled();
});
});