From e461787e07b6428523338e113a74338383f48ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Mon, 3 Aug 2020 15:06:25 +0200 Subject: [PATCH] test: add acceptance-level tests for `repository.execute()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miroslav Bajtoš --- acceptance/repository-mongodb/package.json | 1 + .../mongodb-repository-execute.acceptance.ts | 58 +++++++++++++++++++ acceptance/repository-mongodb/tsconfig.json | 3 + acceptance/repository-mysql/package.json | 1 + .../mysql-repository-execute.acceptance.ts | 43 ++++++++++++++ acceptance/repository-mysql/tsconfig.json | 3 + acceptance/repository-postgresql/package.json | 1 + ...ostgresql-repository-execute.acceptance.ts | 45 ++++++++++++++ .../repository-postgresql/tsconfig.json | 3 + 9 files changed, 158 insertions(+) create mode 100644 acceptance/repository-mongodb/src/__tests__/mongodb-repository-execute.acceptance.ts create mode 100644 acceptance/repository-mysql/src/__tests__/mysql-repository-execute.acceptance.ts create mode 100644 acceptance/repository-postgresql/src/__tests__/postgresql-repository-execute.acceptance.ts diff --git a/acceptance/repository-mongodb/package.json b/acceptance/repository-mongodb/package.json index 8c9393b28c90..b255b9ee2efd 100644 --- a/acceptance/repository-mongodb/package.json +++ b/acceptance/repository-mongodb/package.json @@ -24,6 +24,7 @@ "@loopback/eslint-config": "^8.0.4", "@loopback/repository": "^2.10.0", "@loopback/repository-tests": "^0.12.10", + "@loopback/testlab": "^3.2.1", "@types/node": "^10.17.28", "loopback-connector-mongodb": "^5.3.0", "tslib": "^2.0.0" diff --git a/acceptance/repository-mongodb/src/__tests__/mongodb-repository-execute.acceptance.ts b/acceptance/repository-mongodb/src/__tests__/mongodb-repository-execute.acceptance.ts new file mode 100644 index 000000000000..b493a15fdbbc --- /dev/null +++ b/acceptance/repository-mongodb/src/__tests__/mongodb-repository-execute.acceptance.ts @@ -0,0 +1,58 @@ +// Copyright IBM Corp. 2019. All Rights Reserved. +// Node module: @loopback/test-repository-mongodb +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + DefaultTransactionalRepository, + Entity, + juggler, + model, + property, +} from '@loopback/repository'; +import {expect, toJSON} from '@loopback/testlab'; +import {MONGODB_CONFIG} from './mongodb.datasource'; + +describe('MongoDB repository.execute()', () => { + it('executes a custom MongoDB query', async () => { + const db = new juggler.DataSource(MONGODB_CONFIG); + + @model() + class Product extends Entity { + @property({id: true, generated: true}) + id: string; + + @property({required: true}) + name: string; + + @property() + owner: string; + } + + const repo = new DefaultTransactionalRepository( + Product, + db, + ); + await db.automigrate(Product.modelName); + await repo.create({name: 'Pen', owner: 'bajtos'}); + await repo.create({name: 'Car', owner: 'admin'}); + await repo.create({name: 'Chair', owner: 'admin'}); + + // MongoDB's aggregate() command returns an AggregationCursor instance + const cursor = await repo.execute('Product', 'aggregate', [ + { + $group: { + _id: '$owner', + count: {$sum: 1}, + }, + }, + ]); + // Fetch all items from the cursor at once + const result = await cursor.toArray(); + + expect(toJSON(result)).to.deepEqual([ + {_id: 'bajtos', count: 1}, + {_id: 'admin', count: 2}, + ]); + }); +}); diff --git a/acceptance/repository-mongodb/tsconfig.json b/acceptance/repository-mongodb/tsconfig.json index 771d414bef7f..1c7832af7d75 100644 --- a/acceptance/repository-mongodb/tsconfig.json +++ b/acceptance/repository-mongodb/tsconfig.json @@ -15,6 +15,9 @@ }, { "path": "../../packages/repository/tsconfig.json" + }, + { + "path": "../../packages/testlab/tsconfig.json" } ] } diff --git a/acceptance/repository-mysql/package.json b/acceptance/repository-mysql/package.json index 0fc491b11efa..950a443a1eaa 100644 --- a/acceptance/repository-mysql/package.json +++ b/acceptance/repository-mysql/package.json @@ -24,6 +24,7 @@ "@loopback/eslint-config": "^8.0.4", "@loopback/repository": "^2.10.0", "@loopback/repository-tests": "^0.12.10", + "@loopback/testlab": "^3.2.1", "@types/node": "^10.17.28", "loopback-connector-mysql": "^5.4.4", "tslib": "^2.0.0" diff --git a/acceptance/repository-mysql/src/__tests__/mysql-repository-execute.acceptance.ts b/acceptance/repository-mysql/src/__tests__/mysql-repository-execute.acceptance.ts new file mode 100644 index 000000000000..8555d40b6cd0 --- /dev/null +++ b/acceptance/repository-mysql/src/__tests__/mysql-repository-execute.acceptance.ts @@ -0,0 +1,43 @@ +// Copyright IBM Corp. 2019. All Rights Reserved. +// Node module: @loopback/test-repository-mysql +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + DefaultTransactionalRepository, + Entity, + juggler, + model, + property, +} from '@loopback/repository'; +import {expect, toJSON} from '@loopback/testlab'; +import {MYSQL_CONFIG} from './mysql.datasource'; + +describe('MySQL repository.execute()', () => { + it('executes a parameterized native SQL query', async () => { + const db = new juggler.DataSource(MYSQL_CONFIG); + + @model() + class Product extends Entity { + @property({id: true, generated: true}) + id: number; + + @property({required: true}) + name: string; + } + + const repo = new DefaultTransactionalRepository( + Product, + db, + ); + await db.automigrate(Product.modelName); + const pen = await repo.create({name: 'Pen'}); + await repo.create({name: 'Car'}); + + const result = await repo.execute('SELECT * FROM Product WHERE name = ?', [ + 'Pen', + ]); + + expect(toJSON(result)).to.deepEqual([toJSON(pen)]); + }); +}); diff --git a/acceptance/repository-mysql/tsconfig.json b/acceptance/repository-mysql/tsconfig.json index 771d414bef7f..1c7832af7d75 100644 --- a/acceptance/repository-mysql/tsconfig.json +++ b/acceptance/repository-mysql/tsconfig.json @@ -15,6 +15,9 @@ }, { "path": "../../packages/repository/tsconfig.json" + }, + { + "path": "../../packages/testlab/tsconfig.json" } ] } diff --git a/acceptance/repository-postgresql/package.json b/acceptance/repository-postgresql/package.json index 297ef4f4f043..e82d58866c0d 100644 --- a/acceptance/repository-postgresql/package.json +++ b/acceptance/repository-postgresql/package.json @@ -24,6 +24,7 @@ "@loopback/eslint-config": "^8.0.4", "@loopback/repository": "^2.10.0", "@loopback/repository-tests": "^0.12.10", + "@loopback/testlab": "^3.2.1", "@types/node": "^10.17.28", "loopback-connector-postgresql": "^5.0.2", "tslib": "^2.0.0" diff --git a/acceptance/repository-postgresql/src/__tests__/postgresql-repository-execute.acceptance.ts b/acceptance/repository-postgresql/src/__tests__/postgresql-repository-execute.acceptance.ts new file mode 100644 index 000000000000..777e40bf5182 --- /dev/null +++ b/acceptance/repository-postgresql/src/__tests__/postgresql-repository-execute.acceptance.ts @@ -0,0 +1,45 @@ +// Copyright IBM Corp. 2019. All Rights Reserved. +// Node module: @loopback/test-repository-postgresql +// This file is licensed under the MIT License. +// License text available at https://opensource.org/licenses/MIT + +import { + DefaultTransactionalRepository, + Entity, + juggler, + model, + property, +} from '@loopback/repository'; +import {expect, toJSON} from '@loopback/testlab'; +import {POSTGRESQL_CONFIG} from './postgresql.datasource'; + +describe('PostgreSQL repository.execute()', () => { + // FIXME(bajtos) This test passes when executed in isolation, but fails + // on connection timeout when executed after repository-test suite. + it.skip('executes a parameterized native SQL query', async () => { + const db = new juggler.DataSource(POSTGRESQL_CONFIG); + + @model() + class Product extends Entity { + @property({id: true, generated: true}) + id: number; + + @property({required: true}) + name: string; + } + + const repo = new DefaultTransactionalRepository( + Product, + db, + ); + await db.automigrate(Product.modelName); + const pen = await repo.create({name: 'Pen'}); + await repo.create({name: 'Car'}); + + const result = await repo.execute('SELECT * FROM Product WHERE name = $1', [ + 'Pen', + ]); + + expect(toJSON(result)).to.deepEqual([toJSON(pen)]); + }); +}); diff --git a/acceptance/repository-postgresql/tsconfig.json b/acceptance/repository-postgresql/tsconfig.json index 771d414bef7f..1c7832af7d75 100644 --- a/acceptance/repository-postgresql/tsconfig.json +++ b/acceptance/repository-postgresql/tsconfig.json @@ -15,6 +15,9 @@ }, { "path": "../../packages/repository/tsconfig.json" + }, + { + "path": "../../packages/testlab/tsconfig.json" } ] }