0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-04-08 02:52:39 -05:00

fix: offset bug when switching timezones (#7101)

no issue
This commit is contained in:
Katharina Irrgang 2016-07-15 18:44:22 +02:00 committed by Hannah Wolfe
parent 748c664b78
commit 8c6ba47b0e
2 changed files with 65 additions and 8 deletions

View file

@ -23,7 +23,7 @@ events.on('token.added', function (tokenModel) {
events.on('settings.activeTimezone.edited', function (settingModel) {
var newTimezone = settingModel.attributes.value,
previousTimezone = settingModel._updatedAttributes.value,
timezoneOffset = moment.tz(newTimezone).utcOffset();
timezoneOffsetDiff = moment.tz(newTimezone).utcOffset() - moment.tz(previousTimezone).utcOffset();
// CASE: TZ was updated, but did not change
if (previousTimezone === newTimezone) {
@ -38,7 +38,7 @@ events.on('settings.activeTimezone.edited', function (settingModel) {
return sequence(results.map(function (post) {
return function reschedulePostIfPossible() {
var newPublishedAtMoment = moment(post.get('published_at')).add(timezoneOffset, 'minutes');
var newPublishedAtMoment = moment(post.get('published_at')).add(timezoneOffsetDiff, 'minutes');
/**
* CASE:

View file

@ -15,13 +15,14 @@ describe('Models: listeners', function () {
var eventsToRemember = {},
scope = {
posts: [],
publishedAtFutureMoment: moment().add(2, 'days').startOf('hour'),
timezoneOffset: 420,
publishedAtFutureMoment1: moment().add(2, 'days').startOf('hour'),
publishedAtFutureMoment3: moment().add(10, 'hours').startOf('hour'),
timezoneOffset: -480,
newTimezone: 'America/Los_Angeles',
oldTimezone: 'Europe/London'
};
beforeEach(testUtils.teardown);
before(testUtils.teardown);
beforeEach(testUtils.setup());
beforeEach(function () {
@ -34,6 +35,7 @@ describe('Models: listeners', function () {
afterEach(function (done) {
events.on.restore();
scope.posts = [];
testUtils.teardown(done);
});
@ -44,7 +46,7 @@ describe('Models: listeners', function () {
beforeEach(function (done) {
// will get rescheduled
scope.posts.push(testUtils.DataGenerator.forKnex.createPost({
published_at: scope.publishedAtFutureMoment.toDate(),
published_at: scope.publishedAtFutureMoment1.toDate(),
status: 'scheduled',
title: '1',
slug: '1'
@ -58,10 +60,18 @@ describe('Models: listeners', function () {
slug: '2'
}));
// will get rescheduled
scope.posts.push(testUtils.DataGenerator.forKnex.createPost({
published_at: scope.publishedAtFutureMoment3.toDate(),
status: 'scheduled',
title: '3',
slug: '3'
}));
Promise.all(scope.posts.map(function (post) {
return models.Post.add(post, testUtils.context.owner);
})).then(function (result) {
result.length.should.eql(2);
result.length.should.eql(3);
posts = result;
done();
}).catch(function (err) {
@ -85,11 +95,58 @@ describe('Models: listeners', function () {
}),
post2 = _.find(results.models, function (post) {
return post.get('title') === '2';
}),
post3 = _.find(results.models, function (post) {
return post.get('title') === '3';
});
if (results.models.length === posts.length &&
post1.get('status') === 'scheduled' &&
post2.get('status') === 'draft' &&
moment(post1.get('published_at')).diff(scope.publishedAtFutureMoment.clone().subtract(scope.timezoneOffset, 'minutes')) === 0) {
post3.get('status') === 'scheduled' &&
moment(post1.get('published_at')).diff(scope.publishedAtFutureMoment1.clone().add(scope.timezoneOffset, 'minutes')) === 0 &&
moment(post3.get('published_at')).diff(scope.publishedAtFutureMoment3.clone().add(scope.timezoneOffset, 'minutes')) === 0) {
return done();
}
clearTimeout(timeout);
timeout = setTimeout(retry, 500);
})
.catch(done);
})();
});
it('activeTimezone changes change: from a TZ to UTC', function (done) {
var timeout;
scope.timezoneOffset = -180;
scope.oldTimezone = 'Asia/Baghdad';
scope.newTimezone = 'Etc/UTC';
eventsToRemember['settings.activeTimezone.edited']({
attributes: {value: scope.newTimezone},
_updatedAttributes: {value: scope.oldTimezone}
});
(function retry() {
models.Post.findAll({context: {internal: true}})
.then(function (results) {
var post1 = _.find(results.models, function (post) {
return post.get('title') === '1';
}),
post2 = _.find(results.models, function (post) {
return post.get('title') === '2';
}),
post3 = _.find(results.models, function (post) {
return post.get('title') === '3';
});
if (results.models.length === posts.length &&
post1.get('status') === 'scheduled' &&
post2.get('status') === 'draft' &&
post3.get('status') === 'scheduled' &&
moment(post1.get('published_at')).diff(scope.publishedAtFutureMoment1.clone().add(scope.timezoneOffset, 'minutes')) === 0 &&
moment(post3.get('published_at')).diff(scope.publishedAtFutureMoment3.clone().add(scope.timezoneOffset, 'minutes')) === 0) {
return done();
}