diff --git a/jest.config.cjs b/jest.config.cjs index 81926fd7..03aad6c0 100644 --- a/jest.config.cjs +++ b/jest.config.cjs @@ -3,4 +3,5 @@ module.exports = { testMatch: ['**/__tests__/**/*.+(ts|js)', '**/?(*.)+(spec|test).+(ts|js)'], setupFiles: ['/test/setup.js'], transform: {}, + collectCoverageFrom: ['**/*.js'], }; diff --git a/package-lock.json b/package-lock.json index 4220f369..db39304a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "@netlify/plugin-lighthouse", - "version": "4.0.5", + "version": "4.0.6", "license": "MIT", "dependencies": { "chalk": "^4.1.0", diff --git a/package.json b/package.json index 5e1c3456..14dc9d0d 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "local": "node -e 'import(\"./src/index.js\").then(index => index.onPostBuild());'", "lint": "eslint 'src/**/*.js'", "format": "prettier --write 'src/**/*.js'", - "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js", + "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --collect-coverage", "format:ci": "prettier --check 'src/**/*.js'" }, "keywords": [ diff --git a/src/lib/get-serve-path/get-serve-path.test.js b/src/lib/get-serve-path/get-serve-path.test.js new file mode 100644 index 00000000..d92c71d8 --- /dev/null +++ b/src/lib/get-serve-path/get-serve-path.test.js @@ -0,0 +1,17 @@ +import getServePath from '.'; + +describe('getServePath', () => { + it('returns undefined for dir thats not a string', () => { + expect(getServePath(2)).toEqual({ serveDir: undefined }); + }); + + it('returns undefined for subdir thats not a string', () => { + expect(getServePath(2, 2)).toEqual({ serveDir: undefined }); + }); + + it('returns joined path for serveDir', () => { + expect(getServePath('example', 'path')).toEqual({ + serveDir: 'example/path', + }); + }); +}); diff --git a/src/lib/get-server/get-server.test.js b/src/lib/get-server/get-server.test.js new file mode 100644 index 00000000..962db76a --- /dev/null +++ b/src/lib/get-server/get-server.test.js @@ -0,0 +1,64 @@ +jest.unstable_mockModule('chalk', () => { + return { + default: { + magenta: (m) => m, + }, + }; +}); + +const mockedExpress = () => ({ + use: jest.fn(), + listen: jest.fn(), +}); +const mockStatic = jest.fn(); +Object.defineProperty(mockedExpress, 'static', { value: mockStatic }); + +jest.unstable_mockModule('express', () => { + return { + default: mockedExpress, + }; +}); +const getServer = (await import('.')).default; + +describe('getServer', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('returns a mock server if audit URL is defined', () => { + const mockListen = jest.fn(); + console.log = jest.fn(); + + const { server } = getServer({ auditUrl: '/' }); + expect(server.listen).toBeDefined(); + server.listen(mockListen); + expect(mockListen).toHaveBeenCalled(); + expect(console.log.mock.calls[0][0]).toEqual('Scanning url /'); + + expect(server.close).toBeDefined(); + expect(server.close()).toBeUndefined(); + expect(server.url).toEqual('/'); + }); + + it('throws an error if no audit URL and no serveDir', () => { + expect(() => getServer({})).toThrow('Empty publish dir'); + }); + + it('returns an express server if no audit URL and a serveDir', () => { + const { server } = getServer({ serveDir: 'dir' }); + expect(mockStatic).toHaveBeenCalled(); + + // Check we log when we start serving directory + server.listen(jest.fn()); + expect(console.log.mock.calls[0][0]).toEqual( + 'Serving and scanning site from directory dir', + ); + + expect(server.url).toEqual('http://localhost:5100'); + + // Check close method closes the given instance + const close = jest.fn(); + server.close({ close }); + expect(close).toHaveBeenCalled(); + }); +});