mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-24 20:37:59 +01:00
115 lines
4.2 KiB
TypeScript
115 lines
4.2 KiB
TypeScript
|
import { timeAgo, setupTimestamps } from '../timeago';
|
||
|
|
||
|
const epochRfc3339 = '1970-01-01T00:00:00.000Z';
|
||
|
|
||
|
describe('Timeago functionality', () => {
|
||
|
// TODO: is this robust? do we need e.g. timekeeper to freeze the time?
|
||
|
function timeAgoWithSecondOffset(offset: number) {
|
||
|
const utc = new Date(new Date().getTime() + offset * 1000).toISOString();
|
||
|
|
||
|
const timeEl = document.createElement('time');
|
||
|
timeEl.setAttribute('datetime', utc);
|
||
|
timeEl.textContent = utc;
|
||
|
|
||
|
timeAgo([timeEl]);
|
||
|
return timeEl.textContent;
|
||
|
}
|
||
|
|
||
|
/* eslint-disable no-implicit-coercion */
|
||
|
it('should parse a time as less than a minute', () => {
|
||
|
expect(timeAgoWithSecondOffset(-15)).toEqual('less than a minute ago');
|
||
|
expect(timeAgoWithSecondOffset(+15)).toEqual('less than a minute from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as about a minute', () => {
|
||
|
expect(timeAgoWithSecondOffset(-75)).toEqual('about a minute ago');
|
||
|
expect(timeAgoWithSecondOffset(+75)).toEqual('about a minute from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as 30 minutes', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 30))).toEqual('30 minutes ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 30))).toEqual('30 minutes from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as about an hour', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60))).toEqual('about an hour ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60))).toEqual('about an hour from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as about 6 hours', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 6))).toEqual('about 6 hours ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 6))).toEqual('about 6 hours from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as a day', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 36))).toEqual('a day ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 36))).toEqual('a day from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as 25 days', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 24 * 25))).toEqual('25 days ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 24 * 25))).toEqual('25 days from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as about a month', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 24 * 35))).toEqual('about a month ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 24 * 35))).toEqual('about a month from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as 3 months', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 24 * 30 * 3))).toEqual('3 months ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 24 * 30 * 3))).toEqual('3 months from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as about a year', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 24 * 30 * 13))).toEqual('about a year ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 24 * 30 * 13))).toEqual('about a year from now');
|
||
|
});
|
||
|
|
||
|
it('should parse a time as 5 years', () => {
|
||
|
expect(timeAgoWithSecondOffset(-(60 * 60 * 24 * 30 * 12 * 5))).toEqual('5 years ago');
|
||
|
expect(timeAgoWithSecondOffset(+(60 * 60 * 24 * 30 * 12 * 5))).toEqual('5 years from now');
|
||
|
});
|
||
|
/* eslint-enable no-implicit-coercion */
|
||
|
|
||
|
it('should ignore time elements without a datetime attribute', () => {
|
||
|
const timeEl = document.createElement('time');
|
||
|
const value = Math.random().toString();
|
||
|
|
||
|
timeEl.textContent = value;
|
||
|
timeAgo([timeEl]);
|
||
|
|
||
|
expect(timeEl.textContent).toEqual(value);
|
||
|
});
|
||
|
|
||
|
it('should not reset title attribute if it already exists', () => {
|
||
|
const timeEl = document.createElement('time');
|
||
|
const value = Math.random().toString();
|
||
|
|
||
|
timeEl.setAttribute('datetime', epochRfc3339);
|
||
|
timeEl.setAttribute('title', value);
|
||
|
timeAgo([timeEl]);
|
||
|
|
||
|
expect(timeEl.getAttribute('title')).toEqual(value);
|
||
|
expect(timeEl.textContent).not.toEqual(epochRfc3339);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Automatic timestamps', () => {
|
||
|
it('should process all timestamps in the document', () => {
|
||
|
for (let i = 0; i < 5; i += 1) {
|
||
|
const timeEl = document.createElement('time');
|
||
|
timeEl.setAttribute('datetime', epochRfc3339);
|
||
|
timeEl.textContent = epochRfc3339;
|
||
|
|
||
|
document.documentElement.insertAdjacentElement('beforeend', timeEl);
|
||
|
}
|
||
|
|
||
|
setupTimestamps();
|
||
|
|
||
|
for (const timeEl of document.getElementsByTagName('time')) {
|
||
|
expect(timeEl.textContent).not.toEqual(epochRfc3339);
|
||
|
}
|
||
|
});
|
||
|
});
|