Back End Testing - SE701Group2/daily-focus GitHub Wiki

Unit Testing

Libraries

Jest and Supertest are used for unit testing the API endpoints

For more information see: https://www.rithmschool.com/courses/intermediate-node-express/api-tests-with-jest
https://jestjs.io/docs/25.x/mock-functions

Running tests

npm test

Creating tests

Test files must be named like: name.test.js

Firebase instances and Firebase RealTime database instances should be mocked.
An example of mocking a firebase instance is:

// mockFirebase.js

const mockFirebase = {
  auth: jest.fn(() => (mockAuthObject)),
  initializeApp: jest.fn(({}) => ({})) 

}

module.exports = mockFirebase;

To inject this mock when test scripts are ran, see the following example:

// signup.test.js

jest.mock('firebase', () => {
    const {mockFirebase} = require("../test_utils/mocks/mockFirebase")
    return mockFirebase
});

Function calls on this mock object can be tested:

//signup.test.js

 it("when a valid email and password is given it returns 201 and makes calls to firebase", async () => {
        const response = await request(app).post('/signup')
        .set("Accept", "application/json")
        .send(validPasswordAndEmailInput)

        expect(response.status).toBe(201);
        expect(response.body).toEqual(mockToken);

        //tests firebase method calls for creating a user
        expect(firebase.auth).toHaveBeenCalled();
        expect(firebase.auth().createUserWithEmailAndPassword)
        .toHaveBeenCalledWith(validPasswordAndEmailInput.email, validPasswordAndEmailInput.password);

        //tests database calls
        expect(database.ref).toHaveBeenCalledWith('/');
        expect(database.ref().update).toHaveBeenCalledWith({
            [mockUid] : {
                email: validPasswordAndEmailInput.email
            }
        });
    });