UNPKG

loopback-connector-postgresql

Version:
249 lines (225 loc) 6.93 kB
// Copyright IBM Corp. 2013,2016. All Rights Reserved. // Node module: loopback-connector-postgresql // This file is licensed under the Artistic License 2.0. // License text available at https://opensource.org/licenses/Artistic-2.0 var assert = require('assert'); var ds; before(function () { ds = getDataSource(); }); describe('PostgreSQL connector', function () { it('should auto migrate/update tables', function (done) { var schema_v1 = { "name": "CustomerTest", "options": { "idInjection": false, "postgresql": { "schema": "public", "table": "customer_test" } }, "properties": { "id": { "type": "String", "length": 20, "id": 1 }, "name": { "type": "String", "required": false, "length": 40 }, "email": { "type": "String", "required": true, "length": 40, "index": { "unique": false, "type": "hash" } }, "age": { "type": "Number", "required": false } } } var schema_v2 = { "name": "CustomerTest", "options": { "idInjection": false, "postgresql": { "schema": "public", "table": "customer_test" } }, "properties": { "id": { "type": "String", "length": 20, "id": 1, "index": {"unique": true} }, "email": { "type": "String", "required": false, "length": 60, "postgresql": { "columnName": "email", "dataType": "varchar", "dataLength": 60, "nullable": "YES" }, "index": true }, "firstName": { "type": "String", "required": false, "length": 40, "index": true }, "lastName": { "type": "String", "required": false, "length": 40 } } } ds.createModel(schema_v1.name, schema_v1.properties, schema_v1.options); ds.automigrate(function () { ds.discoverModelProperties('customer_test', function (err, props) { assert.equal(props.length, 4); var names = props.map(function (p) { return p.columnName; }); assert.equal(props[0].nullable, 'NO'); assert.equal(props[1].nullable, 'YES'); assert.equal(props[2].nullable, 'NO'); assert.equal(props[3].nullable, 'YES'); assert.equal(names[0], 'id'); assert.equal(names[1], 'name'); assert.equal(names[2], 'email'); assert.equal(names[3], 'age'); // check indexes ds.connector.discoverModelIndexes('CustomerTest', function (err, indexes) { assert.deepEqual(indexes, { customer_test_email_idx: { table: 'customer_test', type: 'hash', primary: false, unique: false, keys: ['email'], order: ['ASC'] }, customer_test_pkey: { table: 'customer_test', type: 'btree', primary: true, unique: true, keys: ['id'], order: ['ASC'] } }); ds.createModel(schema_v2.name, schema_v2.properties, schema_v2.options); ds.autoupdate(function (err, result) { ds.discoverModelProperties('customer_test', function (err, props) { assert.equal(props.length, 4); var names = props.map(function (p) { return p.columnName; }); assert.equal(names[0], 'id'); assert.equal(names[1], 'email'); assert.equal(names[2], 'firstname'); assert.equal(names[3], 'lastname'); // verify that indexes have been updated ds.connector.discoverModelIndexes('CustomerTest', function (err, indexes) { assert.deepEqual(indexes, { customer_test_pkey: { table: 'customer_test', type: 'btree', primary: true, unique: true, keys: [ 'id' ], order: [ 'ASC' ] }, customer_test_id_idx: { table: 'customer_test', type: 'btree', primary: false, unique: true, keys: [ 'id' ], order: [ 'ASC' ] }, customer_test_email_idx: { table: 'customer_test', type: 'hash', primary: false, unique: false, keys: [ 'email' ], order: [ 'ASC' ] }, customer_test_firstname_idx: { table: 'customer_test', type: 'btree', primary: false, unique: false, keys: [ 'firstname' ], order: [ 'ASC' ] } }); // console.log(err, result); done(err, result); }); }); }); }); }); }); }); it('should report errors for automigrate', function() { ds.automigrate('XYZ', function(err) { assert(err); }); }); it('should report errors for autoupdate', function() { ds.autoupdate('XYZ', function(err) { assert(err); }); }); it('should produce valid sql for setting column nullability', function(done) { // Initial schema var schema_v1 = { "name": "NamePersonTest", "options": { "idInjection": false, "postgresql": { "schema": "public", "table": "name_person_test" } }, "properties": { "id": { "type": "String", "length": 20, "id": 1 }, "name": { "type": "String", "required": false, "length": 40 } } }; // Change nullability var schema_v2 = JSON.parse(JSON.stringify(schema_v1)); schema_v2.properties.name.required = true; // Create initial schema ds.createModel(schema_v1.name, schema_v1.properties, schema_v1.options); ds.automigrate(function () { // Create updated schema ds.createModel(schema_v2.name, schema_v2.properties, schema_v2.options); ds.connector.getTableStatus(schema_v2.name, function (err, actualFields) { var sql = ds.connector.getPropertiesToModify(schema_v2.name, actualFields)[0]; assert.equal(sql, 'ALTER COLUMN "name" SET NOT NULL', 'Check that the SQL is correctly spaced.'); done(); }); }); }); });