Skip to content

Commit

Permalink
Change KnexProvider interface, add helper functions for testing knex
Browse files Browse the repository at this point in the history
  • Loading branch information
nhat-phan committed Jun 23, 2018
1 parent 11a71cf commit eee2434
Show file tree
Hide file tree
Showing 19 changed files with 229 additions and 34 deletions.
8 changes: 6 additions & 2 deletions dist/lib/contracts/KnexProvider.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
declare namespace Najs.Contracts.Eloquent {
interface KnexProvider<QueryBuilder, Config extends object> extends Najs.Contracts.Autoload {
interface KnexProvider<Knex, QueryBuilder, Config extends object> extends Najs.Contracts.Autoload {
/**
* Set default config for knex instance
*/
Expand All @@ -11,6 +11,10 @@ declare namespace Najs.Contracts.Eloquent {
/**
* Create an knex instance
*/
create(table: string, config?: Config): QueryBuilder;
createKnex(config?: Config): Knex;
/**
* Create an knex instance
*/
createQueryBuilder(table: string, config?: Config): QueryBuilder;
}
}
4 changes: 2 additions & 2 deletions dist/lib/facades/global/KnexProviderFacade.d.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/// <reference path="../../contracts/KnexProvider.d.ts" />
import '../../providers/KnexProvider';
import { IFacade, IFacadeBase } from 'najs-facade';
import { QueryBuilder, Config } from 'knex';
export interface IKnexProviderFacade extends Najs.Contracts.Eloquent.KnexProvider<QueryBuilder, Config> {
import * as Knex from 'knex';
export interface IKnexProviderFacade extends Najs.Contracts.Eloquent.KnexProvider<Knex, Knex.QueryBuilder, Knex.Config> {
}
export declare const KnexProviderFacade: IKnexProviderFacade & IFacade;
export declare const KnexProvider: IKnexProviderFacade & IFacadeBase;
6 changes: 4 additions & 2 deletions dist/lib/providers/KnexProvider.d.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
/// <reference path="../contracts/KnexProvider.d.ts" />
import * as Knex from 'knex';
import { Facade } from 'najs-facade';
import { QueryBuilder, Config } from 'knex';
export declare class KnexProvider extends Facade implements Najs.Contracts.Eloquent.KnexProvider<QueryBuilder, Config> {
export declare class KnexProvider extends Facade implements Najs.Contracts.Eloquent.KnexProvider<Knex, QueryBuilder, Config> {
protected config: Config;
getClassName(): string;
setDefaultConfig(config: Config): this;
getDefaultConfig(): Config;
create(table: string, config?: Config): QueryBuilder;
createKnex(config?: Config): Knex;
createQueryBuilder(table: string, config?: Config): QueryBuilder;
}
7 changes: 5 additions & 2 deletions dist/lib/providers/KnexProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ class KnexProvider extends najs_facade_1.Facade {
getDefaultConfig() {
return this.config;
}
create(table, config) {
return Knex(config || this.config)(table);
createKnex(config) {
return Knex(config || this.config);
}
createQueryBuilder(table, config) {
return this.createKnex(config)(table);
}
}
exports.KnexProvider = KnexProvider;
Expand Down
4 changes: 3 additions & 1 deletion dist/lib/query-builders/KnexQueryBuilder.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ export declare class KnexQueryBuilder extends QueryBuilderBase {
deletedAt: string;
};
protected table: string;
protected knex: Knex.QueryBuilder;
protected knexQueryBuilder: Knex.QueryBuilder;
constructor(table: string, primaryKeyName: string, softDelete?: {
deletedAt: string;
});
orderBy(field: string, direction?: string): this;
withTrashed(): this;
onlyTrashed(): this;
}
14 changes: 9 additions & 5 deletions dist/lib/query-builders/KnexQueryBuilder.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,21 @@ class KnexQueryBuilder extends QueryBuilderBase_1.QueryBuilderBase {
this.table = table;
this.primaryKeyName = primaryKeyName;
this.softDelete = softDelete;
this.knex = KnexProviderFacade_1.KnexProvider.create(table);
this.knexQueryBuilder = KnexProviderFacade_1.KnexProvider.createQueryBuilder(table);
}
orderBy(field, direction) {
this.isUsed = true;
this.knex.orderBy(field, direction);
this.knexQueryBuilder.orderBy(field, direction);
return this;
}
withTrashed() {
return this;
}
onlyTrashed() {
return this;
}
}
exports.KnexQueryBuilder = KnexQueryBuilder;
// getPrimaryKeyName orderByAsc orderByDesc
// withTrashed onlyTrashed
const methods = [
// NajsEloquent.QueryBuilder.IBasicQuery
'select',
Expand All @@ -30,7 +34,7 @@ const methods = [
for (const name of methods) {
KnexQueryBuilder.prototype[name] = function () {
this['isUsed'] = true;
this['knex'][name](...arguments);
this['knexQueryBuilder'][name](...arguments);
return this;
};
}
25 changes: 22 additions & 3 deletions dist/test/providers/KnexProvider.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ describe('KnexProvider', function () {
expect(knexProvider.getDefaultConfig() === config).toBe(true);
});
});
describe('.create()', function () {
describe('.createKnex()', function () {
it('calls knex() with default config, then passes table to the result function', function () {
const knexProvider = new KnexProvider_1.KnexProvider();
const config = { client: 'mysql' };
knexProvider.setDefaultConfig(config);
const result = knexProvider.create('table');
const result = knexProvider.createKnex(config)('table');
expect(result['client']['config'] === config).toBe(true);
expect(result.toQuery()).toEqual('select * from `table`');
});
Expand All @@ -41,7 +41,26 @@ describe('KnexProvider', function () {
const defaultConfig = { client: 'mysql' };
knexProvider.setDefaultConfig(defaultConfig);
const config = { client: 'mysql' };
const result = knexProvider.create('table', config);
const result = knexProvider.createKnex(config)('table');
expect(result['client']['config'] === config).toBe(true);
expect(result.toQuery()).toEqual('select * from `table`');
});
});
describe('.createQueryBuilder()', function () {
it('calls knex() with default config, then passes table to the result function', function () {
const knexProvider = new KnexProvider_1.KnexProvider();
const config = { client: 'mysql' };
knexProvider.setDefaultConfig(config);
const result = knexProvider.createQueryBuilder('table');
expect(result['client']['config'] === config).toBe(true);
expect(result.toQuery()).toEqual('select * from `table`');
});
it('calls knex() with passed config, then passes table to the result function', function () {
const knexProvider = new KnexProvider_1.KnexProvider();
const defaultConfig = { client: 'mysql' };
knexProvider.setDefaultConfig(defaultConfig);
const config = { client: 'mysql' };
const result = knexProvider.createQueryBuilder('table', config);
expect(result['client']['config'] === config).toBe(true);
expect(result.toQuery()).toEqual('select * from `table`');
});
Expand Down
1 change: 1 addition & 0 deletions dist/test/query-builders/KnexQueryBuilder.test.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import 'jest';
23 changes: 23 additions & 0 deletions dist/test/query-builders/KnexQueryBuilder.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("jest");
const util_1 = require("../util");
// import { KnexProvider } from '../../lib/facades/global/KnexProviderFacade'
describe('KnexQueryBuilder', function () {
beforeAll(async function () {
return util_1.init_knex('najs_eloquent_knex_query_builder').then(function () {
return util_1.knex_run_sql(`CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(255),
last_name VARCHAR(255),
email VARCHAR(255),
created_at DATETIME,
updated_at DATETIME,
deleted_at DATETIME,
age INT,
PRIMARY KEY (id)
)`);
});
});
it('should work', function () { });
});
2 changes: 2 additions & 0 deletions dist/test/util.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ export declare function init_mongoose(mongoose: any, name: string): Promise<any>
export declare function delete_collection(mongoose: any, collection: string): Promise<any>;
export declare function init_mongodb(name: string): any;
export declare function delete_collection_use_mongodb(name: string): any;
export declare function init_knex(database: string): Promise<any>;
export declare function knex_run_sql(sql: string): Promise<any>;
36 changes: 36 additions & 0 deletions dist/test/util.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const MongodbProviderFacade_1 = require("../lib/facades/global/MongodbProviderFacade");
const KnexProviderFacade_1 = require("../lib/facades/global/KnexProviderFacade");
function init_mongoose(mongoose, name) {
return new Promise(resolve => {
mongoose.connect('mongodb://localhost/najs_eloquent_test_' + name);
Expand All @@ -27,3 +28,38 @@ function delete_collection_use_mongodb(name) {
.drop();
}
exports.delete_collection_use_mongodb = delete_collection_use_mongodb;
function init_knex(database) {
return new Promise(resolve => {
const connection = {
host: '127.0.0.1',
user: 'root',
password: ''
};
KnexProviderFacade_1.KnexProviderFacade.setDefaultConfig({
client: 'mysql',
connection: connection
});
const dropDatabaseSql = `DROP DATABASE IF EXISTS ${database}`;
const createDatabaseSql = `CREATE DATABASE ${database} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin`;
const knex = KnexProviderFacade_1.KnexProviderFacade.createKnex();
knex.raw(dropDatabaseSql).then(function (result) {
knex.raw(createDatabaseSql).then(function (result) {
connection['database'] = database;
KnexProviderFacade_1.KnexProviderFacade.setDefaultConfig({
client: 'mysql',
connection: connection
});
resolve();
});
});
});
}
exports.init_knex = init_knex;
function knex_run_sql(sql) {
return new Promise(resolve => {
KnexProviderFacade_1.KnexProviderFacade.createKnex()
.raw(sql)
.then(resolve);
});
}
exports.knex_run_sql = knex_run_sql;
9 changes: 7 additions & 2 deletions lib/contracts/KnexProvider.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
namespace Najs.Contracts.Eloquent {
export interface KnexProvider<QueryBuilder, Config extends object> extends Najs.Contracts.Autoload {
export interface KnexProvider<Knex, QueryBuilder, Config extends object> extends Najs.Contracts.Autoload {
/**
* Set default config for knex instance
*/
Expand All @@ -13,6 +13,11 @@ namespace Najs.Contracts.Eloquent {
/**
* Create an knex instance
*/
create(table: string, config?: Config): QueryBuilder
createKnex(config?: Config): Knex

/**
* Create an knex instance
*/
createQueryBuilder(table: string, config?: Config): QueryBuilder
}
}
5 changes: 3 additions & 2 deletions lib/facades/global/KnexProviderFacade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import '../../providers/KnexProvider'
import { make } from 'najs-binding'
import { Facade, IFacade, IFacadeBase } from 'najs-facade'
import { container } from '../container'
import { QueryBuilder, Config } from 'knex'
import * as Knex from 'knex'
import { NajsEloquent } from '../../constants'

export interface IKnexProviderFacade extends Najs.Contracts.Eloquent.KnexProvider<QueryBuilder, Config> {}
export interface IKnexProviderFacade
extends Najs.Contracts.Eloquent.KnexProvider<Knex, Knex.QueryBuilder, Knex.Config> {}

const facade = Facade.create<IKnexProviderFacade>(container, 'KnexProvider', function() {
return make<IKnexProviderFacade>(NajsEloquent.Provider.KnexProvider)
Expand Down
10 changes: 7 additions & 3 deletions lib/providers/KnexProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { Facade } from 'najs-facade'
import { QueryBuilder, Config } from 'knex'
import { register } from 'najs-binding'

export class KnexProvider extends Facade implements Najs.Contracts.Eloquent.KnexProvider<QueryBuilder, Config> {
export class KnexProvider extends Facade implements Najs.Contracts.Eloquent.KnexProvider<Knex, QueryBuilder, Config> {
protected config: Config

getClassName() {
Expand All @@ -23,8 +23,12 @@ export class KnexProvider extends Facade implements Najs.Contracts.Eloquent.Knex
return this.config
}

create(table: string, config?: Config): QueryBuilder {
return Knex(config || this.config)(table)
createKnex(config?: Config): Knex {
return Knex(config || this.config)
}

createQueryBuilder(table: string, config?: Config): QueryBuilder {
return this.createKnex(config)(table)
}
}
register(KnexProvider, NajsEloquent.Provider.KnexProvider)
18 changes: 12 additions & 6 deletions lib/query-builders/KnexQueryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,31 @@ export interface KnexQueryBuilder
export class KnexQueryBuilder extends QueryBuilderBase {
protected softDelete?: { deletedAt: string }
protected table: string
protected knex: Knex.QueryBuilder
protected knexQueryBuilder: Knex.QueryBuilder

constructor(table: string, primaryKeyName: string, softDelete?: { deletedAt: string }) {
super()
this.table = table
this.primaryKeyName = primaryKeyName
this.softDelete = softDelete
this.knex = KnexProvider.create(table)
this.knexQueryBuilder = KnexProvider.createQueryBuilder(table)
}

orderBy(field: string, direction?: string): this {
this.isUsed = true
this.knex.orderBy(field, direction)
this.knexQueryBuilder.orderBy(field, direction)
return this
}

withTrashed() {
return this
}

onlyTrashed() {
return this
}
}

// getPrimaryKeyName orderByAsc orderByDesc
// withTrashed onlyTrashed
const methods = [
// NajsEloquent.QueryBuilder.IBasicQuery
'select',
Expand All @@ -42,7 +48,7 @@ const methods = [
for (const name of methods) {
KnexQueryBuilder.prototype[name] = function() {
this['isUsed'] = true
this['knex'][name](...arguments)
this['knexQueryBuilder'][name](...arguments)
return this
}
}
2 changes: 1 addition & 1 deletion script/start-db-by-docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ docker rm -v najs-eloquent-mongo
docker run -p "27017:27017" --name najs-eloquent-mongo -d mongo

docker rm -v najs-eloquent-mariadb
docker run -p "3306:3306" -e MYSQL_ROOT_PASSWORD=root --name najs-eloquent-mariadb -d mariadb
docker run -p "3306:3306" -e MYSQL_ALLOW_EMPTY_PASSWORD=1 --name najs-eloquent-mariadb -d mariadb
28 changes: 25 additions & 3 deletions test/providers/KnexProvider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ describe('KnexProvider', function() {
})
})

describe('.create()', function() {
describe('.createKnex()', function() {
it('calls knex() with default config, then passes table to the result function', function() {
const knexProvider = new KnexProvider()
const config = { client: 'mysql' }
knexProvider.setDefaultConfig(config)
const result = knexProvider.create('table')
const result = knexProvider.createKnex(config)('table')
expect(result['client']['config'] === config).toBe(true)
expect(result.toQuery()).toEqual('select * from `table`')
})
Expand All @@ -45,7 +45,29 @@ describe('KnexProvider', function() {
knexProvider.setDefaultConfig(defaultConfig)

const config = { client: 'mysql' }
const result = knexProvider.create('table', config)
const result = knexProvider.createKnex(config)('table')
expect(result['client']['config'] === config).toBe(true)
expect(result.toQuery()).toEqual('select * from `table`')
})
})

describe('.createQueryBuilder()', function() {
it('calls knex() with default config, then passes table to the result function', function() {
const knexProvider = new KnexProvider()
const config = { client: 'mysql' }
knexProvider.setDefaultConfig(config)
const result = knexProvider.createQueryBuilder('table')
expect(result['client']['config'] === config).toBe(true)
expect(result.toQuery()).toEqual('select * from `table`')
})

it('calls knex() with passed config, then passes table to the result function', function() {
const knexProvider = new KnexProvider()
const defaultConfig = { client: 'mysql' }
knexProvider.setDefaultConfig(defaultConfig)

const config = { client: 'mysql' }
const result = knexProvider.createQueryBuilder('table', config)
expect(result['client']['config'] === config).toBe(true)
expect(result.toQuery()).toEqual('select * from `table`')
})
Expand Down
Loading

0 comments on commit eee2434

Please sign in to comment.