import I18n from "I18n"; import LocalDateBuilder from "./local-date-builder"; import sinon from "sinon"; import QUnit, { module, test } from "qunit"; const UTC = "Etc/UTC"; const SYDNEY = "Australia/Sydney"; const LOS_ANGELES = "America/Los_Angeles"; const NEW_YORK = "America/New_York"; const PARIS = "Europe/Paris"; const LAGOS = "Africa/Lagos"; const LONDON = "Europe/London"; function freezeTime({ date, timezone }, cb) { date = date || "2020-01-22 10:34"; const newTimezone = timezone || PARIS; const previousZone = moment.tz.guess(); const now = moment.tz(date, newTimezone).valueOf(); sinon.useFakeTimers(now); sinon.stub(moment.tz, "guess"); moment.tz.guess.returns(newTimezone); moment.tz.setDefault(newTimezone); cb(); moment.tz.guess.returns(previousZone); moment.tz.setDefault(previousZone); sinon.restore(); } QUnit.assert.buildsCorrectDate = function (options, expected, message) { const localTimezone = options.localTimezone || PARIS; delete options.localTimezone; const localDateBuilder = new LocalDateBuilder( Object.assign( {}, { date: "2020-03-22", }, options ), localTimezone ); if (expected.formatted) { this.test.assert.strictEqual( localDateBuilder.build().formatted, expected.formatted, message || "it formats the date correctly" ); } if (expected.previews) { this.test.assert.deepEqual( localDateBuilder.build().previews, expected.previews, message || "it formats the previews correctly" ); } }; module("lib:local-date-builder", function () { test("date", function (assert) { freezeTime({ date: "2020-03-11" }, () => { assert.buildsCorrectDate( { date: "2020-03-22", timezone: PARIS }, { formatted: "March 22, 2020" }, "it displays the date without time" ); }); }); test("date and time", function (assert) { assert.buildsCorrectDate( { date: "2020-04-11", time: "11:00" }, { formatted: "April 11, 2020 1:00 PM" }, "it displays the date with time" ); assert.buildsCorrectDate( { date: "2020-04-11", time: "11:05:12", format: "LTS" }, { formatted: "1:05:12 PM" }, "it displays full time (hours, minutes, seconds)" ); }); test("option[format]", function (assert) { freezeTime({ date: "2020-03-11" }, () => { assert.buildsCorrectDate( { format: "YYYY" }, { formatted: "2020 (UTC)" }, "it uses custom format" ); }); }); test("option[displayedTimezone]", function (assert) { freezeTime({}, () => { assert.buildsCorrectDate( { displayedTimezone: SYDNEY }, { formatted: "March 22, 2020 (Sydney)" }, "it displays the timezone if the timezone is different from the date" ); }); freezeTime({}, () => { assert.buildsCorrectDate( { displayedTimezone: PARIS, timezone: PARIS }, { formatted: "March 22, 2020" }, "it doesn't display the timezone if the timezone is the same than the date" ); }); freezeTime({}, () => { assert.buildsCorrectDate( { timezone: UTC, displayedTimezone: UTC }, { formatted: "March 22, 2020 (UTC)" }, "it replaces `Etc/`" ); }); freezeTime({}, () => { assert.buildsCorrectDate( { timezone: LOS_ANGELES, displayedTimezone: LOS_ANGELES }, { formatted: "March 22, 2020 (Los Angeles)" }, "it removes prefix and replaces `_`" ); }); }); test("option[timezone]", function (assert) { freezeTime({}, () => { assert.buildsCorrectDate( { timezone: SYDNEY, displayedTimezone: PARIS }, { formatted: "March 21, 2020" }, "it correctly parses a date with the given timezone context" ); }); }); test("option[recurring]", function (assert) { freezeTime({ date: "2020-04-06 06:00", timezone: LAGOS }, () => { assert.buildsCorrectDate( { date: "2019-11-25", time: "11:00", timezone: PARIS, displayedTimezone: LAGOS, recurring: "1.weeks", }, { formatted: "April 6, 2020 10:00 AM (Lagos)", }, "it correctly formats a recurring date starting from a !isDST timezone to a isDST timezone date when displayed to a user using a timezone with no DST" ); }); freezeTime({ date: "2020-04-06 01:00", timezone: SYDNEY }, () => { assert.buildsCorrectDate( { date: "2020-03-09", time: "02:00", timezone: UTC, recurring: "1.weeks", calendar: false, displayedTimezone: SYDNEY, }, { formatted: "April 6, 2020 12:00 PM (Sydney)", }, "it correctly formats a recurring date spanning over weeks" ); }); freezeTime({ date: "2020-04-07 22:00" }, () => { assert.buildsCorrectDate( { date: "2019-11-25", time: "11:00", recurring: "1.weeks", timezone: PARIS, }, { formatted: "April 13, 2020 11:00 AM", }, "it correctly adds from a !isDST date to a isDST date" ); }); freezeTime({ date: "2020-04-06 10:59" }, () => { assert.buildsCorrectDate( { date: "2020-03-30", time: "11:00", recurring: "1.weeks", timezone: PARIS, }, { formatted: "Today 11:00 AM", }, "it works to the minute" ); }); freezeTime({ date: "2020-04-06 11:01" }, () => { assert.buildsCorrectDate( { date: "2020-03-30", time: "11:00", recurring: "1.weeks", timezone: PARIS, }, { formatted: "April 13, 2020 11:00 AM", }, "it works to the minute" ); }); freezeTime({ date: "2020-12-28 09:16" }, () => { assert.buildsCorrectDate( { date: "2021-01-24", time: "08:30", recurring: "1.weeks", timezone: NEW_YORK, }, { formatted: "January 24, 2021 2:30 PM", }, "it works for a future date" ); }); freezeTime({ date: "2021-01-08 11:16" }, () => { assert.buildsCorrectDate( { date: "2021-01-05", time: "14:00", recurring: "2.hours", timezone: NEW_YORK, }, { formatted: "Today 12:00 PM", }, "it works with hours" ); }); }); test("option[countdown]", function (assert) { freezeTime({ date: "2020-03-21 23:59" }, () => { assert.buildsCorrectDate( { countdown: true, timezone: PARIS, }, { formatted: "a minute" }, "it shows the time remaining" ); }); freezeTime({ date: "2020-03-22 00:01" }, () => { assert.buildsCorrectDate( { countdown: true, timezone: PARIS, }, { formatted: I18n.t( "discourse_local_dates.relative_dates.countdown.passed" ), }, "it shows the date has passed" ); }); }); test("option[calendar]", function (assert) { freezeTime({ date: "2020-03-23 23:00" }, () => { assert.buildsCorrectDate( { date: "2020-03-22", time: "23:59", timezone: PARIS }, { formatted: "Yesterday 11:59 PM" }, "it drops calendar mode when event date is more than one day before current date" ); }); freezeTime({ date: "2020-03-20 23:59" }, () => assert.buildsCorrectDate( { date: "2020-03-21", time: "01:00", timezone: PARIS }, { formatted: "Tomorrow 1:00 AM" } ) ); freezeTime({ date: "2020-03-20 23:59" }, () => assert.buildsCorrectDate( { date: "2020-03-21", time: "00:00", timezone: PARIS }, { formatted: "Saturday" }, "it displays the day with no time when the time in the displayed timezone is 00:00" ) ); freezeTime({ date: "2020-03-20 23:59" }, () => { assert.buildsCorrectDate( { date: "2020-03-21", time: "23:59", timezone: PARIS }, { formatted: "Tomorrow 11:59 PM" } ); }); freezeTime({ date: "2020-03-21 00:00" }, () => assert.buildsCorrectDate( { date: "2020-03-21", time: "23:00", timezone: PARIS }, { formatted: "Today 11:00 PM" } ) ); freezeTime({ date: "2020-03-22 23:59" }, () => assert.buildsCorrectDate( { date: "2020-03-21", time: "23:59", timezone: PARIS }, { formatted: "Yesterday 11:59 PM" } ) ); freezeTime({ date: "2020-03-22 23:59" }, () => assert.buildsCorrectDate( { date: "2020-03-21", time: "23:59", timezone: PARIS }, { formatted: "Yesterday 11:59 PM" } ) ); freezeTime({ date: "2020-03-22 23:59" }, () => assert.buildsCorrectDate( { calendar: false, date: "2020-03-21", time: "23:59", timezone: PARIS }, { formatted: "March 21, 2020 11:59 PM" }, "it doesn't use calendar when disabled" ) ); freezeTime({ date: "2020-03-24 01:00" }, () => assert.buildsCorrectDate( { date: "2020-03-21", timezone: PARIS }, { formatted: "March 21, 2020" }, "it stops formatting out of calendar range" ) ); freezeTime({ date: "2020-05-12", timezone: LOS_ANGELES }, () => { assert.buildsCorrectDate( { date: "2020-05-13", time: "18:00", localTimezone: LOS_ANGELES, }, { formatted: "Tomorrow 11:00 AM" }, "it correctly displays a different local timezone" ); }); }); test("previews", function (assert) { freezeTime({ date: "2020-03-22" }, () => { assert.buildsCorrectDate( { timezone: PARIS }, { previews: [ { current: true, formatted: "Sunday, March 22, 2020 12:00 AM → Monday, March 23, 2020 12:00 AM", timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { timezone: PARIS, timezones: [SYDNEY] }, { previews: [ { current: true, formatted: "Sunday, March 22, 2020 12:00 AM → Monday, March 23, 2020 12:00 AM", timezone: "Paris", }, { formatted: "Sunday, March 22, 2020 10:00 AM → Monday, March 23, 2020 10:00 AM", timezone: "Sydney", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { timezone: PARIS, displayedTimezone: LOS_ANGELES }, { previews: [ { current: true, formatted: "Sunday, March 22, 2020 12:00 AM → Monday, March 23, 2020 12:00 AM", timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { timezone: PARIS, displayedTimezone: PARIS }, { previews: [ { current: true, formatted: "Sunday, March 22, 2020 12:00 AM → Monday, March 23, 2020 12:00 AM", timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { timezone: PARIS, timezones: [PARIS] }, { previews: [ { current: true, formatted: "Sunday, March 22, 2020 12:00 AM → Monday, March 23, 2020 12:00 AM", timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { duration: 90, timezone: PARIS, timezones: [PARIS] }, { previews: [ { current: true, formatted: 'Sunday, March 22, 2020
12:00 AM → 1:30 AM', timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { duration: 1440, timezone: PARIS, timezones: [PARIS] }, { previews: [ { current: true, formatted: "Sunday, March 22, 2020 12:00 AM → Monday, March 23, 2020 12:00 AM", timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-03-22", timezone: PARIS }, () => { assert.buildsCorrectDate( { time: "11:34", timezone: PARIS, timezones: [PARIS] }, { previews: [ { current: true, formatted: 'Sunday, March 22, 2020
11:34 AM', timezone: "Paris", }, ], } ); }); freezeTime({ date: "2020-04-06", timezone: PARIS }, () => { assert.buildsCorrectDate( { timezone: PARIS, date: "2020-04-07", timezones: [LONDON, LAGOS, SYDNEY], }, { previews: [ { current: true, formatted: "Tuesday, April 7, 2020 12:00 AM → Wednesday, April 8, 2020 12:00 AM", timezone: "Paris", }, { formatted: "Monday, April 6, 2020 11:00 PM → Tuesday, April 7, 2020 11:00 PM", timezone: "London", }, { formatted: "Monday, April 6, 2020 11:00 PM → Tuesday, April 7, 2020 11:00 PM", timezone: "Lagos", }, { formatted: "Tuesday, April 7, 2020 8:00 AM → Wednesday, April 8, 2020 8:00 AM", timezone: "Sydney", }, ], } ); }); freezeTime({ date: "2020-04-06", timezone: PARIS }, () => { assert.buildsCorrectDate( { timezone: PARIS, date: "2020-04-07", time: "14:54", timezones: [LONDON, LAGOS, SYDNEY], }, { previews: [ { current: true, formatted: 'Tuesday, April 7, 2020
2:54 PM', timezone: "Paris", }, { formatted: 'Tuesday, April 7, 2020
1:54 PM', timezone: "London", }, { formatted: 'Tuesday, April 7, 2020
1:54 PM', timezone: "Lagos", }, { formatted: 'Tuesday, April 7, 2020
10:54 PM', timezone: "Sydney", }, ], } ); }); freezeTime({ date: "2020-05-12", timezone: LOS_ANGELES }, () => { assert.buildsCorrectDate( { date: "2020-05-13", time: "18:00", localTimezone: LOS_ANGELES, }, { previews: [ { current: true, formatted: 'Wednesday, May 13, 2020
11:00 AM', timezone: "Los Angeles", }, { formatted: 'Wednesday, May 13, 2020
6:00 PM', timezone: "UTC", }, ], } ); }); }); });