import 'reflect-metadata'; import { requiredMocks, } from './../../../../test-mocks'; requiredMocks(jest); import { BrowserDetectorService, } from './browser-detector.service'; const initBrowserDetectorServiceWithUserAgentString = ( userAgentString: string, ) => { return new BrowserDetectorService({ navigator: { userAgent: userAgentString, }, } as Window); }; describe('BrowserDetectorService', () => { describe('isFirefox', () => { // tslint:disable-next-line test('If the user navigation string contains Firefox it should return true', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( 'Firefox', ); expect(browserDetectorService.isFirefox()) .toBe(true); }); // tslint:disable-next-line test('If the user navigation string does not contain Firefox it should return true', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( 'other', ); expect(browserDetectorService.isFirefox()) .toBe(false); }); }); describe('isSafari', () => { // tslint:disable-next-line test('If the user navigation string contains Safari it should return true', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( 'Safari', ); expect(browserDetectorService.isSafari()) .toBe(true); }); // tslint:disable-next-line test('If the user navigation string contains Safari AND Chrome it should return false', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( 'Safari Chrome', ); expect(browserDetectorService.isSafari()) .toBe(false); }); // tslint:disable-next-line test('If the user navigation string does not contain Safari it should return true', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( 'other', ); expect(browserDetectorService.isSafari()) .toBe(false); }); }); describe('isChrome', () => { // tslint:disable-next-line test('If the user navigation string does not contain Firefox or Safari it should return true', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( 'really long test value should still return default', ); expect(browserDetectorService.isChrome()) .toBe(true); }); }); describe('getBrowserDetails', () => { // tslint:disable-next-line test('Returns unknown if the user agent string is not one of the desktop browsers (Chrome, Safari, FF, Edge, IE) or IOS browsers', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( // tslint:disable-next-line 'Mozilla/5.0 (Thing; CPU Thing OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1' ); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'unknown', version: 'unknown', }, ); }); // tslint:disable-next-line test('Returns Chrome and version number if the user agent string Chromes', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( // tslint:disable-next-line 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' ); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'Chrome', version: '65.0.3325.181', }, ); }); // tslint:disable-next-line test('Returns Safari and version number if the user agent string is Safaris', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( // tslint:disable-next-line 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1 Safari/605.1.15' ); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'Safari', version: '11.1', }, ); }); // tslint:disable-next-line test('Returns Firefox and version number if the user agent string is Firefoxs', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( // tslint:disable-next-line 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' ); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'Firefox', version: '59.0', }, ); }); [ // tslint:disable-next-line 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; rv:11.0) like Gecko', // tslint:disable-next-line 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko', ].forEach((userAgent) => { // tslint:disable-next-line test('Returns IE 11 if the user agent string is IEs: ' + userAgent, () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString(userAgent); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'IE', version: '11.0', }, ); }); }); // tslint:disable-next-line test('Returns IE 10 if the user agent string is IEs', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( // tslint:disable-next-line 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)', ); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'IE', version: '10.0', }, ); }); // tslint:disable-next-line test('Returns Edge if the user agent string is Edges', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString( // tslint:disable-next-line 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063' ); expect( browserDetectorService.getBrowserDetails(), ).toEqual( { name: 'Edge', version: '15.15063', }, ); }); }); describe('isIE', () => { test('Returns true if getBrowserDetails.name is IE', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString(''); browserDetectorService.getBrowserDetails = jest.fn() .mockReturnValue({ name: 'IE', }); const result = browserDetectorService.isIE(); expect(result).toBe(true); }); test('Returns false if getBrowserDetails.name is not IE', () => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString(''); browserDetectorService.getBrowserDetails = jest.fn() .mockReturnValue({ name: 'otherBrowser', }); const result = browserDetectorService.isIE(); expect(result).toBe(false); }); }); describe('isIOS', () => { const isIOSTest = ({ expectedResult, userAgent, }: { expectedResult: boolean, userAgent: string, }) => { const browserDetectorService = initBrowserDetectorServiceWithUserAgentString(userAgent); const result = browserDetectorService.isIOS(); expect(result).toBe(expectedResult); }; test('Returns true if user agent includes iPad', () => { isIOSTest({ expectedResult: true, userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_1 like ' + 'Mac OS X) AppleWebKit/604.2.10 (KHTML, like Gecko) ' + 'Version/11.0 Mobile/15A8391 Safari/604.1', }); }); test('Returns true if user agent includes iPhone', () => { isIOSTest({ expectedResult: true, userAgent: 'Mozilla/5.0 (iPad; CPU OS 11_3 like Mac OS X) ' + 'AppleWebKit/605.1.15 (KHTML, like Gecko) ' + 'Version/11.0 Mobile/15E148 Safari/604.1', }); }); test('Returns true if user agent includes iPod', () => { isIOSTest({ expectedResult: true, userAgent: 'Mozilla/5.0 (iPod; CPU OS 11_3 like Mac OS X) ' + 'AppleWebKit/605.1.15 (KHTML, like Gecko) ' + 'Version/11.0 Mobile/15E148 Safari/604.1', }); }); // tslint:disable-next-line test('Returns false if user agent does not include an IOS device', () => { isIOSTest({ expectedResult: false, userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ' + 'AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063', }); }); }); });