From 0996b52de8679f09ac8f1929860948c55d2ff298 Mon Sep 17 00:00:00 2001 From: "manuel.tais" Date: Tue, 14 Jan 2020 10:40:52 -0300 Subject: [PATCH 1/8] New samples added --- samples/UserRegistraton/user-controller.ts | 62 ++++++++++++++++++++++ samples/models/models.ts | 3 +- samples/server.ts | 13 ++--- samples/test-controller3.ts | 15 ------ samples/{ => test}/test-controller.ts | 11 ++-- samples/{ => test}/test-controller2.ts | 2 +- samples/test/test-controller3.ts | 15 ++++++ samples/{ => test}/test-middlware.ts | 4 +- samples/{ => test}/test-middlware2.ts | 5 +- samples/utils.ts | 14 +++-- tests/authentication.test.ts | 10 ++-- tests/controllers.test.ts | 10 ++-- tests/metadataStorage.test.ts | 10 ++-- 13 files changed, 120 insertions(+), 54 deletions(-) create mode 100644 samples/UserRegistraton/user-controller.ts delete mode 100644 samples/test-controller3.ts rename samples/{ => test}/test-controller.ts (81%) rename samples/{ => test}/test-controller2.ts (95%) create mode 100644 samples/test/test-controller3.ts rename samples/{ => test}/test-middlware.ts (66%) rename samples/{ => test}/test-middlware2.ts (63%) diff --git a/samples/UserRegistraton/user-controller.ts b/samples/UserRegistraton/user-controller.ts new file mode 100644 index 0000000..5bb656a --- /dev/null +++ b/samples/UserRegistraton/user-controller.ts @@ -0,0 +1,62 @@ +import { Get, Post, Put, JsonController, Param, Body, QueryParam, Authorize, HeaderParam, Delete } from '../../src/index'; +import { UserModel } from '../models/models'; +import { isNil } from 'lodash'; +import { Utils } from '../utils'; + +@JsonController('/user') +export class UserController { + constructor() {} + + @Authorize(['Admin']) + @Post('/create') + public create(@Body() user: UserModel) { + user.id = Utils.userList.length + 1; + Utils.userList.push(user); + return user.id; + } + + @Authorize(['Admin']) + @Get('/get/:id') + public getById(@Param('id') id: number) { + var user = Utils.userList.filter(function(obj) { + return obj.id === id; + }); + + return user; + } + + @Authorize(['Admin']) + @Put('/update') + public update(@Body() user: UserModel) { + let userAux = Utils.userList.find(x => x.id == user.id); + let index = Utils.userList.indexOf(userAux); + Utils.userList[index] = user; + return true; + } + + @Authorize() + @Get('/list') + public listAll() { + return Utils.userList; + } + + @Authorize() + @Get('/listFilter') + public listFilter(@QueryParam() params: any) { + if (!isNil(params)) { + var users = Utils.userList.filter(function(obj) { + return obj.name === params.name && obj.age === +params.age; + }); + } + return users; + } + + @Authorize(['Admin']) + @Delete('/delete/:id') + public delete(@Param('id') id: number) { + Utils.userList = Utils.userList.filter(function(obj) { + return obj.id !== id; + }); + return true; + } +} diff --git a/samples/models/models.ts b/samples/models/models.ts index 0b5b335..cf47383 100644 --- a/samples/models/models.ts +++ b/samples/models/models.ts @@ -5,7 +5,8 @@ export class AddressModel { @IsNumber() public number: number; } -export class User { +export class UserModel { + @IsNumber() public id: number; @IsString() public name: string; @IsString() public lastname: string; @IsNumber() public age: number; diff --git a/samples/server.ts b/samples/server.ts index a066625..2970dfb 100644 --- a/samples/server.ts +++ b/samples/server.ts @@ -1,11 +1,12 @@ import { createKiwiServer, IKiwiOptions, AuthorizeResponse } from '../src/index'; -import { TestController3 } from './test-controller3'; -import { TestMiddleware2 } from './test-middlware2'; -import { TestMiddleware } from './test-middlware'; +import { TestController3 } from './test/test-controller3'; +import { TestMiddleware2 } from './test/test-middlware2'; +import { TestMiddleware } from './test/test-middlware'; import * as http from 'http'; import { environment } from './environments/environment'; -import { TestController2 } from './test-controller2'; -import { TestController } from './test-controller'; +import { TestController2 } from './test/test-controller2'; +import { TestController } from './test/test-controller'; +import { UserController } from './UserRegistraton/user-controller'; async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { console.log(roles); @@ -13,7 +14,7 @@ async function validateAuthentication(request: http.IncomingMessage, roles: Arra } const options: IKiwiOptions = { - controllers: [TestController, TestController2, TestController3], + controllers: [TestController, TestController2, TestController3, UserController], authorization: validateAuthentication, middlewares: [TestMiddleware2, TestMiddleware], cors: { diff --git a/samples/test-controller3.ts b/samples/test-controller3.ts deleted file mode 100644 index c1d5027..0000000 --- a/samples/test-controller3.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Get, Post, JsonController, Authorize, Body, Param, QueryParam } from '../src/index'; -import { User } from './models/models'; -import { Utils } from './utils'; - -@JsonController('/user') -export class TestController3 { - constructor(private utils: Utils){ - } - - @Post('/login/:id') - public post(@Body() body: User, @Param('id') id : number){ - return body; - } - -} diff --git a/samples/test-controller.ts b/samples/test/test-controller.ts similarity index 81% rename from samples/test-controller.ts rename to samples/test/test-controller.ts index dd6a8a7..d4ed044 100644 --- a/samples/test-controller.ts +++ b/samples/test/test-controller.ts @@ -1,7 +1,6 @@ -import { Get, Post, JsonController, Param, Body, QueryParam, Authorize, HeaderParam } from '../src/index'; -import { Utils } from './utils'; -import { setInterval } from 'timers'; -import { User } from './models/models'; +import { Get, Post, JsonController, Param, Body, QueryParam, Authorize, HeaderParam } from '../../src/index'; +import { Utils } from '../utils'; +import { UserModel } from '../models/models'; @Authorize(['role1, role2']) @JsonController('/testcontroller') @@ -15,12 +14,12 @@ export class TestController { } @Post('/user') - public nestedArray(@Body() user: User) { + public nestedArray(@Body() user: UserModel) { return ""; } @Get('/queryparam/:id') - public queryparam(@QueryParam() object: User, @Param('id') id: string, @HeaderParam('token1') token1: string, + public queryparam(@QueryParam() object: UserModel, @Param('id') id: string, @HeaderParam('token1') token1: string, @HeaderParam('token2') token2: string) { this.utils.print(); return object; diff --git a/samples/test-controller2.ts b/samples/test/test-controller2.ts similarity index 95% rename from samples/test-controller2.ts rename to samples/test/test-controller2.ts index 1738754..6d71493 100644 --- a/samples/test-controller2.ts +++ b/samples/test/test-controller2.ts @@ -1,4 +1,4 @@ -import { Get, Post, JsonController, Authorize, Body, Param } from '../src/index'; +import { Get, Post, JsonController, Authorize, Body, Param } from '../../src/index'; @JsonController('/testcontroller2') diff --git a/samples/test/test-controller3.ts b/samples/test/test-controller3.ts new file mode 100644 index 0000000..55f30f1 --- /dev/null +++ b/samples/test/test-controller3.ts @@ -0,0 +1,15 @@ +import { Get, Post, JsonController, Authorize, Body, Param, QueryParam } from '../../src/index'; +import { UserModel } from '../models/models'; +import { Utils } from '../utils'; + +@JsonController('/testcontroller3') +export class TestController3 { + constructor(private utils: Utils){ + } + + @Post('/login/:id') + public post(@Body() body: UserModel, @Param('id') id : number){ + return body; + } + +} diff --git a/samples/test-middlware.ts b/samples/test/test-middlware.ts similarity index 66% rename from samples/test-middlware.ts rename to samples/test/test-middlware.ts index ced4338..f21c5b5 100644 --- a/samples/test-middlware.ts +++ b/samples/test/test-middlware.ts @@ -1,5 +1,5 @@ -import { IMiddleware } from '../src/middlewares/middleware'; -import { MiddlewareBefore } from '../src/decorators/middlewareBefore'; +import { IMiddleware } from '../../src/middlewares/middleware'; +import { MiddlewareBefore } from '../../src/decorators/middlewareBefore'; import * as http from 'http'; @MiddlewareBefore(3) diff --git a/samples/test-middlware2.ts b/samples/test/test-middlware2.ts similarity index 63% rename from samples/test-middlware2.ts rename to samples/test/test-middlware2.ts index c306335..8490ca7 100644 --- a/samples/test-middlware2.ts +++ b/samples/test/test-middlware2.ts @@ -1,7 +1,6 @@ -import { IMiddleware } from '../src/middlewares/middleware'; -import { MiddlewareAfter } from '../src/decorators/middlewareAfter'; +import { IMiddleware } from '../../src/middlewares/middleware'; +import { MiddlewareAfter } from '../../src/decorators/middlewareAfter'; import * as http from 'http'; -import { Utils } from './utils'; @MiddlewareAfter(1) export class TestMiddleware2 implements IMiddleware{ diff --git a/samples/utils.ts b/samples/utils.ts index 03466ac..be79bcf 100644 --- a/samples/utils.ts +++ b/samples/utils.ts @@ -1,5 +1,9 @@ -export class Utils{ - public print(){ - //console.log('entre1'); - } -} \ No newline at end of file +import { UserModel } from "./models/models"; + +export class Utils { + public print() { + //console.log('entre1'); + } + + public static userList: Array = []; +} diff --git a/tests/authentication.test.ts b/tests/authentication.test.ts index b286b2f..d75db2d 100644 --- a/tests/authentication.test.ts +++ b/tests/authentication.test.ts @@ -1,11 +1,11 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions, createKiwiServer, processRequest } from '../src/index'; -import { TestController } from '../samples/test-controller'; -import { TestController2 } from '../samples/test-controller2'; -import { TestController3 } from '../samples/test-controller3'; -import { TestMiddleware2 } from '../samples/test-middlware2'; -import { TestMiddleware } from '../samples/test-middlware'; +import { TestController } from '../samples/test/test-controller'; +import { TestController2 } from '../samples/test/test-controller2'; +import { TestController3 } from '../samples/test/test-controller3'; +import { TestMiddleware2 } from '../samples/test/test-middlware2'; +import { TestMiddleware } from '../samples/test/test-middlware'; import { KiwiMetadataStorage } from '../src/metadata/metadataStorage'; import * as http from 'http'; var sinon = require('sinon'); diff --git a/tests/controllers.test.ts b/tests/controllers.test.ts index e912171..554af41 100644 --- a/tests/controllers.test.ts +++ b/tests/controllers.test.ts @@ -1,11 +1,11 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions, createKiwiServer, processRequest } from '../src/index'; -import { TestController } from '../samples/test-controller'; -import { TestController2 } from '../samples/test-controller2'; -import { TestController3 } from '../samples/test-controller3'; -import { TestMiddleware2 } from '../samples/test-middlware2'; -import { TestMiddleware } from '../samples/test-middlware'; +import { TestController } from '../samples/test/test-controller'; +import { TestController2 } from '../samples/test/test-controller2'; +import { TestController3 } from '../samples/test/test-controller3'; +import { TestMiddleware2 } from '../samples/test/test-middlware2'; +import { TestMiddleware } from '../samples/test/test-middlware'; import { KiwiMetadataStorage } from '../src/metadata/metadataStorage'; var httpMocks = require('node-mocks-http'); diff --git a/tests/metadataStorage.test.ts b/tests/metadataStorage.test.ts index eb18758..9b23db9 100644 --- a/tests/metadataStorage.test.ts +++ b/tests/metadataStorage.test.ts @@ -1,11 +1,11 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions } from '../src/index'; -import { TestController } from '../samples/test-controller'; -import { TestController2 } from '../samples/test-controller2'; -import { TestController3 } from '../samples/test-controller3'; -import { TestMiddleware2 } from '../samples/test-middlware2'; -import { TestMiddleware } from '../samples/test-middlware'; +import { TestController } from '../samples/test/test-controller'; +import { TestController2 } from '../samples/test/test-controller2'; +import { TestController3 } from '../samples/test/test-controller3'; +import { TestMiddleware2 } from '../samples/test/test-middlware2'; +import { TestMiddleware } from '../samples/test/test-middlware'; import { KiwiMetadataStorage } from '../src/metadata/metadataStorage'; const options: IKiwiOptions = { From e7fd608acf0be5f99a0e1674722a2235f917346a Mon Sep 17 00:00:00 2001 From: "manuel.tais" Date: Tue, 14 Jan 2020 12:59:42 -0300 Subject: [PATCH 2/8] The file structure is modified --- .vscode/launch.json | 39 +++- samples/middleware/sampleMiddleware.ts | 12 ++ samples/server.ts | 12 +- samples/tests/authentication.test.ts | 59 +++++++ samples/tests/controllers.test.ts | 167 ++++++++++++++++++ {tests => samples/tests}/load.test.js | 0 samples/tests/metadataStorage.test.ts | 72 ++++++++ {tests => samples/tests}/middlewares.test.ts | 6 +- .../user-controller.ts | 0 samples/utils.ts | 4 - .../controllers}/test-controller.ts | 0 .../controllers}/test-controller2.ts | 0 .../controllers}/test-controller3.ts | 0 .../controllers}/test-middlware.ts | 0 .../controllers}/test-middlware2.ts | 0 samples2/environments/environment.prod.ts | 4 + samples2/environments/environment.ts | 4 + samples2/models/models.ts | 14 ++ samples2/server.ts | 31 ++++ .../tests}/authentication.test.ts | 14 +- {tests => samples2/tests}/controllers.test.ts | 14 +- samples2/tests/load.test.js | 28 +++ .../tests}/metadataStorage.test.ts | 14 +- samples2/tests/middlewares.test.ts | 91 ++++++++++ samples2/utils.ts | 7 + 25 files changed, 553 insertions(+), 39 deletions(-) create mode 100644 samples/middleware/sampleMiddleware.ts create mode 100644 samples/tests/authentication.test.ts create mode 100644 samples/tests/controllers.test.ts rename {tests => samples/tests}/load.test.js (100%) create mode 100644 samples/tests/metadataStorage.test.ts rename {tests => samples/tests}/middlewares.test.ts (91%) rename samples/{UserRegistraton => user}/user-controller.ts (100%) rename {samples/test => samples2/controllers}/test-controller.ts (100%) rename {samples/test => samples2/controllers}/test-controller2.ts (100%) rename {samples/test => samples2/controllers}/test-controller3.ts (100%) rename {samples/test => samples2/controllers}/test-middlware.ts (100%) rename {samples/test => samples2/controllers}/test-middlware2.ts (100%) create mode 100644 samples2/environments/environment.prod.ts create mode 100644 samples2/environments/environment.ts create mode 100644 samples2/models/models.ts create mode 100644 samples2/server.ts rename {tests => samples2/tests}/authentication.test.ts (75%) rename {tests => samples2/tests}/controllers.test.ts (88%) create mode 100644 samples2/tests/load.test.js rename {tests => samples2/tests}/metadataStorage.test.ts (79%) create mode 100644 samples2/tests/middlewares.test.ts create mode 100644 samples2/utils.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 88a1d92..5e4582f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ { "type": "node", "request": "launch", - "name": "Mocha Tests", + "name": "Tests samples", "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "args": [ "-u", @@ -15,7 +15,23 @@ "--timeout", "999999", "--colors", - "${workspaceFolder}/dist/tests" + "${workspaceFolder}/dist/samples/tests" + ], + "preLaunchTask": "compile", + "internalConsoleOptions": "openOnSessionStart" + }, + { + "type": "node", + "request": "launch", + "name": "Tests samples2", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "args": [ + "-u", + "tdd", + "--timeout", + "999999", + "--colors", + "${workspaceFolder}/dist/samples2/tests" ], "preLaunchTask": "compile", "internalConsoleOptions": "openOnSessionStart" @@ -24,7 +40,7 @@ "args": [], "cwd": "${workspaceRoot}", "externalConsole": false, - "name": "DEBUG", + "name": "DEBUG samples", "outDir": "${workspaceRoot}/dist", "program": "${workspaceRoot}/dist/samples/server.js", "request": "launch", @@ -37,5 +53,22 @@ "stopOnEntry": false, "type": "node" }, + { + "args": [], + "cwd": "${workspaceRoot}", + "externalConsole": false, + "name": "DEBUG samples 2", + "outDir": "${workspaceRoot}/dist", + "program": "${workspaceRoot}/dist/samples2/server.js", + "request": "launch", + "runtimeArgs": [ + "--nolazy" + ], + "preLaunchTask": "compile", + "runtimeExecutable": null, + "sourceMaps": true, + "stopOnEntry": false, + "type": "node" + }, ] } diff --git a/samples/middleware/sampleMiddleware.ts b/samples/middleware/sampleMiddleware.ts new file mode 100644 index 0000000..a2a5664 --- /dev/null +++ b/samples/middleware/sampleMiddleware.ts @@ -0,0 +1,12 @@ +import { IMiddleware } from '../../src/middlewares/middleware'; +import { MiddlewareAfter } from '../../src/decorators/middlewareAfter'; +import * as http from 'http'; + +@MiddlewareAfter(1) +export class SampleMiddleware implements IMiddleware{ + + execute(request: http.IncomingMessage, response: http.ServerResponse, next: any){ + response.setHeader( 'Authorization', 'auth' ); + next(); + } +} \ No newline at end of file diff --git a/samples/server.ts b/samples/server.ts index 2970dfb..0059f01 100644 --- a/samples/server.ts +++ b/samples/server.ts @@ -1,12 +1,8 @@ import { createKiwiServer, IKiwiOptions, AuthorizeResponse } from '../src/index'; -import { TestController3 } from './test/test-controller3'; -import { TestMiddleware2 } from './test/test-middlware2'; -import { TestMiddleware } from './test/test-middlware'; import * as http from 'http'; import { environment } from './environments/environment'; -import { TestController2 } from './test/test-controller2'; -import { TestController } from './test/test-controller'; -import { UserController } from './UserRegistraton/user-controller'; +import { UserController } from './user/user-controller'; +import { SampleMiddleware } from './middleware/sampleMiddleware'; async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { console.log(roles); @@ -14,9 +10,9 @@ async function validateAuthentication(request: http.IncomingMessage, roles: Arra } const options: IKiwiOptions = { - controllers: [TestController, TestController2, TestController3, UserController], + controllers: [UserController], authorization: validateAuthentication, - middlewares: [TestMiddleware2, TestMiddleware], + middlewares: [SampleMiddleware], cors: { enabled: true, domains: environment.domains diff --git a/samples/tests/authentication.test.ts b/samples/tests/authentication.test.ts new file mode 100644 index 0000000..0af4346 --- /dev/null +++ b/samples/tests/authentication.test.ts @@ -0,0 +1,59 @@ +import { suite, test } from "mocha-typescript"; +import { assert } from 'chai'; +import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; +import { UserController } from '../user/user-controller'; +import { SampleMiddleware } from '../middleware/sampleMiddleware'; +import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; +import * as http from 'http'; +var sinon = require('sinon'); +var httpMocks = require('node-mocks-http'); + +var callback = sinon.spy(); + +var options: IKiwiOptions = { + controllers: [UserController], + authorization: function(request: http.IncomingMessage, roles: Array){ + callback(); + return true; + }, + middlewares: [SampleMiddleware], + cors: { + enabled: true + }, + documentation: { + enabled: true, + path: '/apidoc' + }, + log: true, + port: 8086, + prefix: '/v1' +} + +@suite class AuthenticationSuite { + static before() { + KiwiMetadataStorage.init(options); + } + + before() { + } + + // @test async 'It must call validateAuthentication method'() { + // var request = httpMocks.createRequest({ + // method: 'GET', + // url: `/v1/testcontroller2/getAction` + // }); + + // var response = httpMocks.createResponse(); + // await processRequest(request, response); + // assert.equal(response.statusCode, 200); + // assert.isTrue(callback.calledOnce); + // } + + static after() { + + } + + after() { + + } +} \ No newline at end of file diff --git a/samples/tests/controllers.test.ts b/samples/tests/controllers.test.ts new file mode 100644 index 0000000..e0a41ae --- /dev/null +++ b/samples/tests/controllers.test.ts @@ -0,0 +1,167 @@ +import { suite, test } from 'mocha-typescript'; +import { assert } from 'chai'; +import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; +import { UserController } from '../user/user-controller'; +import { SampleMiddleware } from '../middleware/sampleMiddleware'; +import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; +var httpMocks = require('node-mocks-http'); + +const options: IKiwiOptions = { + controllers: [UserController], + authorization: null, + middlewares: [SampleMiddleware], + cors: { + enabled: true, + domains: ['localhost:8086'] + }, + documentation: { + enabled: true, + path: '/apidoc' + }, + log: true, + port: 8086, + prefix: '/v1' +}; + +@suite class UserControllersSuite { + static before() { + KiwiMetadataStorage.init(options); + } + + before() {} + + @test async 'It must return 1'() { + const body = { + name: 'NewUser', + lastname: 'NewUser', + age: 33, + address: [ + { + street: 'user street', + number: 2213 + } + ] + }; + var request = httpMocks.createRequest({ + method: 'POST', + url: '/v1/usercontroller/create', + headers: { + 'content-type': 'application/json' + } + }); + var response = httpMocks.createResponse({ + eventEmitter: require('events').EventEmitter + }); + + setImmediate(() => request.send(JSON.stringify(body))); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(data.name, body.name); + } + + @test async 'It must return the param 1'() { + const body = { + name: 'UserModifyed', + lastname: 'UserModifyed', + age: 33, + address: [ + { + street: 'user street', + number: 2213 + } + ] + }; + var request = httpMocks.createRequest({ + method: 'PUT', + url: `/v1/usercontroller/update/` + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(response.statusCode, 200); + assert.equal(data.name, body.name); + } + + // @test async 'It must return 404 http error'() { + // var request = httpMocks.createRequest({ + // method: 'GET', + // url: '/v1/testcontroller/queryparadsdm/1' + // }); + + // var response = httpMocks.createResponse(); + // await processRequest(request, response); + // var data = response._getData(); + // assert.equal(response.statusCode, 404); + // assert.equal(data, 'Method doesnt match'); + // } + + @test async 'It must get'() { + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/usercontroller/get/1' + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(response.statusCode, 200); + assert.equal(data.name, 'UserModifyed'); + } + + // @test async 'It must create an object with query params values as properies'() { + // var request = httpMocks.createRequest({ + // method: 'GET', + // url: '/v1/usercontroller/queryparam/1?name=guille' + // }); + + // var response = httpMocks.createResponse(); + // await processRequest(request, response); + // var data = JSON.parse(response._getData()); + // assert.equal(response.statusCode, 200); + // assert.equal(data.name, 'guille'); + // } + + // @test async 'It must add two header params'() { + // const h1 = 'header1'; + // const h2 = 'header2'; + // var request = httpMocks.createRequest({ + // method: 'GET', + // url: '/v1/testcontroller/testHeaders', + // headers: { + // h1: h1, + // h2: h2 + // } + // }); + + // var response = httpMocks.createResponse(); + // await processRequest(request, response); + // var data = JSON.parse(response._getData()); + // assert.equal(response.statusCode, 200); + // assert.equal(data.h1, h1); + // assert.equal(data.h2, h2); + // } + + // @test async 'It mus parse body'() { + // const body = { name: 'kiwi' }; + // var request = httpMocks.createRequest({ + // method: 'POST', + // url: '/v1/testcontroller/test123', + // headers: { + // 'content-type': 'application/json' + // } + // }); + // var response = httpMocks.createResponse({ + // eventEmitter: require('events').EventEmitter + // }); + + // setImmediate(() => request.send(JSON.stringify(body))); + // await processRequest(request, response); + // var data = JSON.parse(response._getData()); + // assert.equal(data.name, body.name); + // } + + static after() {} + + after() {} +} diff --git a/tests/load.test.js b/samples/tests/load.test.js similarity index 100% rename from tests/load.test.js rename to samples/tests/load.test.js diff --git a/samples/tests/metadataStorage.test.ts b/samples/tests/metadataStorage.test.ts new file mode 100644 index 0000000..fd8ce28 --- /dev/null +++ b/samples/tests/metadataStorage.test.ts @@ -0,0 +1,72 @@ +import { suite, test } from 'mocha-typescript'; +import { assert } from 'chai'; +import { IKiwiOptions } from '../../src/index'; +import { UserController } from '../user/user-controller'; +import { SampleMiddleware } from '../middleware/sampleMiddleware'; +import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; + +const options: IKiwiOptions = { + controllers: [UserController], + authorization: null, + middlewares: [SampleMiddleware], + cors: { + enabled: true + }, + documentation: { + enabled: true, + path: '/apidoc' + }, + log: true, + port: 8086, + prefix: '/v1' +}; + +/* +describe("Metadata storage test", () => { + it("it must create metadata for server", () => { + KiwiMetadataStorage.init(options); + assert.equal(9, Object.keys(KiwiMetadataStorage.routes).length); + }); + + it("it must match route", () => { + KiwiMetadataStorage.init(options); + const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); + assert.isNotNull(match); + }); +}); +*/ + +@suite +class KiwiMetadataStorageSuite { + static before() { + KiwiMetadataStorage.init(options); + } + + before() {} + + @test 'It must exist 11 routes'() { + assert.equal(11, Object.keys(KiwiMetadataStorage.routes).length); + } + + @test 'it must match route'() { + const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); + assert.isNotNull(match); + } + + @test 'it doesn`t must match route'() { + const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1/2', 'get'); + assert.isNull(match); + } + + @test 'it must exist one middleware after'() { + assert.equal(1, KiwiMetadataStorage.middlewaresAfter.length); + } + + @test 'it must exist one middleware before'() { + assert.equal(1, KiwiMetadataStorage.middlewaresBefore.length); + } + + static after() {} + + after() {} +} diff --git a/tests/middlewares.test.ts b/samples/tests/middlewares.test.ts similarity index 91% rename from tests/middlewares.test.ts rename to samples/tests/middlewares.test.ts index 70a7b94..a575e49 100644 --- a/tests/middlewares.test.ts +++ b/samples/tests/middlewares.test.ts @@ -1,8 +1,8 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; -import { CorsMiddleware } from '../src/middlewares/corsMiddlware'; -import { LogMiddleware } from '../src/middlewares/logMiddlware'; -import { DocMiddleware } from '../src/middlewares/docMiddleware'; +import { CorsMiddleware } from '../../src/middlewares/corsMiddlware'; +import { LogMiddleware } from '../../src/middlewares/logMiddlware'; +import { DocMiddleware } from '../../src/middlewares/docMiddleware'; var httpMocks = require('node-mocks-http'); var sinon = require('sinon'); diff --git a/samples/UserRegistraton/user-controller.ts b/samples/user/user-controller.ts similarity index 100% rename from samples/UserRegistraton/user-controller.ts rename to samples/user/user-controller.ts diff --git a/samples/utils.ts b/samples/utils.ts index be79bcf..17a1340 100644 --- a/samples/utils.ts +++ b/samples/utils.ts @@ -1,9 +1,5 @@ import { UserModel } from "./models/models"; export class Utils { - public print() { - //console.log('entre1'); - } - public static userList: Array = []; } diff --git a/samples/test/test-controller.ts b/samples2/controllers/test-controller.ts similarity index 100% rename from samples/test/test-controller.ts rename to samples2/controllers/test-controller.ts diff --git a/samples/test/test-controller2.ts b/samples2/controllers/test-controller2.ts similarity index 100% rename from samples/test/test-controller2.ts rename to samples2/controllers/test-controller2.ts diff --git a/samples/test/test-controller3.ts b/samples2/controllers/test-controller3.ts similarity index 100% rename from samples/test/test-controller3.ts rename to samples2/controllers/test-controller3.ts diff --git a/samples/test/test-middlware.ts b/samples2/controllers/test-middlware.ts similarity index 100% rename from samples/test/test-middlware.ts rename to samples2/controllers/test-middlware.ts diff --git a/samples/test/test-middlware2.ts b/samples2/controllers/test-middlware2.ts similarity index 100% rename from samples/test/test-middlware2.ts rename to samples2/controllers/test-middlware2.ts diff --git a/samples2/environments/environment.prod.ts b/samples2/environments/environment.prod.ts new file mode 100644 index 0000000..4053b1f --- /dev/null +++ b/samples2/environments/environment.prod.ts @@ -0,0 +1,4 @@ + +export const environment = { + name: 'prod' +} \ No newline at end of file diff --git a/samples2/environments/environment.ts b/samples2/environments/environment.ts new file mode 100644 index 0000000..2cf6d65 --- /dev/null +++ b/samples2/environments/environment.ts @@ -0,0 +1,4 @@ +export const environment = { + name: 'local', + domains: ['http://localhosts:4200', 'http://localhosts:4201'] +} \ No newline at end of file diff --git a/samples2/models/models.ts b/samples2/models/models.ts new file mode 100644 index 0000000..cf47383 --- /dev/null +++ b/samples2/models/models.ts @@ -0,0 +1,14 @@ +import { IsString, IsNumber, IsArray } from '../../src/index' + +export class AddressModel { + @IsString() public street: string; + @IsNumber() public number: number; +} + +export class UserModel { + @IsNumber() public id: number; + @IsString() public name: string; + @IsString() public lastname: string; + @IsNumber() public age: number; + @IsArray(() => AddressModel) public address: AddressModel[]; +} diff --git a/samples2/server.ts b/samples2/server.ts new file mode 100644 index 0000000..8f1225b --- /dev/null +++ b/samples2/server.ts @@ -0,0 +1,31 @@ +import { createKiwiServer, IKiwiOptions, AuthorizeResponse } from '../src/index'; +import { TestController3 } from './test/test-controller3'; +import { TestMiddleware2 } from './test/test-middlware2'; +import { TestMiddleware } from './test/test-middlware'; +import * as http from 'http'; +import { environment } from './environments/environment'; +import { TestController2 } from './test/test-controller2'; +import { TestController } from './test/test-controller'; + +async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { + console.log(roles); + return true; +} + +const options: IKiwiOptions = { + controllers: [TestController, TestController2, TestController3], + authorization: validateAuthentication, + middlewares: [TestMiddleware2, TestMiddleware], + cors: { + enabled: true, + domains: environment.domains + }, + documentation: { + enabled: true, + path: '/apidoc' + }, + log: true, + port: 8086, + prefix: '/v1' +}; +const server = createKiwiServer(options, null); diff --git a/tests/authentication.test.ts b/samples2/tests/authentication.test.ts similarity index 75% rename from tests/authentication.test.ts rename to samples2/tests/authentication.test.ts index d75db2d..84d0802 100644 --- a/tests/authentication.test.ts +++ b/samples2/tests/authentication.test.ts @@ -1,12 +1,12 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; -import { IKiwiOptions, createKiwiServer, processRequest } from '../src/index'; -import { TestController } from '../samples/test/test-controller'; -import { TestController2 } from '../samples/test/test-controller2'; -import { TestController3 } from '../samples/test/test-controller3'; -import { TestMiddleware2 } from '../samples/test/test-middlware2'; -import { TestMiddleware } from '../samples/test/test-middlware'; -import { KiwiMetadataStorage } from '../src/metadata/metadataStorage'; +import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; +import { TestController } from '../test/test-controller'; +import { TestController2 } from '../test/test-controller2'; +import { TestController3 } from '../test/test-controller3'; +import { TestMiddleware2 } from '../test/test-middlware2'; +import { TestMiddleware } from '../test/test-middlware'; +import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; import * as http from 'http'; var sinon = require('sinon'); var httpMocks = require('node-mocks-http'); diff --git a/tests/controllers.test.ts b/samples2/tests/controllers.test.ts similarity index 88% rename from tests/controllers.test.ts rename to samples2/tests/controllers.test.ts index 554af41..a762a4d 100644 --- a/tests/controllers.test.ts +++ b/samples2/tests/controllers.test.ts @@ -1,12 +1,12 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; -import { IKiwiOptions, createKiwiServer, processRequest } from '../src/index'; -import { TestController } from '../samples/test/test-controller'; -import { TestController2 } from '../samples/test/test-controller2'; -import { TestController3 } from '../samples/test/test-controller3'; -import { TestMiddleware2 } from '../samples/test/test-middlware2'; -import { TestMiddleware } from '../samples/test/test-middlware'; -import { KiwiMetadataStorage } from '../src/metadata/metadataStorage'; +import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; +import { TestController } from '../controllers/test-controller'; +import { TestController2 } from '../controllers/test-controller2'; +import { TestController3 } from '../controllers/test-controller3'; +import { TestMiddleware2 } from '../controllers/test-middlware2'; +import { TestMiddleware } from '../controllers/test-middlware'; +import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; var httpMocks = require('node-mocks-http'); const options: IKiwiOptions = { diff --git a/samples2/tests/load.test.js b/samples2/tests/load.test.js new file mode 100644 index 0000000..d33f165 --- /dev/null +++ b/samples2/tests/load.test.js @@ -0,0 +1,28 @@ +const loadtest = require('loadtest'); + +const options = { + url: 'http://localhost:8086', + concurrent: 5, + method: 'POST', + body:'', + requestsPerSecond:5, + maxSeconds: 30, + requestGenerator: (params, options, client, callback) => { + const message = '{"name": "guille"}'; + options.headers['Content-Length'] = message.length; + options.headers['Content-Type'] = 'application/json'; + options.body = ''; + options.path = '/v1/testcontroller/postAction/1'; + const request = client(options, callback); + request.write(message); + return request; + } +}; + +loadtest.loadTest(options, (error, results) => { + if (error) { + return console.error('Got an error: %s', error); + } + console.log(results); + console.log('Tests run successfully'); +}); diff --git a/tests/metadataStorage.test.ts b/samples2/tests/metadataStorage.test.ts similarity index 79% rename from tests/metadataStorage.test.ts rename to samples2/tests/metadataStorage.test.ts index 9b23db9..08e04b8 100644 --- a/tests/metadataStorage.test.ts +++ b/samples2/tests/metadataStorage.test.ts @@ -1,12 +1,12 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; -import { IKiwiOptions } from '../src/index'; -import { TestController } from '../samples/test/test-controller'; -import { TestController2 } from '../samples/test/test-controller2'; -import { TestController3 } from '../samples/test/test-controller3'; -import { TestMiddleware2 } from '../samples/test/test-middlware2'; -import { TestMiddleware } from '../samples/test/test-middlware'; -import { KiwiMetadataStorage } from '../src/metadata/metadataStorage'; +import { IKiwiOptions } from '../../src/index'; +import { TestController } from '../test/test-controller'; +import { TestController2 } from '../test/test-controller2'; +import { TestController3 } from '../test/test-controller3'; +import { TestMiddleware2 } from '../test/test-middlware2'; +import { TestMiddleware } from '../test/test-middlware'; +import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; const options: IKiwiOptions = { controllers: [TestController, TestController2, TestController3], diff --git a/samples2/tests/middlewares.test.ts b/samples2/tests/middlewares.test.ts new file mode 100644 index 0000000..a575e49 --- /dev/null +++ b/samples2/tests/middlewares.test.ts @@ -0,0 +1,91 @@ +import { suite, test } from "mocha-typescript"; +import { assert } from 'chai'; +import { CorsMiddleware } from '../../src/middlewares/corsMiddlware'; +import { LogMiddleware } from '../../src/middlewares/logMiddlware'; +import { DocMiddleware } from '../../src/middlewares/docMiddleware'; +var httpMocks = require('node-mocks-http'); +var sinon = require('sinon'); + + +@suite class MIddlewaresSuite { + static before() { + (global as any).options = { + cors: { domains: ['test'] }, + prefix: '/v1', + documentation: { + path: "/apidoc" + } + }; + } + + before() { + + } + + @test 'It must execute cors middleware for options'() { + const corsMiddleware = new CorsMiddleware(); + const param = 'pepe'; + var request = httpMocks.createRequest({ + method: 'OPTIONS', + url: `/v1/testcontroller/testinguy/${param}` + }); + var response = httpMocks.createResponse(); + response.getHeaders = function () { + return {}; + }; + corsMiddleware.execute(request, response, null); + assert.equal(response.statusCode, 204); + } + + @test 'It must execute cors middleware for post'() { + const corsMiddleware = new CorsMiddleware(); + const param = 'pepe'; + var request = httpMocks.createRequest({ + method: 'POST', + url: `/v1/testcontroller/testinguy/${param}` + }); + var response = httpMocks.createResponse(); + response.getHeaders = function () { + return {}; + }; + var next = sinon.spy(); + corsMiddleware.execute(request, response, next); + assert.isTrue(next.calledOnce); + } + + @test 'It must execute log middleware'() { + const middleware = new LogMiddleware(); + const param = 'pepe'; + var request = httpMocks.createRequest({ + method: 'POST', + url: `/v1/testcontroller/testinguy/${param}` + }); + var response = httpMocks.createResponse(); + response.getHeaders = function () { + return {}; + }; + var next = sinon.spy(); + middleware.execute(request, response, next); + assert.isTrue(next.calledOnce); + } + + @test 'It must execute doc middleware for post'() { + const middleware = new DocMiddleware(); + var request = httpMocks.createRequest({ + method: 'POST', + url: `/v1/apidoc` + }); + var response = httpMocks.createResponse(); + var next = sinon.spy(); + middleware.execute(request, response, next); + assert.equal(response.statusCode, 200); + } + + static after() { + + } + + after() { + + } +} diff --git a/samples2/utils.ts b/samples2/utils.ts new file mode 100644 index 0000000..3c58c21 --- /dev/null +++ b/samples2/utils.ts @@ -0,0 +1,7 @@ +import { UserModel } from "./models/models"; + +export class Utils { + public print() { + //console.log('entre1'); + } +} From bc30a8e8346218fbd8a4e07ccfe58a64ce466870 Mon Sep 17 00:00:00 2001 From: "manuel.tais" Date: Tue, 14 Jan 2020 16:43:06 -0300 Subject: [PATCH 3/8] New tests added --- package.json | 6 +++--- samples/tests/controllers.test.ts | 1 + samples/user/user-controller.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index e4b08da..e421317 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "class-validator": "^0.8.5", "class-validator-jsonschema": "^1.2.0", "fs": "0.0.1-security", - "lodash": "^4.17.10", + "lodash": "^4.17.15", "mocha": "^5.2.0", "reflect-metadata": "^0.1.12", "socket.io": "^2.1.1", @@ -47,7 +47,7 @@ "@types/node": "^10.3.4", "chai": "^4.2.0", "coveralls": "^3.0.4", - "gulp": "^3.9.1", + "gulp": "^4.0.2", "gulp-exec": "^3.0.2", "gulp-mocha": "^6.0.0", "gulp-sequence": "^1.0.0", @@ -56,7 +56,7 @@ "loadtest": "^3.0.3", "mocha-typescript": "^1.1.17", "node-mocks-http": "^1.7.3", - "nyc": "^13.1.0", + "nyc": "^15.0.0", "sinon": "^7.1.1", "source-map-support": "^0.5.9", "typescript": "^2.9.2" diff --git a/samples/tests/controllers.test.ts b/samples/tests/controllers.test.ts index e0a41ae..b85ed68 100644 --- a/samples/tests/controllers.test.ts +++ b/samples/tests/controllers.test.ts @@ -55,6 +55,7 @@ const options: IKiwiOptions = { setImmediate(() => request.send(JSON.stringify(body))); await processRequest(request, response); + assert.equal(response.statusCode, 200); var data = JSON.parse(response._getData()); assert.equal(data.name, body.name); } diff --git a/samples/user/user-controller.ts b/samples/user/user-controller.ts index 5bb656a..e384649 100644 --- a/samples/user/user-controller.ts +++ b/samples/user/user-controller.ts @@ -12,7 +12,7 @@ export class UserController { public create(@Body() user: UserModel) { user.id = Utils.userList.length + 1; Utils.userList.push(user); - return user.id; + return user; } @Authorize(['Admin']) From 2565ae1e355efb6b876fcd945292f9d093ddce74 Mon Sep 17 00:00:00 2001 From: Guillermo Fernandez Date: Tue, 14 Jan 2020 17:22:50 -0300 Subject: [PATCH 4/8] fix tests sample2 --- .gitignore | 3 +++ gulpfile.js | 2 +- package.json | 2 +- samples/tests/controllers.test.ts | 2 +- .../{controllers => middlewares}/test-middlware.ts | 0 .../{controllers => middlewares}/test-middlware2.ts | 6 +++--- samples2/server.ts | 10 +++++----- samples2/tests/authentication.test.ts | 12 ++++++------ samples2/tests/controllers.test.ts | 6 +++--- samples2/tests/metadataStorage.test.ts | 10 +++++----- tsconfig.json | 3 ++- 11 files changed, 30 insertions(+), 26 deletions(-) rename samples2/{controllers => middlewares}/test-middlware.ts (100%) rename samples2/{controllers => middlewares}/test-middlware2.ts (96%) diff --git a/.gitignore b/.gitignore index 6d43ade..a52b035 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ release/ yarn-error.log .nyc_output/ swagger.json +src/**/*.map +src/**/*.js + diff --git a/gulpfile.js b/gulpfile.js index 8bb3420..572cfb3 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -34,7 +34,7 @@ gulp.task('copy', () => { }); gulp.task('execute-tests', function () { - return gulp.src(['dist/tests/*.test.js'], { read: false }) + return gulp.src(['dist/samples2/tests/*.test.js'], { read: false }) .pipe(mocha({ reporter: 'spec' })); diff --git a/package.json b/package.json index e421317..baf1c95 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "compile": "tsc", "test-load": "node ./tests/load.test.js", - "test": "tsc && nyc mocha ./dist/tests && nyc report --reporter=text-lcov | coveralls" + "test": "tsc && nyc mocha ./dist/samples2/tests && nyc report --reporter=text-lcov | coveralls" }, "repository": { "type": "git", diff --git a/samples/tests/controllers.test.ts b/samples/tests/controllers.test.ts index b85ed68..c5efd11 100644 --- a/samples/tests/controllers.test.ts +++ b/samples/tests/controllers.test.ts @@ -44,7 +44,7 @@ const options: IKiwiOptions = { }; var request = httpMocks.createRequest({ method: 'POST', - url: '/v1/usercontroller/create', + url: '/v1/user/create', headers: { 'content-type': 'application/json' } diff --git a/samples2/controllers/test-middlware.ts b/samples2/middlewares/test-middlware.ts similarity index 100% rename from samples2/controllers/test-middlware.ts rename to samples2/middlewares/test-middlware.ts diff --git a/samples2/controllers/test-middlware2.ts b/samples2/middlewares/test-middlware2.ts similarity index 96% rename from samples2/controllers/test-middlware2.ts rename to samples2/middlewares/test-middlware2.ts index 8490ca7..8274c2b 100644 --- a/samples2/controllers/test-middlware2.ts +++ b/samples2/middlewares/test-middlware2.ts @@ -4,10 +4,10 @@ import * as http from 'http'; @MiddlewareAfter(1) export class TestMiddleware2 implements IMiddleware{ - + execute(request: http.IncomingMessage, response: http.ServerResponse, next: any){ response.setHeader( 'Authorization2', 'hola2' ); - + next(); } -} \ No newline at end of file +} diff --git a/samples2/server.ts b/samples2/server.ts index 8f1225b..a5e57cc 100644 --- a/samples2/server.ts +++ b/samples2/server.ts @@ -1,11 +1,11 @@ import { createKiwiServer, IKiwiOptions, AuthorizeResponse } from '../src/index'; -import { TestController3 } from './test/test-controller3'; -import { TestMiddleware2 } from './test/test-middlware2'; -import { TestMiddleware } from './test/test-middlware'; +import { TestController2 } from './controllers/test-controller2'; +import { TestController3 } from './controllers/test-controller3'; +import { TestController } from './controllers/test-controller'; +import { TestMiddleware } from './middlewares/test-middlware'; +import { TestMiddleware2 } from './middlewares/test-middlware2'; import * as http from 'http'; import { environment } from './environments/environment'; -import { TestController2 } from './test/test-controller2'; -import { TestController } from './test/test-controller'; async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { console.log(roles); diff --git a/samples2/tests/authentication.test.ts b/samples2/tests/authentication.test.ts index 84d0802..0cfcbfd 100644 --- a/samples2/tests/authentication.test.ts +++ b/samples2/tests/authentication.test.ts @@ -1,11 +1,11 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; -import { TestController } from '../test/test-controller'; -import { TestController2 } from '../test/test-controller2'; -import { TestController3 } from '../test/test-controller3'; -import { TestMiddleware2 } from '../test/test-middlware2'; -import { TestMiddleware } from '../test/test-middlware'; +import { TestController } from '../controllers/test-controller'; +import { TestController2 } from '../controllers/test-controller2'; +import { TestController3 } from '../controllers/test-controller3'; +import { TestMiddleware2 } from '../middlewares/test-middlware2'; +import { TestMiddleware } from '../middlewares/test-middlware'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; import * as http from 'http'; var sinon = require('sinon'); @@ -59,4 +59,4 @@ var options: IKiwiOptions = { after() { } -} \ No newline at end of file +} diff --git a/samples2/tests/controllers.test.ts b/samples2/tests/controllers.test.ts index a762a4d..7bc5702 100644 --- a/samples2/tests/controllers.test.ts +++ b/samples2/tests/controllers.test.ts @@ -1,11 +1,11 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; -import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; +import { IKiwiOptions, processRequest } from '../../src/index'; import { TestController } from '../controllers/test-controller'; import { TestController2 } from '../controllers/test-controller2'; import { TestController3 } from '../controllers/test-controller3'; -import { TestMiddleware2 } from '../controllers/test-middlware2'; -import { TestMiddleware } from '../controllers/test-middlware'; +import { TestMiddleware2 } from '../middlewares/test-middlware2'; +import { TestMiddleware } from '../middlewares/test-middlware'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; var httpMocks = require('node-mocks-http'); diff --git a/samples2/tests/metadataStorage.test.ts b/samples2/tests/metadataStorage.test.ts index 08e04b8..783b751 100644 --- a/samples2/tests/metadataStorage.test.ts +++ b/samples2/tests/metadataStorage.test.ts @@ -1,11 +1,11 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions } from '../../src/index'; -import { TestController } from '../test/test-controller'; -import { TestController2 } from '../test/test-controller2'; -import { TestController3 } from '../test/test-controller3'; -import { TestMiddleware2 } from '../test/test-middlware2'; -import { TestMiddleware } from '../test/test-middlware'; +import { TestController } from '../controllers/test-controller'; +import { TestController2 } from '../controllers/test-controller2'; +import { TestController3 } from '../controllers/test-controller3'; +import { TestMiddleware2 } from '../middlewares/test-middlware2'; +import { TestMiddleware } from '../middlewares/test-middlware'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; const options: IKiwiOptions = { diff --git a/tsconfig.json b/tsconfig.json index ed8c690..f995e09 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,9 +13,10 @@ }, "include": [ "samples/**/*", + "samples2/**/*", "tests/**/*" ], "exclude": [ "src" ] -} \ No newline at end of file +} From 782c9883218ca6f759020dca46139f8874d9b3bd Mon Sep 17 00:00:00 2001 From: Guillermo Fernandez Date: Tue, 14 Jan 2020 17:31:31 -0300 Subject: [PATCH 5/8] remove *.map --- README.md | 2 +- server.js.map | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 server.js.map diff --git a/README.md b/README.md index f76e440..e72d5ab 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Framework to help building a REST API using typescript and node. Also you can add the order that you want to execute your middlewares: - ``` + ```javascript import { IMiddleware } from 'kiwi-server'; import { MiddlewareBefore } from 'kiwi-server'; import * as http from 'http'; diff --git a/server.js.map b/server.js.map deleted file mode 100644 index 34e8c48..0000000 --- a/server.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"server.js","sourceRoot":"","sources":["test/server.ts"],"names":[],"mappings":";;AAAA,wCAAgD;AAChD,MAAM,MAAM,GAAG,wBAAgB,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,EAAE,CAAC"} \ No newline at end of file From f69b26024bad05b1b844a02bb988bd38bfeb81c2 Mon Sep 17 00:00:00 2001 From: "manuel.tais" Date: Wed, 15 Jan 2020 08:54:31 -0300 Subject: [PATCH 6/8] Fix update user test --- .gitignore | 2 ++ package.json | 2 +- samples/tests/controllers.test.ts | 4 ++-- tsconfig.json | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a52b035..a5a7160 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ swagger.json src/**/*.map src/**/*.js +*.map +tsconfig.temp.json diff --git a/package.json b/package.json index baf1c95..25540cd 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ }, "devDependencies": { "@types/chai": "^4.1.7", - "@types/node": "^10.3.4", + "@types/node": "^13.1.6", "chai": "^4.2.0", "coveralls": "^3.0.4", "gulp": "^4.0.2", diff --git a/samples/tests/controllers.test.ts b/samples/tests/controllers.test.ts index c5efd11..b80e37c 100644 --- a/samples/tests/controllers.test.ts +++ b/samples/tests/controllers.test.ts @@ -74,7 +74,7 @@ const options: IKiwiOptions = { }; var request = httpMocks.createRequest({ method: 'PUT', - url: `/v1/usercontroller/update/` + url: `/v1/user/update/` }); var response = httpMocks.createResponse(); @@ -100,7 +100,7 @@ const options: IKiwiOptions = { @test async 'It must get'() { var request = httpMocks.createRequest({ method: 'GET', - url: '/v1/usercontroller/get/1' + url: '/v1/user/get/1' }); var response = httpMocks.createResponse(); diff --git a/tsconfig.json b/tsconfig.json index f995e09..c045d67 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,8 @@ "outDir": "./dist", "baseUrl": "./", "emitDecoratorMetadata": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "typeRoots": ["node_modules/@types"] }, "include": [ "samples/**/*", From 99739f6e358e01ec132dc0f47f912cdfd6cad9ba Mon Sep 17 00:00:00 2001 From: "manuel.tais" Date: Wed, 15 Jan 2020 11:46:54 -0300 Subject: [PATCH 7/8] The examples are unified on one side --- .vscode/launch.json | 35 +-- gulpfile.js | 2 +- package.json | 2 +- .../controllers/test-controller.ts | 1 - .../controllers/test-controller2.ts | 0 .../controllers/test-controller3.ts | 0 .../{ => controllers}/user/user-controller.ts | 6 +- samples/middleware/sampleMiddleware.ts | 12 - .../middlewares/test-middlware.ts | 0 .../middlewares/test-middlware2.ts | 2 +- samples/server.ts | 12 +- samples/tests/authentication.test.ts | 17 +- samples/tests/controllers.test.ts | 211 ++++++++++++------ samples/tests/metadataStorage.test.ts | 102 ++++----- samples2/environments/environment.prod.ts | 4 - samples2/environments/environment.ts | 4 - samples2/models/models.ts | 14 -- samples2/server.ts | 31 --- samples2/tests/authentication.test.ts | 62 ----- samples2/tests/controllers.test.ts | 124 ---------- samples2/tests/load.test.js | 28 --- samples2/tests/metadataStorage.test.ts | 80 ------- samples2/tests/middlewares.test.ts | 91 -------- samples2/utils.ts | 7 - tsconfig.json | 1 - 25 files changed, 203 insertions(+), 645 deletions(-) rename {samples2 => samples}/controllers/test-controller.ts (98%) rename {samples2 => samples}/controllers/test-controller2.ts (100%) rename {samples2 => samples}/controllers/test-controller3.ts (100%) rename samples/{ => controllers}/user/user-controller.ts (90%) delete mode 100644 samples/middleware/sampleMiddleware.ts rename {samples2 => samples}/middlewares/test-middlware.ts (100%) rename {samples2 => samples}/middlewares/test-middlware2.ts (95%) delete mode 100644 samples2/environments/environment.prod.ts delete mode 100644 samples2/environments/environment.ts delete mode 100644 samples2/models/models.ts delete mode 100644 samples2/server.ts delete mode 100644 samples2/tests/authentication.test.ts delete mode 100644 samples2/tests/controllers.test.ts delete mode 100644 samples2/tests/load.test.js delete mode 100644 samples2/tests/metadataStorage.test.ts delete mode 100644 samples2/tests/middlewares.test.ts delete mode 100644 samples2/utils.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 5e4582f..a638110 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -20,22 +20,6 @@ "preLaunchTask": "compile", "internalConsoleOptions": "openOnSessionStart" }, - { - "type": "node", - "request": "launch", - "name": "Tests samples2", - "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", - "args": [ - "-u", - "tdd", - "--timeout", - "999999", - "--colors", - "${workspaceFolder}/dist/samples2/tests" - ], - "preLaunchTask": "compile", - "internalConsoleOptions": "openOnSessionStart" - }, { "args": [], "cwd": "${workspaceRoot}", @@ -52,23 +36,6 @@ "sourceMaps": true, "stopOnEntry": false, "type": "node" - }, - { - "args": [], - "cwd": "${workspaceRoot}", - "externalConsole": false, - "name": "DEBUG samples 2", - "outDir": "${workspaceRoot}/dist", - "program": "${workspaceRoot}/dist/samples2/server.js", - "request": "launch", - "runtimeArgs": [ - "--nolazy" - ], - "preLaunchTask": "compile", - "runtimeExecutable": null, - "sourceMaps": true, - "stopOnEntry": false, - "type": "node" - }, + } ] } diff --git a/gulpfile.js b/gulpfile.js index 572cfb3..e7508ae 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -34,7 +34,7 @@ gulp.task('copy', () => { }); gulp.task('execute-tests', function () { - return gulp.src(['dist/samples2/tests/*.test.js'], { read: false }) + return gulp.src(['dist/samples/tests/*.test.js'], { read: false }) .pipe(mocha({ reporter: 'spec' })); diff --git a/package.json b/package.json index 25540cd..2d84442 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "compile": "tsc", "test-load": "node ./tests/load.test.js", - "test": "tsc && nyc mocha ./dist/samples2/tests && nyc report --reporter=text-lcov | coveralls" + "test": "tsc && nyc mocha ./dist/samples/tests && nyc report --reporter=text-lcov | coveralls" }, "repository": { "type": "git", diff --git a/samples2/controllers/test-controller.ts b/samples/controllers/test-controller.ts similarity index 98% rename from samples2/controllers/test-controller.ts rename to samples/controllers/test-controller.ts index d4ed044..4f6cb9b 100644 --- a/samples2/controllers/test-controller.ts +++ b/samples/controllers/test-controller.ts @@ -21,7 +21,6 @@ export class TestController { @Get('/queryparam/:id') public queryparam(@QueryParam() object: UserModel, @Param('id') id: string, @HeaderParam('token1') token1: string, @HeaderParam('token2') token2: string) { - this.utils.print(); return object; } diff --git a/samples2/controllers/test-controller2.ts b/samples/controllers/test-controller2.ts similarity index 100% rename from samples2/controllers/test-controller2.ts rename to samples/controllers/test-controller2.ts diff --git a/samples2/controllers/test-controller3.ts b/samples/controllers/test-controller3.ts similarity index 100% rename from samples2/controllers/test-controller3.ts rename to samples/controllers/test-controller3.ts diff --git a/samples/user/user-controller.ts b/samples/controllers/user/user-controller.ts similarity index 90% rename from samples/user/user-controller.ts rename to samples/controllers/user/user-controller.ts index e384649..03bca7f 100644 --- a/samples/user/user-controller.ts +++ b/samples/controllers/user/user-controller.ts @@ -1,7 +1,7 @@ -import { Get, Post, Put, JsonController, Param, Body, QueryParam, Authorize, HeaderParam, Delete } from '../../src/index'; -import { UserModel } from '../models/models'; +import { Get, Post, Put, JsonController, Param, Body, QueryParam, Authorize, HeaderParam, Delete } from '../../../src/index'; +import { UserModel } from '../../models/models'; import { isNil } from 'lodash'; -import { Utils } from '../utils'; +import { Utils } from '../../utils'; @JsonController('/user') export class UserController { diff --git a/samples/middleware/sampleMiddleware.ts b/samples/middleware/sampleMiddleware.ts deleted file mode 100644 index a2a5664..0000000 --- a/samples/middleware/sampleMiddleware.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IMiddleware } from '../../src/middlewares/middleware'; -import { MiddlewareAfter } from '../../src/decorators/middlewareAfter'; -import * as http from 'http'; - -@MiddlewareAfter(1) -export class SampleMiddleware implements IMiddleware{ - - execute(request: http.IncomingMessage, response: http.ServerResponse, next: any){ - response.setHeader( 'Authorization', 'auth' ); - next(); - } -} \ No newline at end of file diff --git a/samples2/middlewares/test-middlware.ts b/samples/middlewares/test-middlware.ts similarity index 100% rename from samples2/middlewares/test-middlware.ts rename to samples/middlewares/test-middlware.ts diff --git a/samples2/middlewares/test-middlware2.ts b/samples/middlewares/test-middlware2.ts similarity index 95% rename from samples2/middlewares/test-middlware2.ts rename to samples/middlewares/test-middlware2.ts index 8274c2b..9151cd1 100644 --- a/samples2/middlewares/test-middlware2.ts +++ b/samples/middlewares/test-middlware2.ts @@ -2,7 +2,7 @@ import { IMiddleware } from '../../src/middlewares/middleware'; import { MiddlewareAfter } from '../../src/decorators/middlewareAfter'; import * as http from 'http'; -@MiddlewareAfter(1) +@MiddlewareAfter(2) export class TestMiddleware2 implements IMiddleware{ execute(request: http.IncomingMessage, response: http.ServerResponse, next: any){ diff --git a/samples/server.ts b/samples/server.ts index 0059f01..20005e8 100644 --- a/samples/server.ts +++ b/samples/server.ts @@ -1,8 +1,12 @@ import { createKiwiServer, IKiwiOptions, AuthorizeResponse } from '../src/index'; import * as http from 'http'; import { environment } from './environments/environment'; -import { UserController } from './user/user-controller'; -import { SampleMiddleware } from './middleware/sampleMiddleware'; +import { UserController } from './controllers/user/user-controller'; +import { TestController } from './controllers/test-controller'; +import { TestController2 } from './controllers/test-controller2'; +import { TestController3 } from './controllers/test-controller3'; +import { TestMiddleware } from './middlewares/test-middlware'; +import { TestMiddleware2 } from './middlewares/test-middlware2'; async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { console.log(roles); @@ -10,9 +14,9 @@ async function validateAuthentication(request: http.IncomingMessage, roles: Arra } const options: IKiwiOptions = { - controllers: [UserController], + controllers: [UserController, TestController, TestController2, TestController3], authorization: validateAuthentication, - middlewares: [SampleMiddleware], + middlewares: [TestMiddleware2, TestMiddleware], cors: { enabled: true, domains: environment.domains diff --git a/samples/tests/authentication.test.ts b/samples/tests/authentication.test.ts index 0af4346..87eb651 100644 --- a/samples/tests/authentication.test.ts +++ b/samples/tests/authentication.test.ts @@ -1,8 +1,7 @@ import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; -import { UserController } from '../user/user-controller'; -import { SampleMiddleware } from '../middleware/sampleMiddleware'; +import { UserController } from '../controllers/user/user-controller'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; import * as http from 'http'; var sinon = require('sinon'); @@ -16,7 +15,7 @@ var options: IKiwiOptions = { callback(); return true; }, - middlewares: [SampleMiddleware], + middlewares: [], cors: { enabled: true }, @@ -37,18 +36,6 @@ var options: IKiwiOptions = { before() { } - // @test async 'It must call validateAuthentication method'() { - // var request = httpMocks.createRequest({ - // method: 'GET', - // url: `/v1/testcontroller2/getAction` - // }); - - // var response = httpMocks.createResponse(); - // await processRequest(request, response); - // assert.equal(response.statusCode, 200); - // assert.isTrue(callback.calledOnce); - // } - static after() { } diff --git a/samples/tests/controllers.test.ts b/samples/tests/controllers.test.ts index b80e37c..3250499 100644 --- a/samples/tests/controllers.test.ts +++ b/samples/tests/controllers.test.ts @@ -1,15 +1,19 @@ import { suite, test } from 'mocha-typescript'; import { assert } from 'chai'; import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; -import { UserController } from '../user/user-controller'; -import { SampleMiddleware } from '../middleware/sampleMiddleware'; +import { UserController } from '../controllers/user/user-controller'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; +import { TestController } from '../controllers/test-controller'; +import { TestController2 } from '../controllers/test-controller2'; +import { TestController3 } from '../controllers/test-controller3'; +import { TestMiddleware } from '../middlewares/test-middlware'; +import { TestMiddleware2 } from '../middlewares/test-middlware2'; var httpMocks = require('node-mocks-http'); const options: IKiwiOptions = { - controllers: [UserController], + controllers: [UserController, TestController, TestController2, TestController3], authorization: null, - middlewares: [SampleMiddleware], + middlewares: [TestMiddleware2, TestMiddleware], cors: { enabled: true, domains: ['localhost:8086'] @@ -23,7 +27,8 @@ const options: IKiwiOptions = { prefix: '/v1' }; -@suite class UserControllersSuite { +@suite +class UserControllersSuite { static before() { KiwiMetadataStorage.init(options); } @@ -60,8 +65,9 @@ const options: IKiwiOptions = { assert.equal(data.name, body.name); } - @test async 'It must return the param 1'() { + @test async 'It must return true'() { const body = { + id: 1, name: 'UserModifyed', lastname: 'UserModifyed', age: 33, @@ -74,93 +80,152 @@ const options: IKiwiOptions = { }; var request = httpMocks.createRequest({ method: 'PUT', - url: `/v1/user/update/` + url: '/v1/user/update', + headers: { + 'content-type': 'application/json' + } + }); + var response = httpMocks.createResponse({ + eventEmitter: require('events').EventEmitter + }); + + setImmediate(() => request.send(JSON.stringify(body))); + await processRequest(request, response); + assert.equal(response.statusCode, 200); + var data = JSON.parse(response._getData()); + assert.equal(data, true); + } + + @test async 'It must get'() { + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/user/get/1' }); var response = httpMocks.createResponse(); await processRequest(request, response); var data = JSON.parse(response._getData()); assert.equal(response.statusCode, 200); - assert.equal(data.name, body.name); + assert.equal(data[0].name, 'UserModifyed'); } - // @test async 'It must return 404 http error'() { - // var request = httpMocks.createRequest({ - // method: 'GET', - // url: '/v1/testcontroller/queryparadsdm/1' - // }); + @test async 'It must return a list'() { + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/user/list' + }); - // var response = httpMocks.createResponse(); - // await processRequest(request, response); - // var data = response._getData(); - // assert.equal(response.statusCode, 404); - // assert.equal(data, 'Method doesnt match'); - // } + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(response.statusCode, 200); + assert.lengthOf(data, 1); + } - @test async 'It must get'() { + @test async 'It must return a filtered list'() { var request = httpMocks.createRequest({ method: 'GET', - url: '/v1/user/get/1' + url: '/v1/user/listFilter?name=UserModifyed&age=33' }); var response = httpMocks.createResponse(); await processRequest(request, response); var data = JSON.parse(response._getData()); assert.equal(response.statusCode, 200); - assert.equal(data.name, 'UserModifyed'); + assert.lengthOf(data, 1); + } + + static after() {} + + after() {} +} + +@suite +class ControllersSuite { + static before() { + KiwiMetadataStorage.init(options); } - // @test async 'It must create an object with query params values as properies'() { - // var request = httpMocks.createRequest({ - // method: 'GET', - // url: '/v1/usercontroller/queryparam/1?name=guille' - // }); - - // var response = httpMocks.createResponse(); - // await processRequest(request, response); - // var data = JSON.parse(response._getData()); - // assert.equal(response.statusCode, 200); - // assert.equal(data.name, 'guille'); - // } - - // @test async 'It must add two header params'() { - // const h1 = 'header1'; - // const h2 = 'header2'; - // var request = httpMocks.createRequest({ - // method: 'GET', - // url: '/v1/testcontroller/testHeaders', - // headers: { - // h1: h1, - // h2: h2 - // } - // }); - - // var response = httpMocks.createResponse(); - // await processRequest(request, response); - // var data = JSON.parse(response._getData()); - // assert.equal(response.statusCode, 200); - // assert.equal(data.h1, h1); - // assert.equal(data.h2, h2); - // } - - // @test async 'It mus parse body'() { - // const body = { name: 'kiwi' }; - // var request = httpMocks.createRequest({ - // method: 'POST', - // url: '/v1/testcontroller/test123', - // headers: { - // 'content-type': 'application/json' - // } - // }); - // var response = httpMocks.createResponse({ - // eventEmitter: require('events').EventEmitter - // }); - - // setImmediate(() => request.send(JSON.stringify(body))); - // await processRequest(request, response); - // var data = JSON.parse(response._getData()); - // assert.equal(data.name, body.name); - // } + before() {} + + @test async 'It must return the param 1'() { + const param = 'pepe'; + var request = httpMocks.createRequest({ + method: 'GET', + url: `/v1/testcontroller/testinguy/${param}` + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(response.statusCode, 200); + assert.equal(data.name, param); + } + + @test async 'It must return 404 http error'() { + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/testcontroller/queryparadsdm/1' + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = response._getData(); + assert.equal(response.statusCode, 404); + assert.equal(data, 'Method doesnt match'); + } + + @test async 'It must create an object with query params values as properies'() { + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/testcontroller/queryparam/1?name=guille' + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(response.statusCode, 200); + assert.equal(data.name, 'guille'); + } + + @test async 'It must add two header params'() { + const h1 = 'header1'; + const h2 = 'header2'; + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/testcontroller/testHeaders', + headers: { + h1: h1, + h2: h2 + } + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(response.statusCode, 200); + assert.equal(data.h1, h1); + assert.equal(data.h2, h2); + } + + @test async 'It mus parse body'() { + const body = { name: 'kiwi' }; + var request = httpMocks.createRequest({ + method: 'POST', + url: '/v1/testcontroller/test123', + headers: { + 'content-type': 'application/json' + } + }); + var response = httpMocks.createResponse({ + eventEmitter: require('events').EventEmitter + }); + + setImmediate(() => request.send(JSON.stringify(body))); + await processRequest(request, response); + var data = JSON.parse(response._getData()); + assert.equal(data.name, body.name); + } static after() {} diff --git a/samples/tests/metadataStorage.test.ts b/samples/tests/metadataStorage.test.ts index fd8ce28..8c4200c 100644 --- a/samples/tests/metadataStorage.test.ts +++ b/samples/tests/metadataStorage.test.ts @@ -1,72 +1,66 @@ -import { suite, test } from 'mocha-typescript'; +import { suite, test } from "mocha-typescript"; import { assert } from 'chai'; import { IKiwiOptions } from '../../src/index'; -import { UserController } from '../user/user-controller'; -import { SampleMiddleware } from '../middleware/sampleMiddleware'; +import { TestController } from '../controllers/test-controller'; +import { TestController2 } from '../controllers/test-controller2'; +import { TestController3 } from '../controllers/test-controller3'; +import { UserController } from "../controllers/user/user-controller"; +import { TestMiddleware2 } from '../middlewares/test-middlware2'; +import { TestMiddleware } from '../middlewares/test-middlware'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; const options: IKiwiOptions = { - controllers: [UserController], - authorization: null, - middlewares: [SampleMiddleware], - cors: { - enabled: true - }, - documentation: { - enabled: true, - path: '/apidoc' - }, - log: true, - port: 8086, - prefix: '/v1' -}; + controllers: [UserController, TestController, TestController2, TestController3], + authorization: null, + middlewares: [TestMiddleware2, TestMiddleware], + cors: { + enabled: true + }, + documentation: { + enabled: true, + path: '/apidoc' + }, + log: true, + port: 8086, + prefix: '/v1' +} -/* -describe("Metadata storage test", () => { - it("it must create metadata for server", () => { +@suite class KiwiMetadataStorageSuite { + static before() { KiwiMetadataStorage.init(options); - assert.equal(9, Object.keys(KiwiMetadataStorage.routes).length); - }); + } - it("it must match route", () => { - KiwiMetadataStorage.init(options); - const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); - assert.isNotNull(match); - }); -}); -*/ + before() { -@suite -class KiwiMetadataStorageSuite { - static before() { - KiwiMetadataStorage.init(options); - } + } - before() {} + @test 'It must exist 17 routes'() { + assert.equal(17, Object.keys(KiwiMetadataStorage.routes).length); + } + + @test 'it must match route'() { + const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); + assert.isNotNull(match); + } - @test 'It must exist 11 routes'() { - assert.equal(11, Object.keys(KiwiMetadataStorage.routes).length); - } + @test 'it doesn`t must match route'() { + const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1/2', 'get'); + assert.isNull(match); + } - @test 'it must match route'() { - const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); - assert.isNotNull(match); - } + @test 'it must exist one middleware after'(){ + assert.equal(1, KiwiMetadataStorage.middlewaresAfter.length); + } - @test 'it doesn`t must match route'() { - const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1/2', 'get'); - assert.isNull(match); - } + @test 'it must exist one middleware before'(){ + assert.equal(1, KiwiMetadataStorage.middlewaresBefore.length); + } - @test 'it must exist one middleware after'() { - assert.equal(1, KiwiMetadataStorage.middlewaresAfter.length); - } + static after() { - @test 'it must exist one middleware before'() { - assert.equal(1, KiwiMetadataStorage.middlewaresBefore.length); - } + } - static after() {} + after() { - after() {} + } } diff --git a/samples2/environments/environment.prod.ts b/samples2/environments/environment.prod.ts deleted file mode 100644 index 4053b1f..0000000 --- a/samples2/environments/environment.prod.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export const environment = { - name: 'prod' -} \ No newline at end of file diff --git a/samples2/environments/environment.ts b/samples2/environments/environment.ts deleted file mode 100644 index 2cf6d65..0000000 --- a/samples2/environments/environment.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const environment = { - name: 'local', - domains: ['http://localhosts:4200', 'http://localhosts:4201'] -} \ No newline at end of file diff --git a/samples2/models/models.ts b/samples2/models/models.ts deleted file mode 100644 index cf47383..0000000 --- a/samples2/models/models.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IsString, IsNumber, IsArray } from '../../src/index' - -export class AddressModel { - @IsString() public street: string; - @IsNumber() public number: number; -} - -export class UserModel { - @IsNumber() public id: number; - @IsString() public name: string; - @IsString() public lastname: string; - @IsNumber() public age: number; - @IsArray(() => AddressModel) public address: AddressModel[]; -} diff --git a/samples2/server.ts b/samples2/server.ts deleted file mode 100644 index a5e57cc..0000000 --- a/samples2/server.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createKiwiServer, IKiwiOptions, AuthorizeResponse } from '../src/index'; -import { TestController2 } from './controllers/test-controller2'; -import { TestController3 } from './controllers/test-controller3'; -import { TestController } from './controllers/test-controller'; -import { TestMiddleware } from './middlewares/test-middlware'; -import { TestMiddleware2 } from './middlewares/test-middlware2'; -import * as http from 'http'; -import { environment } from './environments/environment'; - -async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { - console.log(roles); - return true; -} - -const options: IKiwiOptions = { - controllers: [TestController, TestController2, TestController3], - authorization: validateAuthentication, - middlewares: [TestMiddleware2, TestMiddleware], - cors: { - enabled: true, - domains: environment.domains - }, - documentation: { - enabled: true, - path: '/apidoc' - }, - log: true, - port: 8086, - prefix: '/v1' -}; -const server = createKiwiServer(options, null); diff --git a/samples2/tests/authentication.test.ts b/samples2/tests/authentication.test.ts deleted file mode 100644 index 0cfcbfd..0000000 --- a/samples2/tests/authentication.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { suite, test } from "mocha-typescript"; -import { assert } from 'chai'; -import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; -import { TestController } from '../controllers/test-controller'; -import { TestController2 } from '../controllers/test-controller2'; -import { TestController3 } from '../controllers/test-controller3'; -import { TestMiddleware2 } from '../middlewares/test-middlware2'; -import { TestMiddleware } from '../middlewares/test-middlware'; -import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; -import * as http from 'http'; -var sinon = require('sinon'); -var httpMocks = require('node-mocks-http'); - -var callback = sinon.spy(); - -var options: IKiwiOptions = { - controllers: [TestController, TestController2, TestController3], - authorization: function(request: http.IncomingMessage, roles: Array){ - callback(); - return true; - }, - middlewares: [TestMiddleware2, TestMiddleware], - cors: { - enabled: true - }, - documentation: { - enabled: true, - path: '/apidoc' - }, - log: true, - port: 8086, - prefix: '/v1' -} - -@suite class AuthenticationSuite { - static before() { - KiwiMetadataStorage.init(options); - } - - before() { - } - - @test async 'It must call validateAuthentication method'() { - var request = httpMocks.createRequest({ - method: 'GET', - url: `/v1/testcontroller2/getAction` - }); - - var response = httpMocks.createResponse(); - await processRequest(request, response); - assert.equal(response.statusCode, 200); - assert.isTrue(callback.calledOnce); - } - - static after() { - - } - - after() { - - } -} diff --git a/samples2/tests/controllers.test.ts b/samples2/tests/controllers.test.ts deleted file mode 100644 index 7bc5702..0000000 --- a/samples2/tests/controllers.test.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { suite, test } from "mocha-typescript"; -import { assert } from 'chai'; -import { IKiwiOptions, processRequest } from '../../src/index'; -import { TestController } from '../controllers/test-controller'; -import { TestController2 } from '../controllers/test-controller2'; -import { TestController3 } from '../controllers/test-controller3'; -import { TestMiddleware2 } from '../middlewares/test-middlware2'; -import { TestMiddleware } from '../middlewares/test-middlware'; -import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; -var httpMocks = require('node-mocks-http'); - -const options: IKiwiOptions = { - controllers: [TestController, TestController2, TestController3], - authorization: null, - middlewares: [TestMiddleware2, TestMiddleware], - cors: { - enabled: true, - domains: ['localhost:8086'] - }, - documentation: { - enabled: true, - path: '/apidoc' - }, - log: true, - port: 8086, - prefix: '/v1' -} - -@suite class ControllersSuite { - static before() { - KiwiMetadataStorage.init(options); - } - - before() { - - } - - @test async 'It must return the param 1'() { - const param = 'pepe'; - var request = httpMocks.createRequest({ - method: 'GET', - url: `/v1/testcontroller/testinguy/${param}` - }); - - var response = httpMocks.createResponse(); - await processRequest(request, response); - var data = JSON.parse(response._getData()); - assert.equal(response.statusCode, 200); - assert.equal(data.name, param); - } - - @test async 'It must return 404 http error'() { - var request = httpMocks.createRequest({ - method: 'GET', - url: '/v1/testcontroller/queryparadsdm/1' - }); - - var response = httpMocks.createResponse(); - await processRequest(request, response); - var data = response._getData(); - assert.equal(response.statusCode, 404); - assert.equal(data, 'Method doesnt match'); - } - - @test async 'It must create an object with query params values as properies'() { - var request = httpMocks.createRequest({ - method: 'GET', - url: '/v1/testcontroller/queryparam/1?name=guille' - }); - - var response = httpMocks.createResponse(); - await processRequest(request, response); - var data = JSON.parse(response._getData()); - assert.equal(response.statusCode, 200); - assert.equal(data.name, 'guille'); - } - - @test async 'It must add two header params'() { - const h1 = 'header1'; - const h2 = 'header2'; - var request = httpMocks.createRequest({ - method: 'GET', - url: '/v1/testcontroller/testHeaders', - headers: { - h1: h1, - h2: h2 - } - }); - - var response = httpMocks.createResponse(); - await processRequest(request, response); - var data = JSON.parse(response._getData()); - assert.equal(response.statusCode, 200); - assert.equal(data.h1, h1); - assert.equal(data.h2, h2); - } - - @test async 'It mus parse body'() { - const body = { name: 'kiwi' }; - var request = httpMocks.createRequest({ - method: 'POST', - url: '/v1/testcontroller/test123', - headers:{ - "content-type": "application/json" - } - }); - var response = httpMocks.createResponse({ - eventEmitter: require('events').EventEmitter - }); - - setImmediate(() => request.send(JSON.stringify(body))); - await processRequest(request, response); - var data = JSON.parse(response._getData()); - assert.equal(data.name, body.name); - } - - static after() { - - } - - after() { - - } -} diff --git a/samples2/tests/load.test.js b/samples2/tests/load.test.js deleted file mode 100644 index d33f165..0000000 --- a/samples2/tests/load.test.js +++ /dev/null @@ -1,28 +0,0 @@ -const loadtest = require('loadtest'); - -const options = { - url: 'http://localhost:8086', - concurrent: 5, - method: 'POST', - body:'', - requestsPerSecond:5, - maxSeconds: 30, - requestGenerator: (params, options, client, callback) => { - const message = '{"name": "guille"}'; - options.headers['Content-Length'] = message.length; - options.headers['Content-Type'] = 'application/json'; - options.body = ''; - options.path = '/v1/testcontroller/postAction/1'; - const request = client(options, callback); - request.write(message); - return request; - } -}; - -loadtest.loadTest(options, (error, results) => { - if (error) { - return console.error('Got an error: %s', error); - } - console.log(results); - console.log('Tests run successfully'); -}); diff --git a/samples2/tests/metadataStorage.test.ts b/samples2/tests/metadataStorage.test.ts deleted file mode 100644 index 783b751..0000000 --- a/samples2/tests/metadataStorage.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { suite, test } from "mocha-typescript"; -import { assert } from 'chai'; -import { IKiwiOptions } from '../../src/index'; -import { TestController } from '../controllers/test-controller'; -import { TestController2 } from '../controllers/test-controller2'; -import { TestController3 } from '../controllers/test-controller3'; -import { TestMiddleware2 } from '../middlewares/test-middlware2'; -import { TestMiddleware } from '../middlewares/test-middlware'; -import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; - -const options: IKiwiOptions = { - controllers: [TestController, TestController2, TestController3], - authorization: null, - middlewares: [TestMiddleware2, TestMiddleware], - cors: { - enabled: true - }, - documentation: { - enabled: true, - path: '/apidoc' - }, - log: true, - port: 8086, - prefix: '/v1' -} - -/* -describe("Metadata storage test", () => { - it("it must create metadata for server", () => { - KiwiMetadataStorage.init(options); - assert.equal(9, Object.keys(KiwiMetadataStorage.routes).length); - }); - - it("it must match route", () => { - KiwiMetadataStorage.init(options); - const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); - assert.isNotNull(match); - }); -}); -*/ - -@suite class KiwiMetadataStorageSuite { - static before() { - KiwiMetadataStorage.init(options); - } - - before() { - - } - - @test 'It must exist 11 routes'() { - assert.equal(11, Object.keys(KiwiMetadataStorage.routes).length); - } - - @test 'it must match route'() { - const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1', 'get'); - assert.isNotNull(match); - } - - @test 'it doesn`t must match route'() { - const match = KiwiMetadataStorage.matchRoute('/v1/testcontroller/queryparam/1/2', 'get'); - assert.isNull(match); - } - - @test 'it must exist one middleware after'(){ - assert.equal(1, KiwiMetadataStorage.middlewaresAfter.length); - } - - @test 'it must exist one middleware before'(){ - assert.equal(1, KiwiMetadataStorage.middlewaresBefore.length); - } - - static after() { - - } - - after() { - - } -} diff --git a/samples2/tests/middlewares.test.ts b/samples2/tests/middlewares.test.ts deleted file mode 100644 index a575e49..0000000 --- a/samples2/tests/middlewares.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { suite, test } from "mocha-typescript"; -import { assert } from 'chai'; -import { CorsMiddleware } from '../../src/middlewares/corsMiddlware'; -import { LogMiddleware } from '../../src/middlewares/logMiddlware'; -import { DocMiddleware } from '../../src/middlewares/docMiddleware'; -var httpMocks = require('node-mocks-http'); -var sinon = require('sinon'); - - -@suite class MIddlewaresSuite { - static before() { - (global as any).options = { - cors: { domains: ['test'] }, - prefix: '/v1', - documentation: { - path: "/apidoc" - } - }; - } - - before() { - - } - - @test 'It must execute cors middleware for options'() { - const corsMiddleware = new CorsMiddleware(); - const param = 'pepe'; - var request = httpMocks.createRequest({ - method: 'OPTIONS', - url: `/v1/testcontroller/testinguy/${param}` - }); - var response = httpMocks.createResponse(); - response.getHeaders = function () { - return {}; - }; - corsMiddleware.execute(request, response, null); - assert.equal(response.statusCode, 204); - } - - @test 'It must execute cors middleware for post'() { - const corsMiddleware = new CorsMiddleware(); - const param = 'pepe'; - var request = httpMocks.createRequest({ - method: 'POST', - url: `/v1/testcontroller/testinguy/${param}` - }); - var response = httpMocks.createResponse(); - response.getHeaders = function () { - return {}; - }; - var next = sinon.spy(); - corsMiddleware.execute(request, response, next); - assert.isTrue(next.calledOnce); - } - - @test 'It must execute log middleware'() { - const middleware = new LogMiddleware(); - const param = 'pepe'; - var request = httpMocks.createRequest({ - method: 'POST', - url: `/v1/testcontroller/testinguy/${param}` - }); - var response = httpMocks.createResponse(); - response.getHeaders = function () { - return {}; - }; - var next = sinon.spy(); - middleware.execute(request, response, next); - assert.isTrue(next.calledOnce); - } - - @test 'It must execute doc middleware for post'() { - const middleware = new DocMiddleware(); - var request = httpMocks.createRequest({ - method: 'POST', - url: `/v1/apidoc` - }); - var response = httpMocks.createResponse(); - var next = sinon.spy(); - middleware.execute(request, response, next); - assert.equal(response.statusCode, 200); - } - - static after() { - - } - - after() { - - } -} diff --git a/samples2/utils.ts b/samples2/utils.ts deleted file mode 100644 index 3c58c21..0000000 --- a/samples2/utils.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { UserModel } from "./models/models"; - -export class Utils { - public print() { - //console.log('entre1'); - } -} diff --git a/tsconfig.json b/tsconfig.json index c045d67..2158c5c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,6 @@ }, "include": [ "samples/**/*", - "samples2/**/*", "tests/**/*" ], "exclude": [ From 5f718bda0230af23023efcb75668da10a6e80f0c Mon Sep 17 00:00:00 2001 From: "manuel.tais" Date: Wed, 15 Jan 2020 14:19:38 -0300 Subject: [PATCH 8/8] Change readme Some tests modifyed --- README.md | 219 +++++++++++--------- samples/auxiliaryFunctions.ts | 5 + samples/controllers/user/user-controller.ts | 16 +- samples/middlewares/user-middleware.ts | 13 ++ samples/tests/controllers.test.ts | 18 +- samples/tests/metadataStorage.test.ts | 4 +- 6 files changed, 176 insertions(+), 99 deletions(-) create mode 100644 samples/auxiliaryFunctions.ts create mode 100644 samples/middlewares/user-middleware.ts diff --git a/README.md b/README.md index e72d5ab..885f254 100644 --- a/README.md +++ b/README.md @@ -31,26 +31,52 @@ Framework to help building a REST API using typescript and node. ``` ## Sample -1. Create your first controller class `TestController.ts` +1. Create your first controller class `user-controller.ts` ```javascript - import { Get, Post, JsonController, Param, Body } from 'kiwi-server'; + import { Get, Post, Put, JsonController, Param, Body, QueryParam, Authorize, HeaderParam, Delete } from '../../../src/index'; + import { UserModel } from '../../models/models'; + import { isNil } from 'lodash'; + import { Utils } from '../../utils'; + + @JsonController('/user') + export class UserController { + constructor() {} + + @Authorize(['Admin']) + @Post('/create') + public create(@Body() user: UserModel) { + user.id = Utils.userList.length + 1; + Utils.userList.push(user); + return user; + } - @JsonController('/testcontroller') - export class TestController { + @Authorize(['Admin']) + @Get('/get/:id') + public getById(@Param('id') id: number) { + var user = Utils.userList.filter(function(obj) { + return obj.id === id; + }); - @Get('/getAction/:id/:id2/:id3') - public get(@Param('id') id: string, @Param('id2') id2: string, @Param('id3') id3: string) { - return { method: "get test" }; + return user; } - @Post('/postAction/:id') - public post( @Body() request: any, @Param('id') id: string) { - return { - method: "post test", - request: request - }; + @Authorize(['Admin']) + @Put('/update') + public update(@Body() user: UserModel) { + let userAux = Utils.userList.find(x => x.id == user.id); + let index = Utils.userList.indexOf(userAux); + Utils.userList[index] = user; + return true; + } + + @Authorize(['Admin']) + @Delete('/delete/:id') + public delete(@Param('id') id: number) { + Utils.userList = Utils.userList.filter(function(obj) { + return obj.id !== id; + }); + return true; } - } ``` @@ -59,16 +85,21 @@ Framework to help building a REST API using typescript and node. For example if you send something like http://.../testcontroller/queryparam/1?name=guille&lastname=fernandez you will receive an object like below: ```javascript - @Get('/queryparam/:id') - public queryparam(@QueryParam() object: any, @Param('id') id: string) { - return object; - } + @Get('/listFilter') + public listFilter(@QueryParam() params: any) { + if (!isNil(params)) { + var users = Utils.userList.filter(function(obj) { + return obj.name === params.name && obj.age === +params.age; + }); + } + return users; + } ``` ```javascript { "name": "guille", - "lastname": "fernandez" + "age": 33 } ``` @@ -76,19 +107,25 @@ Framework to help building a REST API using typescript and node. In the next example we are going to receive the token HTTP header if it exists. ```javascript - @Get('/queryparam/:id') - public queryparam(@Param('id') id: string, @HeaderParam('token') token: string) { - return object; + @Get('/search/:name') + public queryparam(@Param('name') name: string, @HeaderParam('token') token: string) { + this.aux.print(token); + if (!isNil(name)) { + var users = Utils.userList.filter(function(obj) { + return obj.name === name; + }); + } + return users; } ``` 2. After creating the controller, create the server that uses that controller. ```javascript import { createKiwiServer } from 'kiwi-server'; - import { TestController } from './test-controller'; + import { UserController } from './controllers/user/user-controller'; const options = { - controllers: [TestController], + controllers: [UserController], }; const server = createKiwiServer(options); server.listen(8086); @@ -96,22 +133,23 @@ Framework to help building a REST API using typescript and node. ## Middlewares 1. You can create middlewares to execute activities before and after the execution of an action. - For example to enable CORS we use a specific middleware that is in charge of adding the HTTP headers for that. - It's important to execute `next` if you want the flow to continue executing. Otherwise the flow finishes and you must do something with the response, if you don't the client never gets a response. - Below is an example that executes before any action. + For example to enable CORS we use a specific middleware that is in charge of adding the HTTP headers for that. + It's important to execute `next` if you want the flow to continue executing. Otherwise the flow finishes and you must do something with the response, if you don't the client never gets a response. + Below is an example that executes before any action. - Also you can add the order that you want to execute your middlewares: - + Also you can add the order that you want to execute your middlewares: + ```javascript - import { IMiddleware } from 'kiwi-server'; - import { MiddlewareBefore } from 'kiwi-server'; + import { IMiddleware } from '../../src/middlewares/middleware'; + import { MiddlewareAfter } from '../../src/decorators/middlewareAfter'; import * as http from 'http'; - @MiddlewareBefore(7) - export class TestMiddleware implements IMiddleware { - execute(request: http.IncomingMessage, response: http.ServerResponse, next: any) { - response.setHeader( 'Authorization', 'hola' ); - console.log('TestMiddleware execute'); + @MiddlewareAfter(1) + export class UserMiddleware implements IMiddleware{ + + execute(request: http.IncomingMessage, response: http.ServerResponse, next: any){ + response.setHeader( 'Authorization', 'token' ); + console.log('UserMiddleware execute'); next(); } } @@ -119,35 +157,30 @@ Framework to help building a REST API using typescript and node. ## Authorization 1. On the controller specify what actions need to be authorized, using the `@Authorize` decorator. - In the following example we only need to authorize the `post` action. You can also put the decorator in the controller if all the actions need to be authorized. + In the following example we only need to authorize the `put` action. You can also put the decorator in the controller if all the actions need to be authorized. ```javascript - import { Get, Post, JsonController, Authorize } from 'kiwi-server'; - - @JsonController('/testcontroller2') - export class TestController2 { - @Get('/getAction') - public get(){ - return "get test2"; - } - - @Authorize(['ADMIN', 'USER']) - @Post('/postAction') - public post(@Body() request: any) { - return { - method: "post test2", - request: request - }; - } + @Get('/list') + public listAll() { + return Utils.userList; } + + @Authorize(['Admin']) + @Put('/update') + public update(@Body() user: UserModel) { + let userAux = Utils.userList.find(x => x.id == user.id); + let index = Utils.userList.indexOf(userAux); + Utils.userList[index] = user; + return true; + } + ``` 2. On the server define the function that is going to be executed everytime an action or a controller has the `@Authorize` decorator. If that function returns `false` the service is going to return 401 HTTP error, in other case it will continue the normal execution path. ```javascript import { createKiwiServer } from 'kiwi-server'; - import { TestController } from './test-controller'; - import { TestController2 } from './test-controller2'; + import { UserController } from './controllers/user/user-controller'; async function validateAuthentication(request: http.IncomingMessage, roles: Array): Promise { console.log(roles); @@ -156,7 +189,7 @@ Framework to help building a REST API using typescript and node. } const options = { - controllers: [TestController, TestController2], + controllers: [UserController], authorization: validateAuthentication } const server = createKiwiServer(options); @@ -168,11 +201,10 @@ Framework to help building a REST API using typescript and node. ```javascript import { createKiwiServer } from 'kiwi-server'; - import { TestController } from './test-controller'; - import { TestController2 } from './test-controller2'; + import { UserController } from './controllers/user/user-controller'; const options = { - controllers: [TestController, TestController2], + controllers: [UserController], cors: { enabled: true, domains: ['domain1.com', 'domain2.com'] @@ -187,11 +219,10 @@ Framework to help building a REST API using typescript and node. ```javascript import { createKiwiServer } from 'kiwi-server'; - import { TestController } from './test-controller'; - import { TestController2 } from './test-controller2'; + import { UserController } from './controllers/user/user-controller'; const options = { - controllers: [TestController, TestController2], + controllers: [UserController], prefix: 'v1/' } const server = createKiwiServer(options); @@ -204,32 +235,33 @@ Framework to help building a REST API using typescript and node. Then you can use that in any method that you want. ```javascript - import { Get, Post, JsonController, Param, Body, QueryParam, Authorize } from 'kiwi-server'; - import { Utils } from './utils'; - - @Authorize(['role1, role2']) - @JsonController('/testcontroller') - export class TestController { - - constructor(private utils: Utils) {} - - @Post('/meetupjs') - public test23(@Body() body: any) { - return body; - } - - @Get('/queryparam/:id') - public queryparam(@QueryParam() object: any, @Param('id') id: string) { - this.utils.print(); - return object; + import { Get, Post, Put, JsonController, Param, Body, QueryParam, Authorize, HeaderParam, Delete } from '../../../src/index'; + import { UserModel } from '../../models/models'; + import { isNil } from 'lodash'; + import { AuxiliaryFunctions } from '../../auxiliaryFunctions'; + + @JsonController('/user') + export class UserController { + constructor(private aux: AuxiliaryFunctions) {} + + @Get('/search/:name') + public queryparam(@Param('name') name: string, @HeaderParam('token') token: string) { + this.aux.print(token); + if (!isNil(name)) { + var users = Utils.userList.filter(function(obj) { + return obj.name === name; + }); + } + return users; } + } ``` ## Sockets 1. socket.io is integrated to our framework. Enable socket support by adding the `socket` property to the options. ```javascript const options = { - controllers: [TestController, TestController2], + controllers: [UserController], documentation: { enabled: true, path: '/apidoc' @@ -253,11 +285,10 @@ Then you can use that in any method that you want. ```javascript import { createKiwiServer } from 'kiwi-server'; - import { TestController } from './test-controller'; - import { TestController2 } from './test-controller2'; + import { UserController } from '../controllers/user/user-controller'; const options = { - controllers: [TestController, TestController2], + controllers: [UserController], prefix: 'v1/', cors: true, documentation: { @@ -270,17 +301,19 @@ Then you can use that in any method that you want. ``` 2. Decorate your models ```javascript - import { IsArray, IsInt, IsDate, IsOptional } from 'kiwi-server'; + import { IsString, IsNumber, IsArray } from '../../src/index' - export class TimesheetEntry { - @IsInt() projectId: number; - @IsDate() date: Date; - @IsOptional() @IsInt() hours?: number; + export class AddressModel { + @IsString() public street: string; + @IsNumber() public number: number; } - export class TimesheetEntries { - @IsArray(() => TimesheetEntry) - entries: TimesheetEntry[]; + export class UserModel { + @IsNumber() public id: number; + @IsString() public name: string; + @IsString() public lastname: string; + @IsNumber() public age: number; + @IsArray(() => AddressModel) public address: AddressModel[]; } ``` 3. Visit the documentation page, in this example it would be at http://localhost:8086/v1/apidoc diff --git a/samples/auxiliaryFunctions.ts b/samples/auxiliaryFunctions.ts new file mode 100644 index 0000000..14e29f3 --- /dev/null +++ b/samples/auxiliaryFunctions.ts @@ -0,0 +1,5 @@ +export class AuxiliaryFunctions { + public print(text: string) { + console.log(text); + } +} diff --git a/samples/controllers/user/user-controller.ts b/samples/controllers/user/user-controller.ts index 03bca7f..513ccb7 100644 --- a/samples/controllers/user/user-controller.ts +++ b/samples/controllers/user/user-controller.ts @@ -2,10 +2,11 @@ import { Get, Post, Put, JsonController, Param, Body, QueryParam, Authorize, Hea import { UserModel } from '../../models/models'; import { isNil } from 'lodash'; import { Utils } from '../../utils'; +import { AuxiliaryFunctions } from '../../auxiliaryFunctions'; @JsonController('/user') export class UserController { - constructor() {} + constructor(private aux: AuxiliaryFunctions) {} @Authorize(['Admin']) @Post('/create') @@ -34,13 +35,11 @@ export class UserController { return true; } - @Authorize() @Get('/list') public listAll() { return Utils.userList; } - @Authorize() @Get('/listFilter') public listFilter(@QueryParam() params: any) { if (!isNil(params)) { @@ -59,4 +58,15 @@ export class UserController { }); return true; } + + @Get('/search/:name') + public queryparam(@Param('name') name: string, @HeaderParam('token') token: string) { + this.aux.print(token); + if (!isNil(name)) { + var users = Utils.userList.filter(function(obj) { + return obj.name === name; + }); + } + return users; + } } diff --git a/samples/middlewares/user-middleware.ts b/samples/middlewares/user-middleware.ts new file mode 100644 index 0000000..8fe6921 --- /dev/null +++ b/samples/middlewares/user-middleware.ts @@ -0,0 +1,13 @@ +import { IMiddleware } from '../../src/middlewares/middleware'; +import { MiddlewareAfter } from '../../src/decorators/middlewareAfter'; +import * as http from 'http'; + +@MiddlewareAfter(1) +export class UserMiddleware implements IMiddleware{ + + execute(request: http.IncomingMessage, response: http.ServerResponse, next: any){ + response.setHeader( 'Authorization', 'token' ); + console.log('UserMiddleware execute'); + next(); + } +} diff --git a/samples/tests/controllers.test.ts b/samples/tests/controllers.test.ts index 3250499..aab0d58 100644 --- a/samples/tests/controllers.test.ts +++ b/samples/tests/controllers.test.ts @@ -1,8 +1,8 @@ import { suite, test } from 'mocha-typescript'; import { assert } from 'chai'; import { IKiwiOptions, createKiwiServer, processRequest } from '../../src/index'; -import { UserController } from '../controllers/user/user-controller'; import { KiwiMetadataStorage } from '../../src/metadata/metadataStorage'; +import { UserController } from '../controllers/user/user-controller'; import { TestController } from '../controllers/test-controller'; import { TestController2 } from '../controllers/test-controller2'; import { TestController3 } from '../controllers/test-controller3'; @@ -135,6 +135,22 @@ class UserControllersSuite { assert.lengthOf(data, 1); } + + @test async 'It must return list'() { + const token = 'token1'; + var request = httpMocks.createRequest({ + method: 'GET', + url: '/v1/user/search/UserModifyed', + headers: { + token: token + } + }); + + var response = httpMocks.createResponse(); + await processRequest(request, response); + assert.equal(response.statusCode, 200); + } + static after() {} after() {} diff --git a/samples/tests/metadataStorage.test.ts b/samples/tests/metadataStorage.test.ts index 8c4200c..c1672da 100644 --- a/samples/tests/metadataStorage.test.ts +++ b/samples/tests/metadataStorage.test.ts @@ -34,8 +34,8 @@ const options: IKiwiOptions = { } - @test 'It must exist 17 routes'() { - assert.equal(17, Object.keys(KiwiMetadataStorage.routes).length); + @test 'It must exist 18 routes'() { + assert.equal(18, Object.keys(KiwiMetadataStorage.routes).length); } @test 'it must match route'() {