import { parse } from 'node-html-parser'
import { CheckedIcon, CheckerMessage, CheckerStatus, FetchResponse, MessageId } from "./types";
import { checkTouchIcon, checkTouchIconIcon, checkTouchIconTitle, getDuplicatedSizes } from "./touch-icon";
import { testFetcher } from './test-helper';
import { bufferToDataUrl, filePathToReadableStream, readableStreamToBuffer } from './helper';
type TestOutput = {
messages: Pick[],
appTitle?: string,
icon?: CheckedIcon | null,
}
const runCheckTouchIconTitleTest = async (
headFragment: string | null,
output: TestOutput,
fetchDatabase: { [url: string]: FetchResponse } = {}
) => {
const root = headFragment ? parse(headFragment) : null;
const result = await checkTouchIconTitle('https://example.com/', root, testFetcher(fetchDatabase));
const filteredMessages = result.messages.map(m => ({ status: m.status, id: m.id }));
expect({
messages: filteredMessages,
appTitle: result.appTitle
}).toEqual(output);
}
test('checkTouchIconTitle - noHead', async () => {
await runCheckTouchIconTitleTest(null, { messages: [{
status: CheckerStatus.Error,
id: MessageId.noHead,
}]});
})
test('checkTouchIconTitle - noTouchWebAppTitle', async () => {
await runCheckTouchIconTitleTest('Some text', { messages: [{
status: CheckerStatus.Warning,
id: MessageId.noTouchWebAppTitle,
}]});
})
test('checkTouchIconTitle - multipleTouchWebAppTitles', async () => {
await runCheckTouchIconTitleTest(`
`, { messages: [{
status: CheckerStatus.Error,
id: MessageId.multipleTouchWebAppTitles,
}]});
})
test('checkTouchIconTitle - touchWebAppTitleDeclared', async () => {
await runCheckTouchIconTitleTest(`
`, { messages: [{
status: CheckerStatus.Ok,
id: MessageId.touchWebAppTitleDeclared,
}], appTitle: 'The App Name' });
})
const runCheckTouchIconTest = async (
headFragment: string | null,
output: TestOutput,
fetchDatabase: { [url: string]: FetchResponse } = {}
) => {
const root = headFragment ? parse(headFragment) : null;
const result = await checkTouchIconIcon('https://example.com/', root, testFetcher(fetchDatabase));
const filteredMessages = result.messages.map(m => ({ status: m.status, id: m.id }));
expect({
messages: filteredMessages,
icon: result.icon
}).toEqual({
...output,
icon: output.icon || null
});
}
test('checkTouchIcon - noHead', async () => {
await runCheckTouchIconTest(null, { messages: [{
status: CheckerStatus.Error,
id: MessageId.noHead,
}]});
})
test('checkTouchIcon - noTouchIcon', async () => {
await runCheckTouchIconTest('Some text', { messages: [{
status: CheckerStatus.Error,
id: MessageId.noTouchIcon,
}]});
})
test('checkTouchIcon - multipleTouchIcon - no size', async () => {
await runCheckTouchIconTest(`
`, { messages: [{
status: CheckerStatus.Ok,
id: MessageId.touchIconDeclared,
}, {
status: CheckerStatus.Error,
id: MessageId.duplicatedTouchIconSizes,
}], icon: {
content: null,
url: 'https://example.com/some-icon.png',
width: null,
height: null
},
}, {
'https://example.com/some-icon.png': {
status: 200,
contentType: 'image/png',
readableStream: null
},
'https://example.com/some-other-icon.png': {
status: 200,
contentType: 'image/png',
readableStream: null
}
});
})
test('checkTouchIcon - multipleTouchIcon - specific size', async () => {
await runCheckTouchIconTest(`
`, { messages: [{
status: CheckerStatus.Ok,
id: MessageId.touchIconDeclared,
}, {
status: CheckerStatus.Error,
id: MessageId.duplicatedTouchIconSizes,
}],
icon: {
content: null,
url: 'https://example.com/some-icon.png',
width: null,
height: null
},
}, {
'https://example.com/some-icon.png': {
status: 200,
contentType: 'image/png',
readableStream: null
},
'https://example.com/some-other-icon.png': {
status: 200,
contentType: 'image/png',
readableStream: null
}
});
})
const testIcon = './fixtures/180x180.png';
test('checkTouchIcon - Regular case', async () => {
await runCheckTouchIconTest(`
`, { messages: [{
status: CheckerStatus.Ok,
id: MessageId.touchIconDeclared,
}, {
status: CheckerStatus.Ok,
id: MessageId.touchIconDownloadable,
},{
status: CheckerStatus.Ok,
id: MessageId.touchIconSquare
}], icon: {
content: bufferToDataUrl(await readableStreamToBuffer(await filePathToReadableStream(testIcon)), 'image/png'),
url: 'https://example.com/some-other-icon.png',
width: 180,
height: 180,
}
}, {
'https://example.com/some-other-icon.png': {
status: 200,
contentType: 'image/png',
readableStream: await filePathToReadableStream(testIcon)
}
});
})
test('getDuplicatedSizes', () => {
// No duplicates
expect(getDuplicatedSizes([])).toEqual([]);
expect(getDuplicatedSizes([ undefined ])).toEqual([]);
expect(getDuplicatedSizes([ '180x180' ])).toEqual([]);
expect(getDuplicatedSizes([ undefined, '180x180' ])).toEqual([]);
// Duplicates
expect(getDuplicatedSizes([ '152x152', '180x180', '180x180' ])).toEqual([ '180x180' ]);
expect(getDuplicatedSizes([ undefined, '180x180', undefined, undefined ])).toEqual([ undefined ]);
expect(getDuplicatedSizes([
'152x152', '180x180', '152x152', undefined, '152x152', undefined
])).toEqual([
'152x152', undefined
]);
})