Builder and Dashboard unit tests refactoring/cleanup

This commit is contained in:
gianantoniopini
2021-01-23 11:45:06 +01:00
parent 9a7bdb188b
commit 5317f5e525
4 changed files with 86 additions and 93 deletions

View File

@ -6,10 +6,6 @@ import FirebaseStub, {
describe('FirebaseStub', () => { describe('FirebaseStub', () => {
describe('auth', () => { describe('auth', () => {
afterEach(() => {
FirebaseStub.auth().dispose();
});
it('reuses existing Auth instance', () => { it('reuses existing Auth instance', () => {
const auth1 = FirebaseStub.auth(); const auth1 = FirebaseStub.auth();
const auth2 = FirebaseStub.auth(); const auth2 = FirebaseStub.auth();
@ -49,14 +45,15 @@ describe('FirebaseStub', () => {
const observer = () => {}; const observer = () => {};
const unsubscribe = FirebaseStub.auth().onAuthStateChanged(observer); const unsubscribe = FirebaseStub.auth().onAuthStateChanged(observer);
expect(unsubscribe).toBeTruthy(); expect(unsubscribe).toBeTruthy();
expect(FirebaseStub.auth().onAuthStateChangedObservers).toHaveLength(1); expect(
expect(FirebaseStub.auth().onAuthStateChangedObservers[0]).toEqual( FirebaseStub.auth().onAuthStateChangedObservers.indexOf(observer),
observer, ).toBeGreaterThanOrEqual(0);
);
unsubscribe(); unsubscribe();
expect(FirebaseStub.auth().onAuthStateChangedObservers).toHaveLength(0); expect(
FirebaseStub.auth().onAuthStateChangedObservers.indexOf(observer),
).not.toBeGreaterThanOrEqual(0);
}); });
}); });
@ -258,7 +255,7 @@ describe('FirebaseStub', () => {
); );
}); });
it('previously set query parameters are not kept when retrieving reference again', async () => { it('previously set query parameters are not kept when retrieving reference again', () => {
let reference = null; let reference = null;
reference = FirebaseStub.database().ref(DatabaseConstants.resumesPath); reference = FirebaseStub.database().ref(DatabaseConstants.resumesPath);

View File

@ -33,10 +33,6 @@ class Auth {
return this._onAuthStateChangedObservers; return this._onAuthStateChangedObservers;
} }
dispose() {
this._onAuthStateChangedObservers = [];
}
onAuthStateChanged(observer) { onAuthStateChanged(observer) {
this.onAuthStateChangedObservers.push(observer); this.onAuthStateChangedObservers.push(observer);

View File

@ -31,10 +31,31 @@ describe('Builder', () => {
let resume = null; let resume = null;
let mockDatabaseUpdateFunction = null; let mockDatabaseUpdateFunction = null;
const fnWaitForDatabaseUpdateToHaveCompleted = async () => {
await waitFor(() => mockDatabaseUpdateFunction.mock.calls[0][0], {
timeout: DebounceWaitTime,
});
await waitFor(() => mockDatabaseUpdateFunction.mock.results[0].value);
};
const expectDatabaseUpdateToHaveCompleted = async () => {
await waitFor(
() => expect(mockDatabaseUpdateFunction).toHaveBeenCalledTimes(1),
{
timeout: DebounceWaitTime,
},
);
await waitFor(() =>
expect(
mockDatabaseUpdateFunction.mock.results[0].value,
).resolves.toBeUndefined(),
);
};
async function setup( async function setup(
resumeIdParameter, resumeIdParameter,
waitForLoadingScreenToDisappear = true, waitForLoadingScreenToDisappear = true,
waitForDatabaseUpdateFunctionToHaveCompleted = true, waitForDatabaseUpdateToHaveCompleted = true,
) { ) {
FirebaseStub.database().initializeData(); FirebaseStub.database().initializeData();
@ -78,29 +99,18 @@ describe('Builder', () => {
); );
} }
if (waitForDatabaseUpdateFunctionToHaveCompleted) { if (waitForDatabaseUpdateToHaveCompleted) {
await waitFor(() => mockDatabaseUpdateFunction.mock.calls[0][0], { await fnWaitForDatabaseUpdateToHaveCompleted();
timeout: DebounceWaitTime,
});
await waitFor(() => mockDatabaseUpdateFunction.mock.results[0].value);
mockDatabaseUpdateFunction.mockClear(); mockDatabaseUpdateFunction.mockClear();
} }
} }
describe('handles errors', () => { describe('handles errors', () => {
describe('if resume does not exist', () => { describe('if resume does not exist', () => {
const waitForNavigateFunctionToHaveCompleted = async () => {
await waitFor(() => mockNavigateFunction.mock.results[0].value);
};
beforeEach(async () => { beforeEach(async () => {
await setup('xxxxxx', false, false); await setup('xxxxxx', false, false);
}); });
afterEach(async () => {
await waitForNavigateFunctionToHaveCompleted();
});
it('navigates to Dashboard and displays notification', async () => { it('navigates to Dashboard and displays notification', async () => {
await waitFor(() => await waitFor(() =>
expect(mockNavigateFunction).toHaveBeenCalledTimes(1), expect(mockNavigateFunction).toHaveBeenCalledTimes(1),
@ -110,6 +120,12 @@ describe('Builder', () => {
await waitFor(() => { await waitFor(() => {
expect(screen.getByRole('alert')).toBeInTheDocument(); expect(screen.getByRole('alert')).toBeInTheDocument();
}); });
await waitFor(() =>
expect(
mockNavigateFunction.mock.results[0].value,
).resolves.toBeUndefined(),
);
}); });
}); });
}); });
@ -157,12 +173,7 @@ describe('Builder', () => {
const languageStorageItem = localStorage.getItem(languageStorageItemKey); const languageStorageItem = localStorage.getItem(languageStorageItemKey);
expect(languageStorageItem).toBe(italianLanguageCode); expect(languageStorageItem).toBe(italianLanguageCode);
await waitFor( await expectDatabaseUpdateToHaveCompleted();
() => expect(mockDatabaseUpdateFunction).toHaveBeenCalledTimes(1),
{
timeout: DebounceWaitTime,
},
);
const mockDatabaseUpdateFunctionCallArgument = const mockDatabaseUpdateFunctionCallArgument =
mockDatabaseUpdateFunction.mock.calls[0][0]; mockDatabaseUpdateFunction.mock.calls[0][0];
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId); expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
@ -172,11 +183,6 @@ describe('Builder', () => {
expect( expect(
mockDatabaseUpdateFunctionCallArgument.updatedAt, mockDatabaseUpdateFunctionCallArgument.updatedAt,
).toBeGreaterThanOrEqual(now); ).toBeGreaterThanOrEqual(now);
await waitFor(() =>
expect(
mockDatabaseUpdateFunction.mock.results[0].value,
).resolves.toBeUndefined(),
);
}); });
afterEach(() => { afterEach(() => {
@ -199,12 +205,7 @@ describe('Builder', () => {
expect(input.value).toBe(newInputValue); expect(input.value).toBe(newInputValue);
await waitFor( await expectDatabaseUpdateToHaveCompleted();
() => expect(mockDatabaseUpdateFunction).toHaveBeenCalledTimes(1),
{
timeout: DebounceWaitTime,
},
);
const mockDatabaseUpdateFunctionCallArgument = const mockDatabaseUpdateFunctionCallArgument =
mockDatabaseUpdateFunction.mock.calls[0][0]; mockDatabaseUpdateFunction.mock.calls[0][0];
expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId); expect(mockDatabaseUpdateFunctionCallArgument.id).toBe(resumeId);
@ -214,11 +215,6 @@ describe('Builder', () => {
expect( expect(
mockDatabaseUpdateFunctionCallArgument.updatedAt, mockDatabaseUpdateFunctionCallArgument.updatedAt,
).toBeGreaterThanOrEqual(now); ).toBeGreaterThanOrEqual(now);
await waitFor(() =>
expect(
mockDatabaseUpdateFunction.mock.results[0].value,
).resolves.toBeUndefined(),
);
}); });
}); });
@ -227,14 +223,14 @@ describe('Builder', () => {
await setup(DatabaseConstants.demoStateResume1Id, false, false); await setup(DatabaseConstants.demoStateResume1Id, false, false);
}); });
afterEach(async () => { it('renders loading screen', async () => {
expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument();
await waitForElementToBeRemoved(() => await waitForElementToBeRemoved(() =>
screen.getByTestId(loadingScreenTestId), screen.getByTestId(loadingScreenTestId),
); );
});
it('renders loading screen', () => { await fnWaitForDatabaseUpdateToHaveCompleted();
expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument();
}); });
}); });
}); });

View File

@ -24,13 +24,23 @@ import Wrapper from '../../../components/shared/Wrapper';
import Dashboard from '../dashboard'; import Dashboard from '../dashboard';
describe('Dashboard', () => { describe('Dashboard', () => {
let resumes = null; let userResumes = null;
const user = DatabaseConstants.user1; const user = DatabaseConstants.user1;
const waitForResumeToBeRenderedInPreview = async (resume) => {
await screen.findByText(resume.name);
};
const expectResumeToBeRenderedInPreview = async (resume) => {
await waitFor(() => {
expect(screen.getByText(resume.name)).toBeInTheDocument();
});
};
async function setup(waitForLoadingScreenToDisappear = true) { async function setup(waitForLoadingScreenToDisappear = true) {
FirebaseStub.database().initializeData(); FirebaseStub.database().initializeData();
resumes = ( userResumes = (
await FirebaseStub.database() await FirebaseStub.database()
.ref(DatabaseConstants.resumesPath) .ref(DatabaseConstants.resumesPath)
.orderByChild('user') .orderByChild('user')
@ -83,20 +93,10 @@ describe('Dashboard', () => {
}); });
it('preview of user resumes', async () => { it('preview of user resumes', async () => {
expect(Object.keys(resumes)).toHaveLength(2); expect(Object.keys(userResumes)).toHaveLength(2);
expect(Object.values(resumes)[0].user).toEqual(user.uid); await expectResumeToBeRenderedInPreview(Object.values(userResumes)[0]);
await waitFor(() => { await expectResumeToBeRenderedInPreview(Object.values(userResumes)[1]);
expect(
screen.getByText(Object.values(resumes)[0].name),
).toBeInTheDocument();
});
expect(Object.values(resumes)[1].user).toEqual(user.uid);
await waitFor(() => {
expect(
screen.getByText(Object.values(resumes)[1].name),
).toBeInTheDocument();
});
}); });
}); });
@ -106,14 +106,25 @@ describe('Dashboard', () => {
let undeletedResume = null; let undeletedResume = null;
let resumeToDeleteId = null; let resumeToDeleteId = null;
const waitForDatabaseRemoveFunctionToHaveCompleted = async () => { const waitForDatabaseRemoveToHaveCompleted = async () => {
await waitFor(() => mockDatabaseRemoveFunction.mock.results[0].value); await waitFor(() => mockDatabaseRemoveFunction.mock.results[0].value);
}; };
const expectDatabaseRemoveToHaveCompleted = async () => {
await waitFor(() =>
expect(mockDatabaseRemoveFunction).toHaveBeenCalledTimes(1),
);
await waitFor(() =>
expect(
mockDatabaseRemoveFunction.mock.results[0].value,
).resolves.toBeUndefined(),
);
};
beforeEach(async () => { beforeEach(async () => {
await setup(); await setup();
[resumeToDelete, undeletedResume] = Object.values(resumes); [resumeToDelete, undeletedResume] = Object.values(userResumes);
resumeToDeleteId = resumeToDelete.id; resumeToDeleteId = resumeToDelete.id;
mockDatabaseRemoveFunction = jest.spyOn( mockDatabaseRemoveFunction = jest.spyOn(
@ -123,13 +134,9 @@ describe('Dashboard', () => {
'remove', 'remove',
); );
let resumeToDeleteMenuToggle = null; const resumeToDeleteMenuToggle = await screen.findByTestId(
await waitFor(() => { `${resumePreviewMenuToggleDataTestIdPrefix}${resumeToDeleteId}`,
resumeToDeleteMenuToggle = screen.queryByTestId( );
`${resumePreviewMenuToggleDataTestIdPrefix}${resumeToDeleteId}`,
);
return resumeToDeleteMenuToggle ? Promise.resolve() : Promise.reject();
});
fireEvent.click(resumeToDeleteMenuToggle); fireEvent.click(resumeToDeleteMenuToggle);
const menuItems = screen.getAllByRole('menuitem'); const menuItems = screen.getAllByRole('menuitem');
@ -143,32 +150,28 @@ describe('Dashboard', () => {
fireEvent.click(deleteMenuItem); fireEvent.click(deleteMenuItem);
}); });
afterEach(async () => {
await waitForDatabaseRemoveFunctionToHaveCompleted();
});
it('removes it from database and preview', async () => { it('removes it from database and preview', async () => {
await waitFor(() => await expectDatabaseRemoveToHaveCompleted();
expect(mockDatabaseRemoveFunction).toHaveBeenCalledTimes(1),
);
await waitForDatabaseRemoveFunctionToHaveCompleted();
await waitFor(() => await waitFor(() =>
expect(screen.queryByText(resumeToDelete.name)).toBeNull(), expect(screen.queryByText(resumeToDelete.name)).toBeNull(),
); );
expect(screen.getByText(undeletedResume.name)).toBeInTheDocument(); await expectResumeToBeRenderedInPreview(undeletedResume);
}); });
it('displays notification', async () => { it('displays notification', async () => {
await waitFor(() => { await waitFor(() => {
expect(screen.getByRole('alert')).toBeInTheDocument(); expect(screen.getByRole('alert')).toBeInTheDocument();
}); });
await waitForDatabaseRemoveToHaveCompleted();
}); });
it('closes menu', () => { it('closes menu', async () => {
const menuItems = screen.queryAllByRole('menuitem'); const menuItems = screen.queryAllByRole('menuitem');
expect(menuItems).toHaveLength(0); expect(menuItems).toHaveLength(0);
await waitForDatabaseRemoveToHaveCompleted();
}); });
}); });
@ -177,14 +180,15 @@ describe('Dashboard', () => {
await setup(false); await setup(false);
}); });
afterEach(async () => { it('renders loading screen', async () => {
expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument();
await waitForElementToBeRemoved(() => await waitForElementToBeRemoved(() =>
screen.getByTestId(loadingScreenTestId), screen.getByTestId(loadingScreenTestId),
); );
});
it('renders loading screen', () => { await waitForResumeToBeRenderedInPreview(Object.values(userResumes)[0]);
expect(screen.getByTestId(loadingScreenTestId)).toBeInTheDocument(); await waitForResumeToBeRenderedInPreview(Object.values(userResumes)[1]);
}); });
}); });
}); });