307 lines
12 KiB
JavaScript
307 lines
12 KiB
JavaScript
/*
|
|
Copyright (c) 2014, Oracle and/or its affiliates. All rights
|
|
reserved.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; version 2 of
|
|
the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
02110-1301 USA
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
var lib = require('./lib.js');
|
|
var udebug = unified_debug.getLogger("ProjectionTest.js");
|
|
|
|
var t1 = new harness.ConcurrentTest('t1 ProjectionTest');
|
|
var t2 = new harness.ConcurrentTest('t2 ProjectionTestDefaultNull');
|
|
var t3 = new harness.ConcurrentTest('t3 ProjectionTestDefaultEmptyArray');
|
|
var t4 = new harness.ConcurrentTest('t4 ProjectionTestAddProjectionField');
|
|
var t5 = new harness.ConcurrentTest('t5 ProjectionTestAddProjectionRelationship');
|
|
var t6 = new harness.ConcurrentTest('t6 ProjectionTestManyToMany');
|
|
var t7 = new harness.ConcurrentTest('t7 ProjectionTestManyToManyOtherSide');
|
|
var t8 = new harness.ConcurrentTest('t8 ProjectionTestManyToManyNoResults');
|
|
|
|
var itemProjection = new mynode.Projection(lib.Item);
|
|
itemProjection.addFields('id', 'description');
|
|
itemProjection.name = 'itemProjection';
|
|
var lineItemProjection = new mynode.Projection(lib.LineItem);
|
|
lineItemProjection.addFields('line', ['quantity', 'itemid']);
|
|
lineItemProjection.addRelationship('item', itemProjection);
|
|
lineItemProjection.name = 'lineItemProjection';
|
|
var shoppingCartProjection = new mynode.Projection(lib.ShoppingCart);
|
|
shoppingCartProjection.addFields('id');
|
|
shoppingCartProjection.addRelationship('lineItems', lineItemProjection);
|
|
shoppingCartProjection.name = 'shoppingCartProjection';
|
|
var customerProjection = new mynode.Projection(lib.Customer);
|
|
customerProjection.addFields('id', 'firstName', 'lastName');
|
|
customerProjection.addRelationship('shoppingCart', shoppingCartProjection);
|
|
customerProjection.name = 'customerProjection';
|
|
var discountProjection = new mynode.Projection(lib.Discount);
|
|
discountProjection.addField('id', 'description');
|
|
discountProjection.addRelationship('customers', customerProjection);
|
|
discountProjection.name = 'discountProjection';
|
|
|
|
t1.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var expectedCustomer = new lib.Customer(100, 'Craig', 'Walton');
|
|
var expectedShoppingCart = new lib.ShoppingCart(1000);
|
|
var expectedLineItem0 = lib.createLineItem(0, 1, 10000);
|
|
var expectedLineItem1 = lib.createLineItem(1, 5, 10014);
|
|
var expectedLineItem2 = lib.createLineItem(2, 2, 10011);
|
|
var expectedLineItems = [expectedLineItem0,
|
|
expectedLineItem1,
|
|
expectedLineItem2
|
|
];
|
|
var expectedItem10000 = new lib.Item(10000, 'toothpaste');
|
|
var expectedItem10011 = new lib.Item(10011, 'half and half');
|
|
var expectedItem10014 = new lib.Item(10014, 'holy bible');
|
|
expectedLineItem0.item = expectedItem10000;
|
|
expectedLineItem1.item = expectedItem10014;
|
|
expectedLineItem2.item = expectedItem10011;
|
|
expectedShoppingCart.lineItems = expectedLineItems;
|
|
expectedCustomer.shoppingCart = expectedShoppingCart;
|
|
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// find with projection for customer
|
|
session.find(customerProjection, '100').
|
|
then(function(actualCustomer) {
|
|
lib.verifyProjection(testCase, customerProjection, expectedCustomer, actualCustomer);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
/** Projection test default null mapping.
|
|
* Customer 101 has no shopping cart. */
|
|
t2.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var expectedCustomer = new lib.Customer(101, 'Sam', 'Burton');
|
|
expectedCustomer.shoppingCart = null;
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// find with projection with default null value for shoppingCart
|
|
session.find(customerProjection, '101').
|
|
then(function(actualCustomer) {
|
|
lib.verifyProjection(testCase, customerProjection, expectedCustomer, actualCustomer);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
/** Projection test empty array mapping
|
|
* Shopping cart 1003 has no line items */
|
|
t3.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var expectedShoppingCart = new lib.ShoppingCart(1003);
|
|
expectedShoppingCart.lineItems = [];
|
|
var expectedCustomer = new lib.Customer(103, 'Burn', 'Sexton');
|
|
expectedCustomer.shoppingCart = expectedShoppingCart;
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// find with projection with default null value for shoppingCart
|
|
// shopping cart 1003 has no line items
|
|
session.find(customerProjection, '103').
|
|
then(function(actualCustomer) {
|
|
lib.verifyProjection(testCase, customerProjection, expectedCustomer, actualCustomer);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
/** Projection test add projection field after using the projection in a find
|
|
* Shopping cart 1003 has no line items */
|
|
t4.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var t4customerProjection = new mynode.Projection(lib.Customer);
|
|
t4customerProjection.addFields('id', 'firstName');
|
|
t4customerProjection.name = 't4customerProjection';
|
|
var t4shoppingCartProjection = new mynode.Projection(lib.ShoppingCart);
|
|
t4shoppingCartProjection.addFields('id');
|
|
t4shoppingCartProjection.addRelationship('customer', t4customerProjection);
|
|
t4shoppingCartProjection.name = 't4shoppingCartProjection';
|
|
var expectedShoppingCart = new lib.ShoppingCart(1003);
|
|
var expectedCustomer = new lib.Customer(103, 'Burn');
|
|
var expectedCustomer2 = new lib.Customer(103, 'Burn', 'Sexton');
|
|
expectedShoppingCart.customer = expectedCustomer;
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// find shopping cart with customer projection
|
|
session.find(t4shoppingCartProjection, '1003').
|
|
then(function(actualShoppingCart) {
|
|
lib.verifyProjection(testCase, t4shoppingCartProjection, expectedShoppingCart, actualShoppingCart);
|
|
// add last name to customer projection
|
|
t4customerProjection.addFields('lastName');
|
|
expectedShoppingCart.customer = expectedCustomer2;
|
|
return session.find(t4shoppingCartProjection, 1003);
|
|
}).
|
|
then(function(actualShoppingCart2) {
|
|
lib.verifyProjection(testCase, t4shoppingCartProjection, expectedShoppingCart, actualShoppingCart2);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
/** Projection test add projection relationship after using the projection in a find
|
|
* Shopping cart 1003 has no line items */
|
|
t5.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var customerProjection = new mynode.Projection(lib.Customer);
|
|
customerProjection.addFields('id', 'firstName');
|
|
customerProjection.name = 't5customerProjection';
|
|
var shoppingCartProjection = new mynode.Projection(lib.ShoppingCart);
|
|
shoppingCartProjection.addFields('id');
|
|
shoppingCartProjection.name = 't5shoppingCartProjection';
|
|
var expectedShoppingCart = new lib.ShoppingCart(1003);
|
|
var expectedCustomer = new lib.Customer(103, 'Burn');
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// find shopping cart with customer projection
|
|
session.find(shoppingCartProjection, '1003').
|
|
then(function(actualShoppingCart) {
|
|
lib.verifyProjection(testCase, shoppingCartProjection, expectedShoppingCart, actualShoppingCart);
|
|
// add customer projection to shopping cart projection
|
|
shoppingCartProjection.addRelationship('customer', customerProjection);
|
|
expectedShoppingCart.customer = expectedCustomer;
|
|
return session.find(shoppingCartProjection, 1003);
|
|
}).
|
|
then(function(actualShoppingCart2) {
|
|
lib.verifyProjection(testCase, shoppingCartProjection, expectedShoppingCart, actualShoppingCart2);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
/** Projection test many to many with join table defined on "left side".
|
|
* Shopping cart 1003 has no line items.
|
|
* Customer 101 has no shopping cart. */
|
|
t6.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var expectedShoppingCart1003 = new lib.ShoppingCart(1003);
|
|
expectedShoppingCart1003.lineItems = [];
|
|
var expectedCustomer103 = new lib.Customer(103, 'Burn', 'Sexton');
|
|
var expectedCustomer101 = new lib.Customer(101, 'Sam', 'Burton');
|
|
expectedCustomer103.shoppingCart = expectedShoppingCart1003;
|
|
expectedCustomer101.shoppingCart = null;
|
|
var expectedDiscount = new lib.Discount(3, 'internet special');
|
|
expectedDiscount.customers = [expectedCustomer101, expectedCustomer103];
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// customer 103 has shopping cart 1003 which has no line items
|
|
// customer 101 has no shopping cart
|
|
session.find(discountProjection, '3').
|
|
then(function(actualDiscount) {
|
|
lib.verifyProjection(testCase, discountProjection, expectedDiscount, actualDiscount);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
/** Projection test many to many with join table defined on "other side"
|
|
*/
|
|
t7.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var t7discountProjection = new mynode.Projection(lib.Discount);
|
|
t7discountProjection.addFields('description');
|
|
t7discountProjection.name = 't7discountProjection';
|
|
var t7customerProjection = new mynode.Projection(lib.Customer);
|
|
t7customerProjection.addFields('id', 'firstName', 'lastName');
|
|
t7customerProjection.addRelationship('discounts', t7discountProjection);
|
|
t7customerProjection.name = 't7customerProjection';
|
|
var expectedCustomer101 = new lib.Customer(101, 'Sam', 'Burton');
|
|
var expectedDiscount1 = new lib.Discount(1, 'good customer');
|
|
var expectedDiscount3 = new lib.Discount(3, 'internet special');
|
|
var expectedDiscount4 = new lib.Discount(4, 'closeout');
|
|
expectedCustomer101.discounts = [expectedDiscount1, expectedDiscount3, expectedDiscount4];
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// customer 101 has three discounts
|
|
session.find(t7customerProjection, '101').
|
|
then(function(actualCustomer) {
|
|
lib.verifyProjection(testCase, t7customerProjection, expectedCustomer101, actualCustomer);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
/** Projection test row from primary projection does not exist when mapping many to many
|
|
* Discount code 10 does not exist */
|
|
t8.run = function() {
|
|
var testCase = this;
|
|
var session;
|
|
lib.mapShop();
|
|
|
|
var t8expectedDiscount = null;
|
|
fail_openSession(testCase, function(s) {
|
|
session = s;
|
|
// discount code 10 does not exist
|
|
session.find(discountProjection, 10).
|
|
then(function(actualDiscount) {
|
|
lib.verifyProjection(testCase, customerProjection, t8expectedDiscount, actualDiscount);
|
|
testCase.failOnError();
|
|
}, function(err) {testCase.fail(err);}).
|
|
then(null, function(err) {
|
|
testCase.fail(err);
|
|
});
|
|
});
|
|
};
|
|
|
|
|
|
|
|
exports.tests = [t1, t2, t3, t4, t5, t6, t7, t8];
|