From 87779e88abf96e45b1b6bc7470eb1dea163ca9b9 Mon Sep 17 00:00:00 2001 From: marley Date: Wed, 17 May 2023 16:18:45 -0700 Subject: [PATCH] Settings unit tests. --- __mocks__/fs.js | 13 ---------- src/models/Settings.ts | 15 +++++++---- test/Settings.test.ts | 57 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/__mocks__/fs.js b/__mocks__/fs.js index c5bbe92..fe3667c 100644 --- a/__mocks__/fs.js +++ b/__mocks__/fs.js @@ -6,12 +6,6 @@ function __setFileContents(contents) { fileContents = contents; } -let writePromise = null; - -function __setWritePromise(resolve) { - writePromise = Promise.resolve(resolve); -} - // example info from Node docs function statSync(file) { return { @@ -44,16 +38,9 @@ function readFileSync(file, options) { return fileContents; } -let promises = { - writeFile: jest.fn(() => writePromise), - readFile: jest.fn(() => fileContents), -}; - fs.__setFileContents = __setFileContents; -fs.__setWritePromise = __setWritePromise; fs.statSync = statSync; fs.writeFileSync = writeFileSync; fs.readFileSync = readFileSync; -fs.promises = promises; module.exports = fs; diff --git a/src/models/Settings.ts b/src/models/Settings.ts index c7d68d9..51421c2 100644 --- a/src/models/Settings.ts +++ b/src/models/Settings.ts @@ -20,10 +20,9 @@ interface settingsFile { } export class Settings extends EventEmitter { - static #instance: Settings; + static #instance: Settings | undefined; readonly #file: string; - #writing: boolean; minValue: number; maxDistance: number; @@ -61,7 +60,6 @@ export class Settings extends EventEmitter { this.minValue = contents.minValue; this.maxDistance = contents.maxDistance; this.#matrixFile = contents.matrixFile; - this.#writing = false; if (this.#matrixFile) { this.#setMatrix(); @@ -76,6 +74,10 @@ export class Settings extends EventEmitter { return Settings.#instance; } + static destroy(): void { + Settings.#instance = undefined; + } + /* -------------------------------------------------------------------------------- save ---- */ async save(settings: settingsFile): Promise { @@ -86,8 +88,11 @@ export class Settings extends EventEmitter { Log.write('Settings saved!'); - // Update Settings props. - await this.#read(); + try { + await this.#read(); + } catch (err) { + Log.write(err); + } return true; diff --git a/test/Settings.test.ts b/test/Settings.test.ts index 2f2d0cd..98da46b 100644 --- a/test/Settings.test.ts +++ b/test/Settings.test.ts @@ -1,4 +1,5 @@ -import {expect} from '@jest/globals'; +import {expect, jest} from '@jest/globals'; +import {EliteMatrix} from 'elite-matrix'; import {Settings} from '../src/models/Settings'; jest.mock('fs'); @@ -34,17 +35,59 @@ describe('Settings', () => { }); describe('save()', () => { + const writeFileMock = jest.spyOn(require('fs/promises'), 'writeFile'); + const readFileMock = jest.spyOn(require('fs/promises'), 'readFile'); + it('should return boolean', async () => { + writeFileMock.mockResolvedValue(undefined); + readFileMock.mockResolvedValue(settingsFile); const result = await Settings.get().save(settingsFile); expect(typeof result).toBe('boolean'); + }); - require('fs').__setWritePromise(true); - const resultResolve = await Settings.get().save(settingsFile); - expect(resultResolve).toBe(true); + it('should return false when writeFile fails', async () => { + writeFileMock.mockImplementation(() => { + throw new Error(); + }); + const result = await Settings.get().save(settingsFile); + expect(result).toBe(false); + }); - require('fs').__setWritePromise(false); - const resultReject = await Settings.get().save(settingsFile); - expect(resultReject).toBe(false); + it('should return true when readFile fails', async () => { + writeFileMock.mockResolvedValue(undefined); + readFileMock.mockImplementation(() => { + throw new Error(); + }); + const result = await Settings.get().save(settingsFile); + expect(result).toBe(true); }); }); + + describe('#setMatrix()', () => { + const readFileMock = jest.spyOn(require('fs/promises'), 'readFile'); + + it('should set matrix from GraphicsConfiguration.xml', (done) => { + const settingsFile = { + minValue: 500000, + maxDistance: 10000, + matrixFile: 'GraphicsConfiguration.xml', + }; + require('fs').__setFileContents(JSON.stringify(settingsFile)); + const matrixFile = '1,0,00,1,00,0,1'; + readFileMock.mockResolvedValue(matrixFile); + + const settings = Settings.get(); + + settings.on('CUSTOM_COLORS_SET', () => { + expect(Settings.get().matrix).toBeDefined(); + expect(Settings.get().matrix).toBeInstanceOf(EliteMatrix); + done(); + }); + }); + }); + + afterEach(() => { + jest.resetAllMocks(); + Settings.destroy(); + }); });