-
-
Notifications
You must be signed in to change notification settings - Fork 55
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'upstream/master'
- Loading branch information
Showing
10 changed files
with
513 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
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); | ||
} | ||
}); | ||
}); |
Oops, something went wrong.