123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- // this lets us run tests in ancient node versions (v0.10.x)
- if (process.version.split('.')[0] == 'v0' && !Buffer.from) {
- Buffer.from = function(args) {
- return new Buffer(args);
- }
- }
- var should = require('should'),
- needle = require('./../'),
- http = require('http'),
- sinon = require('sinon'),
- stream = require('stream'),
- fs = require('fs'),
- port = 11111,
- server;
- describe('with output option', function() {
- var server, handler, file = '/tmp/foobar.out';
- function send_request_cb(where, cb) {
- var url = 'http://localhost:' + port + '/whatever.file';
- return needle.get(url, { output: where }, cb);
- }
- function send_request_stream(where, cb) {
- var url = 'http://localhost:' + port + '/whatever.file';
- var stream = needle.get(url, { output: where });
- stream.on('end', cb);
- }
- // this will only work in UNICES
- function get_open_file_descriptors() {
- var list = fs.readdirSync('/proc/self/fd');
- return list.length;
- }
- var send_request = send_request_cb;
- before(function(){
- server = http.createServer(function(req, res) {
- handler(req, res);
- }).listen(port);
- });
- after(function() {
- server.close();
- })
- beforeEach(function() {
- try { fs.unlinkSync(file) } catch(e) { };
- })
- describe('and a 404 response', function() {
- before(function() {
- handler = function(req, res) {
- res.writeHead(404, {'Content-Type': 'text/plain' });
- res.end();
- }
- })
- it('doesnt attempt to write a file', function(done) {
- var spy = sinon.spy(fs, 'createWriteStream');
- send_request(file, function(err, resp) {
- resp.statusCode.should.eql(404);
- spy.called.should.eql(false);
- spy.restore();
- done();
- })
- })
- it('doesnt actually write a file', function(done) {
- send_request(file, function(err, resp) {
- resp.statusCode.should.eql(404);
- fs.existsSync(file).should.eql(false);
- done();
- })
- })
- })
- describe('and a 200 response', function() {
- describe('for an empty response', function() {
- before(function() {
- handler = function(req, res) {
- res.writeHead(200, { 'Content-Type': 'text/plain' });
- res.end();
- }
- })
- it('uses a writableStream', function(done) {
- var spy = sinon.spy(fs, 'createWriteStream');
- send_request(file, function(err, resp) {
- resp.statusCode.should.eql(200);
- spy.called.should.eql(true);
- spy.restore();
- done();
- })
- })
- it('writes a file', function(done) {
- fs.existsSync(file).should.eql(false);
- send_request(file, function(err, resp) {
- fs.existsSync(file).should.eql(true);
- done();
- })
- })
- it('file is zero bytes in length', function(done) {
- send_request(file, function(err, resp) {
- fs.statSync(file).size.should.equal(0);
- done();
- })
- })
- if (process.platform == 'linux') {
- it('closes the file descriptor', function(done) {
- var open_descriptors = get_open_file_descriptors();
- send_request(file + Math.random(), function(err, resp) {
- var current_descriptors = get_open_file_descriptors();
- open_descriptors.should.eql(current_descriptors);
- done()
- })
- })
- }
- })
- describe('for a JSON response', function() {
- before(function() {
- handler = function(req, res) {
- res.writeHead(200, { 'Content-Type': 'application/javascript' });
- res.end(JSON.stringify({foo: 'bar'}));
- }
- })
- it('uses a writableStream', function(done) {
- var spy = sinon.spy(fs, 'createWriteStream');
- send_request(file, function(err, resp) {
- resp.statusCode.should.eql(200);
- spy.called.should.eql(true);
- spy.restore();
- done();
- })
- })
- it('writes a file', function(done) {
- fs.existsSync(file).should.eql(false);
- send_request(file, function(err, resp) {
- fs.existsSync(file).should.eql(true);
- done();
- })
- })
- it('file size equals response length', function(done) {
- send_request(file, function(err, resp) {
- fs.statSync(file).size.should.equal(resp.bytes);
- done();
- })
- })
- it('response pipeline is honoured (JSON is decoded by default)', function(done) {
- send_request_stream(file, function(err, resp) {
- // we need to wait a bit since writing to config.output
- // happens independently of needle's callback logic.
- setTimeout(function() {
- fs.readFileSync(file).toString().should.eql('{\"foo\":\"bar\"}');
- done();
- }, 20);
- })
- })
- if (process.platform == 'linux') {
- it('closes the file descriptor', function(done) {
- var open_descriptors = get_open_file_descriptors();
- send_request(file + Math.random(), function(err, resp) {
- var current_descriptors = get_open_file_descriptors();
- open_descriptors.should.eql(current_descriptors);
- done()
- })
- })
- }
- })
- describe('for a binary file', function() {
- var pixel = Buffer.from("base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs", "base64");
- before(function() {
- handler = function(req, res) {
- res.writeHead(200, { 'Content-Type': 'application/octet-stream', 'Transfer-Encoding': 'chunked' });
- res.write(pixel.slice(0, 10));
- res.write(pixel.slice(10, 20));
- res.write(pixel.slice(20, 30));
- res.write(pixel.slice(30));
- res.end();
- }
- })
- it('uses a writableStream', function(done) {
- var spy = sinon.spy(fs, 'createWriteStream');
- send_request(file, function(err, resp) {
- resp.statusCode.should.eql(200);
- spy.called.should.eql(true);
- spy.restore();
- done();
- })
- })
- it('writes a file', function(done) {
- fs.existsSync(file).should.eql(false);
- send_request(file, function(err, resp) {
- fs.existsSync(file).should.eql(true);
- done();
- })
- })
- it('file size equals response length', function(done) {
- send_request(file, function(err, resp) {
- fs.statSync(file).size.should.equal(resp.bytes);
- done();
- })
- })
- it('file is equal to original buffer', function(done) {
- send_request(file, function(err, resp) {
- // we need to wait a bit since writing to config.output
- // happens independently of needle's callback logic.
- setTimeout(function() {
- fs.readFileSync(file).should.eql(pixel);
- done();
- }, 20);
- })
- })
- it('returns the data in resp.body too', function(done) {
- send_request(file, function(err, resp) {
- resp.body.should.eql(pixel);
- done();
- })
- })
- if (process.platform == 'linux') {
- it('closes the file descriptor', function(done) {
- var open_descriptors = get_open_file_descriptors();
- send_request(file + Math.random(), function(err, resp) {
- var current_descriptors = get_open_file_descriptors();
- open_descriptors.should.eql(current_descriptors);
- done()
- })
- })
- }
- })
- })
- })
|