loopback-connector-mysql/test/datetime.test.js

109 lines
3.2 KiB
JavaScript

// Copyright IBM Corp. 2017,2019. All Rights Reserved.
// Node module: loopback-connector-mysql
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
'use strict';
const DateString = require('../node_modules/loopback-datasource-juggler/lib/date-string');
const fmt = require('util').format;
const should = require('./init.js');
let db, Person;
describe('MySQL datetime handling', function() {
const personDefinition = {
name: String,
gender: String,
married: Boolean,
dob: {type: 'DateString'},
createdAt: {type: Date, default: Date},
lastLogon: {type: Date, precision: 3, default: Date},
};
// Modifying the connection timezones mid-flight is a pain,
// but closing the existing connection requires more effort.
function setConnectionTimezones(tz) {
// _allConnections is a Queue in mysql2 library
db.connector.client._allConnections.toArray().forEach(function(con) {
con.config.timezone = tz;
});
}
before(function(done) {
db = global.getSchema({
dateStrings: true,
});
Person = db.define('Person', personDefinition, {forceId: true, strict: true});
db.automigrate(['Person'], done);
});
beforeEach(function() {
setConnectionTimezones('Z');
});
after(function(done) {
Person.destroyAll(function(err) {
db.disconnect(function() {
return done(err);
});
});
});
it('should allow use of DateStrings', () => {
const d = new DateString('1971-06-22');
return Person.create({
name: 'Mr. Pink',
gender: 'M',
dob: d,
createdAt: new Date(),
}).then(function(inst) {
return Person.findById(inst.id);
}).then(function(inst) {
inst.should.not.eql(null);
inst.dob.toString().should.eql(d.toString());
return;
});
});
describe('should allow use of alternate timezone settings', function() {
const d = new Date('1971-06-22T00:00:00.000Z');
testDateTime(d, '+04:00', '1971-06-22 04:00:00');
testDateTime(d, '-04:00', '1971-06-21 20:00:00');
testDateTime(d, '-11:00', '1971-06-21 13:00:00');
testDateTime(d, '+12:00', '1971-06-22 12:00:00');
function testDateTime(date, tz, expected) {
it(tz, function() {
setConnectionTimezones(tz);
db.settings.legacyUtcDateProcessing = false;
db.settings.timezone = tz;
const dt = new Date(date);
return Person.create({
name: 'Mr. Pink',
gender: 'M',
createdAt: dt,
}).then(function(inst) {
return Person.findById(inst.id);
}).then(function(inst) {
inst.should.not.eql(null);
inst.createdAt.toString().should.eql(expected);
});
});
}
});
it('should allow use of fractional seconds', function() {
const d = new Date('1971-06-22T12:34:56.789Z');
return Person.create({
name: 'Mr. Pink',
gender: 'M',
lastLogon: d,
}).then(function(inst) {
return Person.findById(inst.id);
}).then(function(inst) {
inst.should.not.eql(null);
const lastLogon = new Date(inst.lastLogon);
lastLogon.toJSON().should.eql(d.toJSON());
return;
});
});
});