UNPKG

@realfavicongenerator/check-favicon

Version:

Check the favicon of a website

264 lines (263 loc) 10.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const node_html_parser_1 = require("node-html-parser"); const ico_1 = require("./ico"); const types_1 = require("../types"); const helper_1 = require("../helper"); const test_helper_1 = require("../test-helper"); const runIcoTest = (headFragment_1, output_1, ...args_1) => __awaiter(void 0, [headFragment_1, output_1, ...args_1], void 0, function* (headFragment, output, fetchDatabase = {}, checkContent = true) { const root = headFragment ? (0, node_html_parser_1.parse)(headFragment) : null; const result = yield (0, ico_1.checkIcoFavicon)('https://example.com/', root, (0, test_helper_1.testFetcher)(fetchDatabase)); const filteredMessages = result.messages.map(m => ({ status: m.status, id: m.id })); expect(filteredMessages).toEqual(output.messages); // Check icon properties - icon is always returned by checkIcoFavicon const resultIcon = result.icon; const outputIcon = output.icon; expect(resultIcon.url).toEqual(outputIcon.url); expect(resultIcon.width).toEqual(outputIcon.width); expect(resultIcon.height).toEqual(outputIcon.height); // For content, just check if it's null or not null unless exact match is needed if (checkContent && outputIcon.content === null) { expect(resultIcon.content).toBeNull(); } else if (checkContent && outputIcon.content !== null) { expect(resultIcon.content).not.toBeNull(); expect(resultIcon.content).toMatch(/^data:image\/(png|bmp);base64,/); } }); test('checkIcoFavicon - noHead', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(null, { messages: [{ status: types_1.CheckerStatus.Error, id: types_1.MessageId.noHead, }], icon: { content: null, url: null, width: null, height: null, } }); })); test('checkIcoFavicon - noIcoFavicon', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(`<title>Some text</title>`, { messages: [{ status: types_1.CheckerStatus.Error, id: types_1.MessageId.noIcoFavicon, }], icon: { content: null, url: null, width: null, height: null, } }); })); test('checkIcoFavicon - implicit /favicon.ico when not declared', () => __awaiter(void 0, void 0, void 0, function* () { const testIconPath = './fixtures/simple-ico.ico'; yield runIcoTest(`<title>Some text</title>`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconImplicitInRoot, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDownloadable, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconExpectedSizes, }], icon: { content: "data:image/png;base64,placeholder", // Will be checked for format only url: 'https://example.com/favicon.ico', width: 48, height: 48, } }, { 'https://example.com/favicon.ico': { status: 200, contentType: 'image/x-icon', readableStream: yield (0, helper_1.filePathToReadableStream)(testIconPath) } }); })); test('checkIcoFavicon - multipleIcoFavicons with shortcut icon', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(` <link rel="shortcut icon" href="/favicon1.ico" /> <link rel="shortcut icon" href="/favicon2.ico" /> `, { messages: [{ status: types_1.CheckerStatus.Error, id: types_1.MessageId.multipleIcoFavicons, }], icon: { content: null, url: null, width: null, height: null, } }); })); test('checkIcoFavicon - multipleIcoFavicons with type="image/x-icon"', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(` <link rel="icon" type="image/x-icon" href="/favicon1.ico" /> <link rel="icon" type="image/x-icon" href="/favicon2.ico" /> `, { messages: [{ status: types_1.CheckerStatus.Error, id: types_1.MessageId.multipleIcoFavicons, }], icon: { content: null, url: null, width: null, height: null, } }); })); test('checkIcoFavicon - icoFaviconDeclared & noIcoFaviconHref', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(`<link rel="shortcut icon" />`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDeclared, }, { status: types_1.CheckerStatus.Error, id: types_1.MessageId.noIcoFaviconHref, }], icon: { content: null, url: null, width: null, height: null, } }); })); test('checkIcoFavicon - icoFaviconDeclared & icoFavicon404', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(`<link rel="shortcut icon" href="/favicon.ico" />`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDeclared, }, { status: types_1.CheckerStatus.Error, id: types_1.MessageId.icoFavicon404, }], icon: { content: null, url: 'https://example.com/favicon.ico', width: null, height: null, } }); })); test('checkIcoFavicon - icoFaviconDeclared & icoFaviconCannotGet', () => __awaiter(void 0, void 0, void 0, function* () { yield runIcoTest(`<link rel="shortcut icon" href="/favicon.ico" />`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDeclared, }, { status: types_1.CheckerStatus.Error, id: types_1.MessageId.icoFaviconCannotGet, }], icon: { content: null, url: 'https://example.com/favicon.ico', width: null, height: null, } }, { 'https://example.com/favicon.ico': { status: 403, contentType: 'image/x-icon' } }); })); test('checkIcoFavicon - icoFaviconDeclared & icoFaviconDownloadable & icoFaviconExpectedSizes', () => __awaiter(void 0, void 0, void 0, function* () { const testIconPath = './fixtures/simple-ico.ico'; yield runIcoTest(`<link rel="shortcut icon" href="/favicon.ico" />`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDeclared, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDownloadable, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconExpectedSizes, }], icon: { content: "data:image/png;base64,placeholder", // Will be checked for format only url: 'https://example.com/favicon.ico', width: 48, height: 48, } }, { 'https://example.com/favicon.ico': { status: 200, contentType: 'image/x-icon', readableStream: yield (0, helper_1.filePathToReadableStream)(testIconPath) } }); })); test('checkIcoFavicon - using type="image/x-icon"', () => __awaiter(void 0, void 0, void 0, function* () { const testIconPath = './fixtures/simple-ico.ico'; yield runIcoTest(`<link rel="icon" type="image/x-icon" href="/favicon.ico" />`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDeclared, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDownloadable, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconExpectedSizes, }], icon: { content: "data:image/png;base64,placeholder", // Will be checked for format only url: 'https://example.com/favicon.ico', width: 48, height: 48, } }, { 'https://example.com/favicon.ico': { status: 200, contentType: 'image/x-icon', readableStream: yield (0, helper_1.filePathToReadableStream)(testIconPath) } }); })); // For https://github.com/RealFaviconGenerator/core/issues/2 test('checkIcoFavicon - Protocol-relative URL', () => __awaiter(void 0, void 0, void 0, function* () { const testIconPath = './fixtures/simple-ico.ico'; yield runIcoTest(`<link rel="shortcut icon" href="//example.com/favicon.ico" />`, { messages: [{ status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDeclared, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconDownloadable, }, { status: types_1.CheckerStatus.Ok, id: types_1.MessageId.icoFaviconExpectedSizes, }], icon: { content: "data:image/png;base64,placeholder", // Will be checked for format only url: 'https://example.com/favicon.ico', width: 48, height: 48, } }, { 'https://example.com/favicon.ico': { status: 200, contentType: 'image/x-icon', readableStream: yield (0, helper_1.filePathToReadableStream)(testIconPath) } }); }));