Firebase mock: refactoring to mock functions with specific arguments

This commit is contained in:
gianantoniopini
2020-12-17 12:32:42 +01:00
parent a79de37ac9
commit 918100c949
2 changed files with 87 additions and 38 deletions

View File

@ -1,34 +1,33 @@
import path from 'path'; import path from 'path';
import fs from 'fs'; import fs from 'fs';
const testUser = { const __testUser = {
email: 'test.user@noemail.com', email: 'test.user@noemail.com',
name: 'Test User', name: 'Test User',
uid: 'testuser123', uid: 'testuser123',
}; };
let onAuthStateChangedObservers = []; let __onAuthStateChangedObservers = [];
let resumesDictionary = {}; let __resumesDictionary = {};
let useDemoResume = false;
const auth = () => { const auth = () => {
const __init = () => { const __init = () => {
onAuthStateChangedObservers = []; __onAuthStateChangedObservers = [];
}; };
const onAuthStateChanged = (observer) => { const onAuthStateChanged = (observer) => {
onAuthStateChangedObservers.push(observer); __onAuthStateChangedObservers.push(observer);
return () => { return () => {
onAuthStateChangedObservers = onAuthStateChangedObservers.filter( __onAuthStateChangedObservers = __onAuthStateChangedObservers.filter(
(observer) => observer !== observer, (observer) => observer !== observer,
); );
}; };
}; };
const signInAnonymously = async () => { const signInAnonymously = async () => {
onAuthStateChangedObservers.forEach((observer) => observer(testUser)); __onAuthStateChangedObservers.forEach((observer) => observer(__testUser));
var result = await Promise.resolve(testUser); var result = await Promise.resolve(__testUser);
return result; return result;
}; };
@ -40,24 +39,23 @@ const auth = () => {
}; };
const database = () => { const database = () => {
const demoResumeId = 'demore'; const __demoResumeId = 'demore';
const emptyResumeId = 'mtre01'; const __emptyResumeId = 'mtre01';
const __init = () => { const __init = () => {
resumesDictionary = {}; __resumesDictionary = {};
useDemoResume = false;
const demoResume = __readFile('../src/data/demoState.json'); const demoResume = __readFile('../src/data/demoState.json');
resumesDictionary[demoResumeId] = demoResume; __resumesDictionary[__demoResumeId] = demoResume;
const emptyResume = __readFile('../src/data/initialState.json'); const emptyResume = __readFile('../src/data/initialState.json');
resumesDictionary[emptyResumeId] = emptyResume; __resumesDictionary[__emptyResumeId] = emptyResume;
for (var key in resumesDictionary) { for (var key in __resumesDictionary) {
const resume = resumesDictionary[key]; const resume = __resumesDictionary[key];
resume.id = key; resume.id = key;
resume.name = `Test Resume ${key}`; resume.name = `Test Resume ${key}`;
resume.user = testUser.uid; resume.user = __testUser.uid;
let date = new Date('December 15, 2020 11:20:25'); let date = new Date('December 15, 2020 11:20:25');
resume.updatedAt = date.valueOf(); resume.updatedAt = date.valueOf();
@ -73,25 +71,71 @@ const database = () => {
return fileData; return fileData;
}; };
const __getResume = () => { const ref = (path) => {
return useDemoResume if (!path) {
? resumesDictionary[demoResumeId] throw new Error('Not implemented.');
: resumesDictionary[emptyResumeId]; }
};
const __useDemoResume = (value) => { const resumesPath = path.startsWith('resumes/');
useDemoResume = value; const usersPath = path.startsWith('users/');
if (!resumesPath && !usersPath) {
throw new Error('Unknown Reference path.');
}
const databaseLocationId = path.substring(path.indexOf('/') + 1);
if (!databaseLocationId) {
throw new Error('Unknown database location id.');
}
const once = async (eventType) => {
if (!eventType) {
throw new Error('Event type must be provided.');
}
if (eventType !== 'value') {
throw new Error('Unknown event type.');
}
const val = () => {
if (resumesPath) {
return __resumesDictionary[databaseLocationId]
? __resumesDictionary[databaseLocationId]
: null;
}
if (usersPath) {
return __testUser;
}
return null;
};
return Promise.resolve({ val });
};
const set = (value) => {
if (resumesPath) {
if (value === null) {
delete __resumesDictionary[databaseLocationId];
} else {
__resumesDictionary[databaseLocationId] = value;
}
}
return Promise.resolve();
};
return {
once,
set,
};
}; };
return { return {
__demoResumeId,
__emptyResumeId,
__init, __init,
__getResume, ref,
__useDemoResume,
ref: jest.fn().mockReturnValue({
once: jest.fn().mockResolvedValue({
val: jest.fn(__getResume),
}),
}),
}; };
}; };

View File

@ -9,8 +9,6 @@ import { ResumeProvider } from '../../../contexts/ResumeContext';
import { StorageProvider } from '../../../contexts/StorageContext'; import { StorageProvider } from '../../../contexts/StorageContext';
import Builder from '../builder'; import Builder from '../builder';
let resume = null;
beforeEach(() => { beforeEach(() => {
firebaseMock.auth().__init(); firebaseMock.auth().__init();
firebaseMock.database().__init(); firebaseMock.database().__init();
@ -19,10 +17,15 @@ beforeEach(() => {
afterEach(cleanup); afterEach(cleanup);
describe('builder', () => { describe('builder', () => {
let resumeId = null;
let resume = null;
describe('with demo resume', () => { describe('with demo resume', () => {
beforeEach(async () => { beforeEach(async () => {
firebaseMock.database().__useDemoResume(true); resumeId = firebaseMock.database().__demoResumeId;
resume = firebaseMock.database().__getResume(); resume = (
await firebaseMock.database().ref(`resumes/${resumeId}`).once('value')
).val();
render( render(
<UserProvider> <UserProvider>
@ -59,8 +62,10 @@ describe('builder', () => {
describe('with empty resume', () => { describe('with empty resume', () => {
beforeEach(async () => { beforeEach(async () => {
firebaseMock.database().__useDemoResume(false); resumeId = firebaseMock.database().__emptyResumeId;
resume = firebaseMock.database().__getResume(); resume = (
await firebaseMock.database().ref(`resumes/${resumeId}`).once('value')
).val();
render( render(
<UserProvider> <UserProvider>