55
66import { Application } from '@loopback/core' ;
77import {
8- supertest ,
9- expect ,
108 createClientForHandler ,
11- itSkippedOnTravis ,
12- httpsGetAsync ,
9+ expect ,
1310 givenHttpServerConfig ,
11+ httpsGetAsync ,
12+ itSkippedOnTravis ,
13+ supertest ,
1414} from '@loopback/testlab' ;
15+ import * as fs from 'fs' ;
16+ import { IncomingMessage , ServerResponse } from 'http' ;
17+ import * as yaml from 'js-yaml' ;
18+ import * as path from 'path' ;
19+ import { is } from 'type-is' ;
20+ import * as util from 'util' ;
1521import {
16- RestBindings ,
17- RestServer ,
18- RestComponent ,
22+ BodyParser ,
1923 get ,
24+ post ,
2025 Request ,
26+ requestBody ,
27+ RequestContext ,
28+ RestBindings ,
29+ RestComponent ,
30+ RestServer ,
2131 RestServerConfig ,
22- BodyParser ,
2332} from '../..' ;
24- import { IncomingMessage , ServerResponse } from 'http' ;
25- import * as yaml from 'js-yaml' ;
26- import * as path from 'path' ;
27- import * as fs from 'fs' ;
28- import * as util from 'util' ;
2933const readFileAsync = util . promisify ( fs . readFile ) ;
3034
31- import { is } from 'type-is' ;
32- import { requestBody , post } from '../../src' ;
33-
3435const FIXTURES = path . resolve ( __dirname , '../../../fixtures' ) ;
3536const ASSETS = path . resolve ( FIXTURES , 'assets' ) ;
3637
3738describe ( 'RestServer (integration)' , ( ) => {
3839 it ( 'exports url property' , async ( ) => {
39- // Explicitly setting host to IPv4 address so test runs on Travis
40- const server = await givenAServer ( { rest : { port : 0 , host : '127.0.0.1' } } ) ;
40+ const server = await givenAServer ( ) ;
4141 server . handler ( dummyRequestHandler ) ;
4242 expect ( server . url ) . to . be . undefined ( ) ;
4343 await server . start ( ) ;
@@ -52,8 +52,26 @@ describe('RestServer (integration)', () => {
5252 expect ( server . url ) . to . be . undefined ( ) ;
5353 } ) ;
5454
55+ it ( 'parses query without decorated rest query params' , async ( ) => {
56+ // This handler responds with the query object (which is expected to
57+ // be parsed by Express)
58+ function requestWithQueryHandler ( { request, response} : RequestContext ) {
59+ response . json ( request . query ) ;
60+ response . end ( ) ;
61+ }
62+
63+ // See https://github.com/strongloop/loopback-next/issues/2088
64+ const server = await givenAServer ( ) ;
65+ server . handler ( requestWithQueryHandler ) ;
66+ await server . start ( ) ;
67+ await supertest ( server . url )
68+ . get ( '/?x=1&y[a]=2' )
69+ . expect ( 200 , { x : '1' , y : { a : '2' } } ) ;
70+ await server . stop ( ) ;
71+ } ) ;
72+
5573 it ( 'updates rest.port binding when listening on ephemeral port' , async ( ) => {
56- const server = await givenAServer ( { rest : { port : 0 } } ) ;
74+ const server = await givenAServer ( ) ;
5775 await server . start ( ) ;
5876 expect ( server . getSync ( RestBindings . PORT ) ) . to . be . above ( 0 ) ;
5977 await server . stop ( ) ;
@@ -73,7 +91,7 @@ describe('RestServer (integration)', () => {
7391 } ) ;
7492
7593 it ( 'responds with 500 when Sequence fails with unhandled error' , async ( ) => {
76- const server = await givenAServer ( { rest : { port : 0 } } ) ;
94+ const server = await givenAServer ( ) ;
7795 server . handler ( ( context , sequence ) => {
7896 return Promise . reject ( new Error ( 'unhandled test error' ) ) ;
7997 } ) ;
@@ -111,11 +129,7 @@ describe('RestServer (integration)', () => {
111129
112130 it ( 'allows static assets via api' , async ( ) => {
113131 const root = ASSETS ;
114- const server = await givenAServer ( {
115- rest : {
116- port : 0 ,
117- } ,
118- } ) ;
132+ const server = await givenAServer ( ) ;
119133
120134 server . static ( '/html' , root ) ;
121135 const content = fs
@@ -129,11 +143,7 @@ describe('RestServer (integration)', () => {
129143
130144 it ( 'allows static assets to be mounted on multiple paths' , async ( ) => {
131145 const root = ASSETS ;
132- const server = await givenAServer ( {
133- rest : {
134- port : 0 ,
135- } ,
136- } ) ;
146+ const server = await givenAServer ( ) ;
137147
138148 server . static ( '/html-0' , root ) ;
139149 server . static ( '/html-1' , root ) ;
@@ -154,11 +164,7 @@ describe('RestServer (integration)', () => {
154164 it ( 'merges different static asset directories when mounted on the same path' , async ( ) => {
155165 const root = ASSETS ;
156166 const otherAssets = path . join ( FIXTURES , 'other-assets' ) ;
157- const server = await givenAServer ( {
158- rest : {
159- port : 0 ,
160- } ,
161- } ) ;
167+ const server = await givenAServer ( ) ;
162168
163169 server . static ( '/html' , root ) ;
164170 server . static ( '/html' , otherAssets ) ;
@@ -178,11 +184,7 @@ describe('RestServer (integration)', () => {
178184
179185 it ( 'allows static assets via api after start' , async ( ) => {
180186 const root = ASSETS ;
181- const server = await givenAServer ( {
182- rest : {
183- port : 0 ,
184- } ,
185- } ) ;
187+ const server = await givenAServer ( ) ;
186188 await createClientForHandler ( server . requestHandler )
187189 . get ( '/html/index.html' )
188190 . expect ( 404 ) ;
@@ -196,11 +198,7 @@ describe('RestServer (integration)', () => {
196198
197199 it ( 'allows non-static routes after assets' , async ( ) => {
198200 const root = ASSETS ;
199- const server = await givenAServer ( {
200- rest : {
201- port : 0 ,
202- } ,
203- } ) ;
201+ const server = await givenAServer ( ) ;
204202 server . static ( '/html' , root ) ;
205203 server . handler ( dummyRequestHandler ) ;
206204
@@ -211,11 +209,7 @@ describe('RestServer (integration)', () => {
211209
212210 it ( 'gives precedence to API routes over static assets' , async ( ) => {
213211 const root = ASSETS ;
214- const server = await givenAServer ( {
215- rest : {
216- port : 0 ,
217- } ,
218- } ) ;
212+ const server = await givenAServer ( ) ;
219213 server . static ( '/html' , root ) ;
220214 server . handler ( dummyRequestHandler ) ;
221215
@@ -226,11 +220,7 @@ describe('RestServer (integration)', () => {
226220
227221 it ( 'registers controllers defined later than static assets' , async ( ) => {
228222 const root = ASSETS ;
229- const server = await givenAServer ( {
230- rest : {
231- port : 0 ,
232- } ,
233- } ) ;
223+ const server = await givenAServer ( ) ;
234224 server . static ( '/html' , root ) ;
235225 server . controller ( DummyController ) ;
236226
@@ -256,7 +246,7 @@ describe('RestServer (integration)', () => {
256246 }
257247 }
258248
259- const server = await givenAServer ( { rest : { port : 0 } } ) ;
249+ const server = await givenAServer ( ) ;
260250 // Register a request body parser for xml
261251 server . bodyParser ( XmlBodyParser ) ;
262252 server . controller ( DummyXmlController ) ;
@@ -269,7 +259,7 @@ describe('RestServer (integration)', () => {
269259 } ) ;
270260
271261 it ( 'allows cors' , async ( ) => {
272- const server = await givenAServer ( { rest : { port : 0 } } ) ;
262+ const server = await givenAServer ( ) ;
273263 server . handler ( dummyRequestHandler ) ;
274264
275265 await createClientForHandler ( server . requestHandler )
@@ -280,7 +270,7 @@ describe('RestServer (integration)', () => {
280270 } ) ;
281271
282272 it ( 'allows cors preflight' , async ( ) => {
283- const server = await givenAServer ( { rest : { port : 0 } } ) ;
273+ const server = await givenAServer ( ) ;
284274 server . handler ( dummyRequestHandler ) ;
285275
286276 await createClientForHandler ( server . requestHandler )
@@ -311,11 +301,7 @@ describe('RestServer (integration)', () => {
311301 } ) ;
312302
313303 it ( 'exposes "GET /openapi.json" endpoint' , async ( ) => {
314- const server = await givenAServer ( {
315- rest : {
316- port : 0 ,
317- } ,
318- } ) ;
304+ const server = await givenAServer ( ) ;
319305 const greetSpec = {
320306 responses : {
321307 200 : {
@@ -407,7 +393,7 @@ describe('RestServer (integration)', () => {
407393 } ) ;
408394
409395 it ( 'exposes "GET /openapi.yaml" endpoint' , async ( ) => {
410- const server = await givenAServer ( { rest : { port : 0 } } ) ;
396+ const server = await givenAServer ( ) ;
411397 const greetSpec = {
412398 responses : {
413399 200 : {
@@ -701,7 +687,10 @@ paths:
701687 await server . stop ( ) ;
702688 } ) ;
703689
704- async function givenAServer ( options ?: { rest : RestServerConfig } ) {
690+ async function givenAServer (
691+ options : { rest : RestServerConfig } = { rest : { port : 0 } } ,
692+ ) {
693+ options . rest = givenHttpServerConfig ( options . rest ) ;
705694 const app = new Application ( options ) ;
706695 app . component ( RestComponent ) ;
707696 return await app . getServer ( RestServer ) ;
0 commit comments