Firebase Stub refactoring, added eslint-plugin-jest dev dependency

This commit is contained in:
gianantoniopini
2021-01-07 16:43:24 +01:00
parent 294dbf195f
commit da8849c854
11 changed files with 190 additions and 75 deletions

View File

@ -8,8 +8,13 @@
"FileReader": true,
"localStorage": true
},
"extends": ["airbnb", "prettier"],
"plugins": ["prettier"],
"extends": [
"airbnb",
"plugin:jest/recommended",
"plugin:jest/style",
"prettier"
],
"plugins": ["jest", "prettier"],
"rules": {
"import/no-extraneous-dependencies": ["error", { "devDependencies": true }],
"react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],

View File

@ -1,4 +1,7 @@
import FirebaseStub, { AuthConstants } from '../gatsby-plugin-firebase';
import FirebaseStub, {
AuthConstants,
DatabaseConstants,
} from '../gatsby-plugin-firebase';
describe('FirebaseStub', () => {
const { resumesPath } = FirebaseStub.database();
@ -49,14 +52,14 @@ describe('FirebaseStub', () => {
const observer = () => {};
const unsubscribe = FirebaseStub.auth().onAuthStateChanged(observer);
expect(unsubscribe).toBeTruthy();
expect(FirebaseStub.auth().onAuthStateChangedObservers.length).toEqual(1);
expect(FirebaseStub.auth().onAuthStateChangedObservers).toHaveLength(1);
expect(FirebaseStub.auth().onAuthStateChangedObservers[0]).toEqual(
observer,
);
unsubscribe();
expect(FirebaseStub.auth().onAuthStateChangedObservers.length).toEqual(0);
expect(FirebaseStub.auth().onAuthStateChangedObservers).toHaveLength(0);
});
});
@ -110,30 +113,24 @@ describe('FirebaseStub', () => {
const resumesDataSnapshot = await resumesRef.once('value');
const resumes = resumesDataSnapshot.val();
expect(resumes).toBeTruthy();
expect(Object.keys(resumes).length).toEqual(3);
const demoStateResume1 =
resumes[FirebaseStub.database().demoStateResume1Id];
expect(Object.keys(resumes)).toHaveLength(3);
const demoStateResume1 = resumes[DatabaseConstants.demoStateResume1Id];
expect(demoStateResume1).toBeTruthy();
expect(demoStateResume1.id).toEqual(
FirebaseStub.database().demoStateResume1Id,
);
expect(demoStateResume1.id).toEqual(DatabaseConstants.demoStateResume1Id);
expect(demoStateResume1.user).toEqual(
FirebaseStub.database().anonymousUser1.uid,
);
const demoStateResume2 =
resumes[FirebaseStub.database().demoStateResume2Id];
const demoStateResume2 = resumes[DatabaseConstants.demoStateResume2Id];
expect(demoStateResume2).toBeTruthy();
expect(demoStateResume2.id).toEqual(
FirebaseStub.database().demoStateResume2Id,
);
expect(demoStateResume2.id).toEqual(DatabaseConstants.demoStateResume2Id);
expect(demoStateResume2.user).toEqual(
FirebaseStub.database().anonymousUser2.uid,
);
const initialStateResume =
resumes[FirebaseStub.database().initialStateResumeId];
resumes[DatabaseConstants.initialStateResumeId];
expect(initialStateResume).toBeTruthy();
expect(initialStateResume.id).toEqual(
FirebaseStub.database().initialStateResumeId,
DatabaseConstants.initialStateResumeId,
);
expect(initialStateResume.user).toEqual(
FirebaseStub.database().anonymousUser1.uid,
@ -143,7 +140,7 @@ describe('FirebaseStub', () => {
const usersDataSnapshot = await usersRef.once('value');
const users = usersDataSnapshot.val();
expect(users).toBeTruthy();
expect(Object.keys(users).length).toEqual(2);
expect(Object.keys(users)).toHaveLength(2);
const anonymousUser1 = users[FirebaseStub.database().anonymousUser1.uid];
expect(anonymousUser1).toBeTruthy();
expect(anonymousUser1).toEqual(FirebaseStub.database().anonymousUser1);
@ -157,12 +154,12 @@ describe('FirebaseStub', () => {
const resume = (
await FirebaseStub.database()
.ref(`${resumesPath}/${FirebaseStub.database().demoStateResume1Id}`)
.ref(`${resumesPath}/${DatabaseConstants.demoStateResume1Id}`)
.once('value')
).val();
expect(resume).toBeTruthy();
expect(resume.id).toEqual(FirebaseStub.database().demoStateResume1Id);
expect(resume.id).toEqual(DatabaseConstants.demoStateResume1Id);
});
it('retrieves null if resume does not exist', async () => {
@ -243,7 +240,7 @@ describe('FirebaseStub', () => {
snapshotValue = snapshot.val();
});
expect(Object.keys(snapshotValue).length).toEqual(2);
expect(Object.keys(snapshotValue)).toHaveLength(2);
Object.values(snapshotValue).forEach((resume) =>
expect(resume.user).toEqual(FirebaseStub.database().anonymousUser1.uid),
);

View File

@ -2,7 +2,10 @@ import path from 'path';
import fs from 'fs';
import { v4 as uuidv4 } from 'uuid';
import { AuthConstants } from './gatsby-plugin-firebase/constants';
import {
AuthConstants,
DatabaseConstants,
} from './gatsby-plugin-firebase/constants';
class Auth {
static #instance = undefined;
@ -57,9 +60,6 @@ class Database {
#references = {};
#anonymousUser1 = undefined;
#anonymousUser2 = undefined;
#demoStateResume1Id = 'demo_1';
#demoStateResume2Id = 'demo_2';
#initialStateResumeId = 'initst';
constructor() {
if (Database.#instance) {
@ -99,18 +99,6 @@ class Database {
return this.#anonymousUser2;
}
get demoStateResume1Id() {
return this.#demoStateResume1Id;
}
get demoStateResume2Id() {
return this.#demoStateResume2Id;
}
get initialStateResumeId() {
return this.#initialStateResumeId;
}
get uuid() {
return this.#uuid;
}
@ -131,11 +119,11 @@ class Database {
date.setMonth(date.getMonth() - 2);
demoStateResume1.createdAt = date.valueOf();
demoStateResume1.user = this.anonymousUser1.uid;
resumes[this.demoStateResume1Id] = demoStateResume1;
resumes[DatabaseConstants.demoStateResume1Id] = demoStateResume1;
const demoStateResume2 = JSON.parse(JSON.stringify(demoStateResume1));
demoStateResume2.user = this.anonymousUser2.uid;
resumes[this.demoStateResume2Id] = demoStateResume2;
resumes[DatabaseConstants.demoStateResume2Id] = demoStateResume2;
const initialStateResume = Database.readFile(
'../src/data/initialState.json',
@ -143,7 +131,7 @@ class Database {
initialStateResume.updatedAt = date.valueOf();
initialStateResume.createdAt = date.valueOf();
initialStateResume.user = this.anonymousUser1.uid;
resumes[this.initialStateResumeId] = initialStateResume;
resumes[DatabaseConstants.initialStateResumeId] = initialStateResume;
for (var key in resumes) {
const resume = resumes[key];
@ -372,4 +360,4 @@ Object.defineProperty(FirebaseStub.database.ServerValue, 'TIMESTAMP', {
});
export default FirebaseStub;
export { AuthConstants };
export { AuthConstants, DatabaseConstants };

View File

@ -1 +1,4 @@
export { Auth as AuthConstants } from './constants/auth';
import AuthConstants from './constants/auth';
import DatabaseConstants from './constants/database';
export { AuthConstants, DatabaseConstants };

View File

@ -1,19 +1,27 @@
class Auth {
static anonymousUser1 = {
const anonymousUser1 = {
displayName: 'Anonymous User 1',
email: 'anonymous1@noemail.com',
isAnonymous: true,
name: 'Anonymous 1',
uid: 'anonym123',
};
};
static anonymousUser2 = {
const anonymousUser2 = {
displayName: 'Anonymous User 2',
email: 'anonymous2@noemail.com',
isAnonymous: true,
name: 'Anonymous 2',
uid: 'anonym456',
};
};
class Auth {
static get anonymousUser1() {
return anonymousUser1;
}
static get anonymousUser2() {
return anonymousUser2;
}
}
export { Auth };
export default Auth;

View File

@ -0,0 +1,19 @@
const demoStateResume1Id = 'demo_1';
const demoStateResume2Id = 'demo_2';
const initialStateResumeId = 'initst';
class Database {
static get demoStateResume1Id() {
return demoStateResume1Id;
}
static get demoStateResume2Id() {
return demoStateResume2Id;
}
static get initialStateResumeId() {
return initialStateResumeId;
}
}
export default Database;

98
package-lock.json generated
View File

@ -4291,6 +4291,22 @@
"eslint-visitor-keys": "^1.1.0"
}
},
"@typescript-eslint/scope-manager": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.12.0.tgz",
"integrity": "sha512-QVf9oCSVLte/8jvOsxmgBdOaoe2J0wtEmBr13Yz0rkBNkl5D8bfnf6G4Vhox9qqMIoG7QQoVwd2eG9DM/ge4Qg==",
"dev": true,
"requires": {
"@typescript-eslint/types": "4.12.0",
"@typescript-eslint/visitor-keys": "4.12.0"
}
},
"@typescript-eslint/types": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.12.0.tgz",
"integrity": "sha512-N2RhGeheVLGtyy+CxRmxdsniB7sMSCfsnbh8K/+RUIXYYq3Ub5+sukRCjVE80QerrUBvuEvs4fDhz5AW/pcL6g==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
"version": "2.34.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz",
@ -4315,6 +4331,24 @@
}
}
},
"@typescript-eslint/visitor-keys": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.12.0.tgz",
"integrity": "sha512-hVpsLARbDh4B9TKYz5cLbcdMIOAoBYgFPCSP9FFS/liSF+b33gVNq8JHY3QGhHNVz85hObvL7BEYLlgx553WCw==",
"dev": true,
"requires": {
"@typescript-eslint/types": "4.12.0",
"eslint-visitor-keys": "^2.0.0"
},
"dependencies": {
"eslint-visitor-keys": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
"integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
"dev": true
}
}
},
"@webassemblyjs/ast": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
@ -10110,6 +10144,70 @@
}
}
},
"eslint-plugin-jest": {
"version": "24.1.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.1.3.tgz",
"integrity": "sha512-dNGGjzuEzCE3d5EPZQ/QGtmlMotqnYWD/QpCZ1UuZlrMAdhG5rldh0N0haCvhGnUkSeuORS5VNROwF9Hrgn3Lg==",
"dev": true,
"requires": {
"@typescript-eslint/experimental-utils": "^4.0.1"
},
"dependencies": {
"@typescript-eslint/experimental-utils": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.12.0.tgz",
"integrity": "sha512-MpXZXUAvHt99c9ScXijx7i061o5HEjXltO+sbYfZAAHxv3XankQkPaNi5myy0Yh0Tyea3Hdq1pi7Vsh0GJb0fA==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.3",
"@typescript-eslint/scope-manager": "4.12.0",
"@typescript-eslint/types": "4.12.0",
"@typescript-eslint/typescript-estree": "4.12.0",
"eslint-scope": "^5.0.0",
"eslint-utils": "^2.0.0"
}
},
"@typescript-eslint/typescript-estree": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.12.0.tgz",
"integrity": "sha512-gZkFcmmp/CnzqD2RKMich2/FjBTsYopjiwJCroxqHZIY11IIoN0l5lKqcgoAPKHt33H2mAkSfvzj8i44Jm7F4w==",
"dev": true,
"requires": {
"@typescript-eslint/types": "4.12.0",
"@typescript-eslint/visitor-keys": "4.12.0",
"debug": "^4.1.1",
"globby": "^11.0.1",
"is-glob": "^4.0.1",
"lodash": "^4.17.15",
"semver": "^7.3.2",
"tsutils": "^3.17.1"
}
},
"globby": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz",
"integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
"dev": true,
"requires": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.1.1",
"ignore": "^5.1.4",
"merge2": "^1.3.0",
"slash": "^3.0.0"
}
},
"semver": {
"version": "7.3.4",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
"integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
"dev": true,
"requires": {
"lru-cache": "^6.0.0"
}
}
}
},
"eslint-plugin-jsx-a11y": {
"version": "6.4.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz",

View File

@ -70,6 +70,7 @@
"eslint-config-airbnb": "^18.2.1",
"eslint-config-prettier": "^7.1.0",
"eslint-loader": "^4.0.2",
"eslint-plugin-jest": "^24.1.3",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.3.0",
"eslint-plugin-react": "^7.22.0",

View File

@ -7,7 +7,7 @@ import {
waitFor,
} from '@testing-library/react';
import FirebaseStub from 'gatsby-plugin-firebase';
import FirebaseStub, { DatabaseConstants } from 'gatsby-plugin-firebase';
import { SettingsProvider } from '../../../contexts/SettingsContext';
import { ModalProvider } from '../../../contexts/ModalContext';
@ -25,14 +25,13 @@ beforeEach(() => {
});
describe('Builder', () => {
const resumesPath = FirebaseStub.database().resumesPath;
const { resumesPath } = FirebaseStub.database();
let resumeId = null;
let resume = null;
let mockUpdateFunction = null;
let container = null;
beforeEach(async () => {
resumeId = FirebaseStub.database().demoStateResume1Id;
resumeId = DatabaseConstants.demoStateResume1Id;
resume = (
await FirebaseStub.database()
.ref(`${resumesPath}/${resumeId}`)
@ -43,7 +42,7 @@ describe('Builder', () => {
'update',
);
container = render(
render(
<SettingsProvider>
<ModalProvider>
<UserProvider>

View File

@ -17,10 +17,9 @@ beforeEach(() => {
});
describe('Dashboard', () => {
const resumesPath = FirebaseStub.database().resumesPath;
const { resumesPath } = FirebaseStub.database();
let resumes = null;
let user = FirebaseStub.database().anonymousUser1;
let container = null;
const user = FirebaseStub.database().anonymousUser1;
beforeEach(async () => {
resumes = (
@ -30,10 +29,8 @@ describe('Dashboard', () => {
.equalTo(user.uid)
.once('value')
).val();
expect(resumes).toBeTruthy();
expect(Object.keys(resumes).length).not.toEqual(0);
container = render(
render(
<SettingsProvider>
<ModalProvider>
<UserProvider>
@ -60,7 +57,7 @@ describe('Dashboard', () => {
});
it('preview of user resumes', async () => {
expect(Object.keys(resumes).length).toEqual(2);
expect(Object.keys(resumes)).toHaveLength(2);
expect(Object.values(resumes)[0].user).toEqual(user.uid);
expect(

View File

@ -1,6 +1,6 @@
import React from 'react';
import { render } from '@testing-library/react';
import FirebaseStub from 'gatsby-plugin-firebase';
import FirebaseStub, { DatabaseConstants } from 'gatsby-plugin-firebase';
import '../../i18n/index';
import Castform from '../Castform';
@ -10,8 +10,8 @@ describe('Castform', () => {
beforeEach(async () => {
FirebaseStub.database().initializeData();
const resumesPath = FirebaseStub.database().resumesPath;
const resumeId = FirebaseStub.database().initialStateResumeId;
const { resumesPath } = FirebaseStub.database();
const resumeId = DatabaseConstants.initialStateResumeId;
resume = (
await FirebaseStub.database()
.ref(`${resumesPath}/${resumeId}`)
@ -32,7 +32,7 @@ describe('Castform', () => {
it('is not shown if not provided', () => {
const { queryByText } = render(<Castform data={resume} />);
expect(queryByText(birthDateLabelMatcher)).toBe(null);
expect(queryByText(birthDateLabelMatcher)).toBeNull();
});
it('is shown if provided', () => {