@realfavicongenerator/check-favicon
Version:
Check the favicon of a website
264 lines (263 loc) • 10.6 kB
JavaScript
"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)
}
});
}));