import request from 'supertest';
import { join } from 'path';
import warp, {
Controller,
Get,
FileResponse,
JSONResponse,
NextResponse,
RedirectResponse,
RenderResponse,
Param,
SimpleResponse
} from '../../src';
describe('responses', () => {
test('file response', async () => {
@Controller('/')
class IndexController {
@Get('/')
html() {
return new FileResponse(join(__dirname, '__fixtures__/something.html'), undefined, 202, {
'Custom-Header': 'Yup'
});
}
@Get('/defaults')
defaults() {
return new FileResponse(join(__dirname, '__fixtures__/something.html'));
}
}
let app = warp({
controllers: [IndexController]
});
let response1 = await request(app).get('/');
expect(response1.status).toEqual(202);
expect(response1.get('Content-Type')).toMatch(/html/);
expect(response1.get('Custom-Header')).toEqual('Yup');
expect(response1.text).toEqual('
Hello world
');
let response2 = await request(app).get('/defaults');
expect(response2.status).toEqual(200);
expect(response2.get('Content-Type')).toMatch(/html/);
expect(response2.text).toEqual('Hello world
');
});
test('json response', async () => {
@Controller('/')
class IndexController {
@Get('/object')
object() {
return new JSONResponse(
{
hello: 'world'
},
202,
{
'Custom-Header': 'Yup'
}
);
}
@Get('/array')
array() {
return new JSONResponse(['1', 2, true]);
}
@Get('/value')
value() {
return new JSONResponse('42');
}
}
let app = warp({
controllers: [IndexController]
});
let responseObject = await request(app).get('/object');
expect(responseObject.status).toEqual(202);
expect(responseObject.get('Content-Type')).toMatch(/json/);
expect(responseObject.get('Custom-Header')).toEqual('Yup');
expect(responseObject.text).toEqual(
JSON.stringify({
hello: 'world'
})
);
let responseArray = await request(app).get('/array');
expect(responseArray.status).toEqual(200);
expect(responseArray.get('Content-Type')).toMatch(/json/);
expect(responseArray.text).toEqual(JSON.stringify(['1', 2, true]));
let responseValue = await request(app).get('/value');
expect(responseValue.status).toEqual(200);
expect(responseValue.get('Content-Type')).toMatch(/json/);
expect(responseValue.text).toEqual('"42"');
});
test('simple response', async () => {
@Controller('/')
class IndexController {
@Get('/json')
object() {
return new SimpleResponse(
{
hello: 'world'
},
202,
{
'Custom-Header': 'Yup'
}
);
}
@Get('/string')
value() {
return new SimpleResponse('hello');
}
}
let app = warp({
controllers: [IndexController]
});
let responseJson = await request(app).get('/json');
expect(responseJson.status).toEqual(202);
expect(responseJson.get('Content-Type')).toMatch(/json/);
expect(responseJson.get('Custom-Header')).toEqual('Yup');
expect(responseJson.text).toEqual(
JSON.stringify({
hello: 'world'
})
);
let responseString = await request(app).get('/string');
expect(responseString.status).toEqual(200);
expect(responseString.get('Content-Type')).toMatch(/text/);
expect(responseString.text).toEqual('hello');
});
test('next response', async () => {
@Controller('/')
class IndexController {
@Get('/')
next() {
return new NextResponse();
}
}
let app = warp({
controllers: [IndexController],
middleware: [
{
execution: 'after',
middleware: (req, res, next) => {
res.send('hello from the middleware');
next();
}
}
]
});
let response = await request(app).get('/');
expect(response.status).toEqual(200);
expect(response.text).toEqual('hello from the middleware');
});
test('redirect response', async () => {
@Controller('/')
class IndexController {
@Get('/')
redirect() {
return new RedirectResponse('/other', 307, {
'changed-path': 'yes'
});
}
@Get('/default')
default() {
return new RedirectResponse('/other');
}
}
let app = warp({
controllers: [IndexController]
});
let response1 = await request(app).get('/');
expect(response1.status).toEqual(307);
expect(response1.get('changed-path')).toEqual('yes');
expect(response1.text).toEqual('Temporary Redirect. Redirecting to /other');
let response2 = await request(app).get('/default');
expect(response2.status).toEqual(302);
expect(response2.text).toEqual('Found. Redirecting to /other');
});
test('render response', async () => {
@Controller('/')
class IndexController {
@Get('/:name')
render(@Param('name') name: string) {
return new RenderResponse(
join(__dirname, '__fixtures__/view.hbs'),
{
name
},
202,
{
dynamic: 'yes'
}
);
}
@Get('/default/:name')
default(@Param('name') name: string) {
return new RenderResponse(join(__dirname, '__fixtures__/view.hbs'), {
name
});
}
}
let app = warp({
controllers: [IndexController]
});
app.set('view engine', 'hbs');
let response1 = await request(app).get('/john');
expect(response1.status).toEqual(202);
expect(response1.get('dynamic')).toEqual('yes');
expect(response1.get('Content-Type')).toMatch(/html/);
expect(response1.text).toEqual('Hello john
');
let response2 = await request(app).get('/default/john');
expect(response2.status).toEqual(200);
expect(response2.get('Content-Type')).toMatch(/html/);
expect(response2.text).toEqual('Hello john
');
});
});