loopback-datasource-juggler/test/normalize-undefined.test.js

298 lines
7.9 KiB
JavaScript

// Copyright IBM Corp. 2017,2019. All Rights Reserved.
// Node module: loopback-datasource-juggler
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
'use strict';
const jdb = require('../');
const DataSource = jdb.DataSource;
const path = require('path');
const fs = require('fs');
const assert = require('assert');
const async = require('async');
const should = require('./init.js');
const Memory = require('../lib/connectors/memory').Memory;
describe('normalizeUndefinedInQuery', function() {
describe('with setting "throw"', function() {
const ds = new DataSource({
connector: 'memory',
normalizeUndefinedInQuery: 'throw',
});
const User = ds.define('User', {
seq: {type: Number, index: true},
name: {type: String, index: true, sort: true},
email: {type: String, index: true},
birthday: {type: Date, index: true},
role: {type: String, index: true},
order: {type: Number, index: true, sort: true},
vip: {type: Boolean},
address: {
street: String,
city: String,
state: String,
zipCode: String,
tags: [
{
tag: String,
},
],
},
friends: [
{
name: String,
},
],
});
before(function(done) {
seed(User, done);
});
it('should throw if find where contains undefined', function(done) {
User.find({where: {name: undefined}}, function(err, users) {
should.exist(err);
done();
});
});
it('should throw if destroyAll where contains undefined', function(done) {
User.destroyAll({name: undefined}, function(err, count) {
should.exist(err);
done();
});
});
it('should throw if updateAll where contains undefined', function(done) {
User.updateAll({name: undefined}, {vip: false}, function(err, count) {
should.exist(err);
done();
});
});
it('should throw if upsertWithWhere where contains undefined', function(done) {
User.upsertWithWhere({name: undefined}, {vip: false}, function(err, count) {
should.exist(err);
done();
});
});
it('should throw if count where contains undefined', function(done) {
User.count({name: undefined}, function(err, count) {
should.exist(err);
done();
});
});
});
describe('with setting "nullify"', function() {
const ds = new DataSource({
connector: 'memory',
});
const User = ds.define('User', {
seq: {type: Number, index: true},
name: {type: String, index: true, sort: true},
email: {type: String, index: true},
birthday: {type: Date, index: true},
role: {type: String, index: true},
order: {type: Number, index: true, sort: true},
vip: {type: Boolean},
address: {
street: String,
city: String,
state: String,
zipCode: String,
tags: [
{
tag: String,
},
],
},
friends: [
{
name: String,
},
],
}, {
normalizeUndefinedInQuery: 'nullify',
});
before(function(done) {
seed(User, done);
});
it('should nullify if find where contains undefined', function(done) {
User.find({where: {role: undefined}}, function(err, users) {
should.not.exist(err);
users.length.should.eql(4);
done();
});
});
it('should nullify if updateAll where contains undefined', function(done) {
User.updateAll({role: undefined}, {vip: false}, function(err, count) {
should.not.exist(err);
count.count.should.eql(4);
done();
});
});
it('should nullify if upsertWithWhere where contains undefined', function(done) {
User.upsertWithWhere({role: undefined, order: 6}, {vip: false}, function(err, user) {
should.not.exist(err);
user.order.should.eql(6);
done();
});
});
it('should nullify if count where contains undefined', function(done) {
User.count({role: undefined}, function(err, count) {
should.not.exist(err);
count.should.eql(4);
done();
});
});
it('should nullify if destroyAll where contains undefined', function(done) {
User.destroyAll({role: undefined}, function(err, count) {
should.not.exist(err);
count.count.should.eql(4);
done();
});
});
});
describe('with setting "ignore"', function() {
const ds = new DataSource({
connector: 'memory',
});
const User = ds.define('User', {
seq: {type: Number, index: true},
name: {type: String, index: true, sort: true},
email: {type: String, index: true},
birthday: {type: Date, index: true},
role: {type: String, index: true},
order: {type: Number, index: true, sort: true},
vip: {type: Boolean},
address: {
street: String,
city: String,
state: String,
zipCode: String,
tags: [
{
tag: String,
},
],
},
friends: [
{
name: String,
},
],
}, {
normalizeUndefinedInQuery: 'ignore',
});
before(function(done) {
seed(User, done);
});
it('should ignore if find where contains undefined', function(done) {
User.find({where: {role: undefined}}, function(err, users) {
should.not.exist(err);
users.length.should.eql(6);
done();
});
});
it('should ignore if updateAll where contains undefined', function(done) {
User.updateAll({role: undefined}, {vip: false}, function(err, count) {
should.not.exist(err);
count.count.should.eql(6);
done();
});
});
it('should ignore if upsertWithWhere where contains undefined', function(done) {
User.upsertWithWhere({role: undefined, order: 6}, {vip: false}, function(err, user) {
should.not.exist(err);
user.order.should.eql(6);
done();
});
});
it('should ignore if count where contains undefined', function(done) {
User.count({role: undefined}, function(err, count) {
should.not.exist(err);
count.should.eql(6);
done();
});
});
it('should ignore if destroyAll where contains undefined', function(done) {
User.destroyAll({role: undefined}, function(err, count) {
should.not.exist(err);
count.count.should.eql(6);
done();
});
});
});
});
function seed(User, done) {
const beatles = [
{
seq: 0,
name: 'John Lennon',
email: 'john@b3atl3s.co.uk',
role: 'lead',
birthday: new Date('1980-12-08'),
vip: true,
address: {
street: '123 A St',
city: 'San Jose',
state: 'CA',
zipCode: '95131',
tags: [{tag: 'business'}, {tag: 'rent'}],
},
friends: [{name: 'Paul McCartney'}, {name: 'George Harrison'}, {name: 'Ringo Starr'}],
children: ['Sean', 'Julian'],
},
{
seq: 1,
name: 'Paul McCartney',
email: 'paul@b3atl3s.co.uk',
role: 'lead',
birthday: new Date('1942-06-18'),
order: 1,
vip: true,
address: {
street: '456 B St',
city: 'San Mateo',
state: 'CA',
zipCode: '94065',
},
friends: [{name: 'John Lennon'}, {name: 'George Harrison'}, {name: 'Ringo Starr'}],
children: ['Stella', 'Mary', 'Heather', 'Beatrice', 'James'],
},
{seq: 2, name: 'George Harrison', role: null, order: 5, vip: false, children: ['Dhani']},
{seq: 3, name: 'Ringo Starr', role: null, order: 6, vip: false},
{seq: 4, name: 'Pete Best', role: null, order: 4, children: []},
{seq: 5, name: 'Stuart Sutcliffe', role: null, order: 3, vip: true},
];
async.series(
[
User.destroyAll.bind(User),
function(cb) {
async.each(beatles, User.create.bind(User), cb);
},
],
done,
);
}