import log from 'loglevel'; import name from './name'; import { DEFAULT_APP_NAME } from './../../constants'; import { inferTitle } from './../../infer'; import { sanitizeFilename } from './../../utils'; jest.mock('./../../infer/inferTitle'); jest.mock('./../../utils/sanitizeFilename'); jest.mock('loglevel'); sanitizeFilename.mockImplementation((_, filename) => filename); const mockedResult = 'mock name'; describe('well formed name parameters', () => { const params = { name: 'appname', platform: 'something' }; test('it should not call inferTitle', () => name(params).then((result) => { expect(inferTitle).toHaveBeenCalledTimes(0); expect(result).toBe(params.name); })); test('it should call sanitize filename', () => name(params).then((result) => { expect(sanitizeFilename).toHaveBeenCalledWith(params.platform, result); })); }); describe('bad name parameters', () => { beforeEach(() => { inferTitle.mockImplementationOnce(() => Promise.resolve(mockedResult)); }); const params = { targetUrl: 'some url' }; describe('when the name is undefined', () => { test('it should call inferTitle', () => name(params).then(() => { expect(inferTitle).toHaveBeenCalledWith(params.targetUrl); })); }); describe('when the name is an empty string', () => { test('it should call inferTitle', () => { const testParams = Object.assign({}, params, { name: '' }); return name(testParams).then(() => { expect(inferTitle).toHaveBeenCalledWith(params.targetUrl); }); }); }); test('it should call sanitize filename', () => name(params).then((result) => { expect(sanitizeFilename).toHaveBeenCalledWith(params.platform, result); })); }); describe('handling inferTitle results', () => { const params = { targetUrl: 'some url', name: '', platform: 'something' }; test('it should return the result from inferTitle', () => { inferTitle.mockImplementationOnce(() => Promise.resolve(mockedResult)); return name(params).then((result) => { expect(result).toBe(mockedResult); expect(inferTitle).toHaveBeenCalledWith(params.targetUrl); }); }); describe('when the returned pageTitle is falsey', () => { test('it should return the default app name', () => { inferTitle.mockImplementationOnce(() => Promise.resolve(null)); return name(params).then((result) => { expect(result).toBe(DEFAULT_APP_NAME); expect(inferTitle).toHaveBeenCalledWith(params.targetUrl); }); }); }); describe('when inferTitle resolves with an error', () => { test('it should return the default app name', () => { inferTitle.mockImplementationOnce(() => Promise.reject(new Error('some error')), ); return name(params).then((result) => { expect(result).toBe(DEFAULT_APP_NAME); expect(inferTitle).toHaveBeenCalledWith(params.targetUrl); expect(log.warn).toHaveBeenCalledTimes(1); }); }); }); });