Comparing version 0.1.7 to 0.2.0
@@ -26,6 +26,10 @@ var path = require('path') | ||
var req = new EventEmitter() | ||
, requestBodyBuffers = []; | ||
, response = new EventEmitter() | ||
, requestBodyBuffers = [] | ||
, aborted | ||
, end | ||
, ended; | ||
req.write = function(buffer, encoding) { | ||
if (buffer) { | ||
if (buffer && !aborted) { | ||
if (! Buffer.isBuffer(buffer)) { | ||
@@ -39,12 +43,27 @@ buffer = new Buffer(buffer, encoding); | ||
req.end = function(buffer, encoding) { | ||
req.write(buffer, encoding); | ||
req.emit('end'); | ||
if (!aborted && !ended) { | ||
req.write(buffer, encoding); | ||
end(); | ||
req.emit('end'); | ||
} | ||
}; | ||
req.on('end', function() { | ||
var response = new EventEmitter() | ||
, encoding | ||
req.abort = function() { | ||
aborted = true; | ||
if (!ended) { | ||
end(); | ||
} | ||
var err = new Error(); | ||
err.code = 'aborted' | ||
response.emit('close', err); | ||
}; | ||
end = function() { | ||
ended = true; | ||
var encoding | ||
, requestBody | ||
, responseBody | ||
, interceptor; | ||
, interceptor | ||
, paused | ||
, next = []; | ||
@@ -62,3 +81,3 @@ requestBody = requestBodyBuffers.map(function(buffer) { | ||
interceptor = interceptors.splice(0, 1)[0]; | ||
response.statusCode = interceptor.statusCode || 200; | ||
@@ -74,16 +93,41 @@ response.headers = interceptor.headers || {}; | ||
interceptor.discard(); | ||
if (aborted) { return; } | ||
response.pause = function() { | ||
paused = true; | ||
}; | ||
response.resume = function() { | ||
paused = false; | ||
callnext(); | ||
}; | ||
next.push(function() { | ||
if (encoding) { | ||
responseBody = responseBody.toString(encoding); | ||
} | ||
response.emit('data', responseBody); | ||
}); | ||
next.push(function() { | ||
response.emit('end'); | ||
}); | ||
callnext = function() { | ||
if (paused || next.length === 0 || aborted) { return; } | ||
process.nextTick(function() { | ||
next.shift()(); | ||
callnext(); | ||
}); | ||
}; | ||
process.nextTick(function() { | ||
callback(response); | ||
process.nextTick(function() { | ||
if (encoding) { | ||
responseBody = responseBody.toString(encoding); | ||
} | ||
response.emit('data', responseBody); | ||
process.nextTick(function() { | ||
response.emit('end'); | ||
}); | ||
}); | ||
if (typeof callback === 'function') { | ||
callback(response); | ||
} | ||
req.emit('response', response); | ||
callnext(); | ||
}); | ||
}); | ||
}; | ||
@@ -106,2 +150,2 @@ return req; | ||
module.exports = addGlobalInterceptor; | ||
module.exports = addGlobalInterceptor; |
@@ -45,4 +45,4 @@ var path = require('path') | ||
this.statusCode = statusCode; | ||
if (typeof(body) !== 'string') { | ||
if (typeof(body) !== 'string' && !Buffer.isBuffer(body)) { | ||
try { | ||
@@ -62,3 +62,3 @@ body = JSON.stringify(body); | ||
function replyWithFile(statusCode, filePath, headers) { | ||
return reply.call(this, statusCode, fs.readFileSync(filePath, 'utf8'), headers); | ||
return reply.call(this, statusCode, fs.readFileSync(filePath), headers); | ||
} | ||
@@ -189,2 +189,2 @@ | ||
module.exports = startScope; | ||
module.exports = startScope; |
{ "name" : "nock" | ||
, "description" : "HTTP Server mocking for Node.js" | ||
, "tags" : ["Mock", "HTTP", "testing", "isolation"] | ||
, "version" : "0.1.7" | ||
, "version" : "0.2.0" | ||
, "author" : "Pedro Teixeira <pedro.teixeira@gmail.com>" | ||
@@ -6,0 +6,0 @@ , "repository" : |
@@ -442,2 +442,89 @@ var nock = require('../.') | ||
req.end('mamma mia'); | ||
}); | ||
}); | ||
tap.test("abort request", function(t) { | ||
var scope = nock('http://www.google.com') | ||
.get('/hey') | ||
.reply(200, 'nobody'); | ||
var req = http.request({ | ||
host: 'www.google.com' | ||
, path: '/hey' | ||
}); | ||
req.on('response', function(res) { | ||
res.on('close', function(err) { | ||
t.equal(err.code, 'aborted'); | ||
scope.done(); | ||
t.end(); | ||
}); | ||
res.on('end', function() { | ||
t.true(false, 'this should never execute'); | ||
}); | ||
req.abort(); | ||
}); | ||
req.end(); | ||
}); | ||
tap.test("pause response before data", function(t) { | ||
var scope = nock('http://www.mouse.com') | ||
.get('/pauser') | ||
.reply(200, 'nobody'); | ||
var req = http.request({ | ||
host: 'www.mouse.com' | ||
, path: '/pauser' | ||
}); | ||
req.on('response', function(res) { | ||
res.pause(); | ||
var waited = false; | ||
setTimeout(function() { | ||
waited = true; | ||
res.resume(); | ||
}, 500); | ||
res.on('data', function(data) { | ||
t.true(waited); | ||
}); | ||
res.on('end', function() { | ||
scope.done(); | ||
t.end(); | ||
}); | ||
}); | ||
req.end(); | ||
}); | ||
tap.test("pause response after data", function(t) { | ||
var scope = nock('http://pauseme.com') | ||
.get('/') | ||
.reply(200, 'nobody'); | ||
var req = http.get({ | ||
host: 'pauseme.com' | ||
, path: '/' | ||
}, function(res) { | ||
var waited = false; | ||
setTimeout(function() { | ||
waited = true; | ||
res.resume(); | ||
}, 500); | ||
res.on('data', function(data) { | ||
t.false(waited); | ||
res.pause(); | ||
}); | ||
res.on('end', function() { | ||
t.true(waited); | ||
scope.done(); | ||
t.end(); | ||
}); | ||
}); | ||
}); |
24681
715