Skip to content

Commit

Permalink
Merge 30df3ab into d59f405
Browse files Browse the repository at this point in the history
  • Loading branch information
chinesedfan committed Aug 8, 2018
2 parents d59f405 + 30df3ab commit 6bed2d8
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 0 deletions.
2 changes: 2 additions & 0 deletions server/api/rewrite.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ module.exports = function*(next) {
function getNowInHHMMSS() {
const now = new Date();
return [now.getHours(), now.getMinutes(), now.getSeconds()].map((v) => {
/* istanbul ignore next */
return v < 10 ? '0' + v : v;
}).join(':');
}
Expand Down Expand Up @@ -133,6 +134,7 @@ function getBodyObject(ctx) {
});
}
function getCleanCookie(cookie) {
/* istanbul ignore if */
if (!cookie) return cookie;

cookie = Cookie.removeCookieItem(cookie, Cookie.KEY_ENABLED);
Expand Down
167 changes: 167 additions & 0 deletions test/api/rewrite.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,29 @@ describe('/api/rewrite', () => {
responseBody: expectedData
}));
});
it('should handle forward error', async () => {
await request(app.callback())
.get('/api/rewrite')
.query({
url: 'http://badhost/badpath?badquery',
cookie: generateCookieItem(KEY_CLIENT_ID, 'clientid')
})
.expect(404, 'Not Found')
.expect((res) => res.body);

expect(app.mockSocket.emit).toHaveBeenCalledTimes(2);
expect(app.mockSocket.emit).nthCalledWith(1, Message.MSG_REQUEST_START, expect.objectContaining({
isMock: false,
method: 'GET',
host: 'badhost',
pathname: '/badpath',
url: 'http://badhost/badpath?badquery'
}));
expect(app.mockSocket.emit).nthCalledWith(2, Message.MSG_REQUEST_END, expect.objectContaining({
status: 500,
responseBody: expect.stringMatching(/^FetchError/)
}));
});
});
describe('mock', () => {
it('should mock if matched by `path` and `pathtype=equal`', async () => {
Expand Down Expand Up @@ -441,4 +464,148 @@ describe('/api/rewrite', () => {
.expect(`jsonp_cb(${expectedData})`);
});
});
describe('not suggested', () => {
beforeEach(async () => {
await setMockConfig(app, 'clientid', `[{
"path": ".",
"pathtype": "regexp",
"status": 200,
"response": {
"code": 200,
"msg": "mock response"
}
}]`);
});

it('should support to set protocol', async () => {
await request(app.callback())
.get('/api/rewrite')
.query({
url: '//' + host + '/api/nonexist',
cookie: generateCookieItem(KEY_CLIENT_ID, 'clientid')
})
.expect((res) => {
expect(res.body).toEqual({
code: 200,
msg: 'mock response'
});
});

expect(app.mockSocket.emit).toHaveBeenCalledTimes(2);
expect(app.mockSocket.emit).nthCalledWith(1, Message.MSG_REQUEST_START, expect.objectContaining({
isMock: true,
method: 'GET',
host,
pathname: '/api/nonexist',
url: 'http://' + host + '/api/nonexist'
}));
});
it('should support to set ip:port as host for local requests', async () => {
const queryHost = 'local.xx.com';
const ip = '123.123.123.123';
await request(app.callback())
.get('/api/rewrite')
.set('X-Forwarded-For', ip)
.query({
url: '/api/nonexist',
cookie: generateCookieItem(KEY_CLIENT_ID, 'clientid'),
host: queryHost
})
.expect((res) => {
expect(res.body).toEqual({
code: 200,
msg: 'mock response'
});
});

expect(app.mockSocket.emit).toHaveBeenCalledTimes(2);
expect(app.mockSocket.emit).nthCalledWith(1, Message.MSG_REQUEST_START, expect.objectContaining({
isMock: true,
method: 'GET',
host: `${ip}:80`,
pathname: '/api/nonexist',
url: `http://${ip}:80/api/nonexist`
}));
});
it('should support to set ip:port as host for local requests if query specified port', async () => {
const queryHost = 'local.xx.com:8888';
const ip = '123.123.123.123';
await request(app.callback())
.get('/api/rewrite')
.set('X-Forwarded-For', ip)
.query({
url: '/api/nonexist',
cookie: generateCookieItem(KEY_CLIENT_ID, 'clientid'),
host: queryHost
})
.expect((res) => {
expect(res.body).toEqual({
code: 200,
msg: 'mock response'
});
});

expect(app.mockSocket.emit).toHaveBeenCalledTimes(2);
expect(app.mockSocket.emit).nthCalledWith(1, Message.MSG_REQUEST_START, expect.objectContaining({
isMock: true,
method: 'GET',
host: `${ip}:8888`,
pathname: '/api/nonexist',
url: `http://${ip}:8888/api/nonexist`
}));
});
it('should support to set ip:port as host for local requests if deployed as https', async () => {
const queryHost = 'local.xx.com';
const ip = '123.123.123.123';
await request(app.callback())
.get('/api/rewrite')
.set('X-Forwarded-For', ip)
.set('X-Forwarded-Proto', 'https:') // hack koa context.request.protocol
.query({
url: '/api/nonexist',
cookie: generateCookieItem(KEY_CLIENT_ID, 'clientid'),
host: queryHost
})
.expect((res) => {
expect(res.body).toEqual({
code: 200,
msg: 'mock response'
});
});

expect(app.mockSocket.emit).toHaveBeenCalledTimes(2);
expect(app.mockSocket.emit).nthCalledWith(1, Message.MSG_REQUEST_START, expect.objectContaining({
isMock: true,
method: 'GET',
host: `${ip}:443`,
pathname: '/api/nonexist',
url: `https://${ip}:443/api/nonexist`
}));
});
it('should support to set host from query if not local requests', async () => {
const queryHost = 'xx.com';
await request(app.callback())
.get('/api/rewrite')
.query({
url: '/api/nonexist',
cookie: generateCookieItem(KEY_CLIENT_ID, 'clientid'),
host: queryHost
})
.expect((res) => {
expect(res.body).toEqual({
code: 200,
msg: 'mock response'
});
});

expect(app.mockSocket.emit).toHaveBeenCalledTimes(2);
expect(app.mockSocket.emit).nthCalledWith(1, Message.MSG_REQUEST_START, expect.objectContaining({
isMock: true,
method: 'GET',
host: queryHost,
pathname: '/api/nonexist',
url: 'http://' + queryHost + '/api/nonexist'
}));
});
});
});
2 changes: 2 additions & 0 deletions test/setupTestFramework.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ function prepareMiddlewares(app) {
console.error(e.stack);
}
});

app.proxy = true; // trust proxy related headers, i.e. X-Forwarded-For
}
function prepareSocketIO(app) {
const socket = {
Expand Down

0 comments on commit 6bed2d8

Please sign in to comment.