diff --git a/package.json b/package.json index fd8f4a4aa02..fb968c2ad5a 100644 --- a/package.json +++ b/package.json @@ -65,13 +65,13 @@ "istanbul": "^0.3.0", "jshint": "^2.5.2", "mocha": "^2.0.1", - "sandboxed-module": "^1.0.1", + "mockery": "^1.4.0", "tmp": "0.0.24" }, "scripts": { "docs": "./scripts/docs.sh", "lint": "jshint lib/ regression/ test/", - "test": "mocha --recursive", + "test": "mocha test/*", "regression-test": "mocha regression/* --timeout 20000", "cover": "istanbul cover -x 'regression/*' _mocha -- --timeout 20000 test/* regression/*", "coveralls": "istanbul cover -x 'regression/*' _mocha --report lcovonly -- --timeout 20000 test/* regression/* -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage" diff --git a/test/bigquery/index.js b/test/bigquery/index.js index a10427e78f5..5840eb15b47 100644 --- a/test/bigquery/index.js +++ b/test/bigquery/index.js @@ -14,52 +14,27 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); -var Dataset = require('../../lib/bigquery/dataset'); -var Job = require('../../lib/bigquery/job'); -var request = require('request'); +var mockery = require('mockery'); var Stream = require('stream').Stream; var Table = require('../../lib/bigquery/table'); var util = require('../../lib/common/util'); -var BigQuery = require('sandboxed-module') - .require('../../lib/bigquery', { - requires: { - './dataset': Dataset, - './job': Job, - './table': FakeTable, - request: fakeRequest, - 'google-service-account': fakeGsa - } - }); - -var mergeSchemaWithRows_Cached = Table.mergeSchemaWithRows_; -var mergeSchemaWithRows_Override; - function FakeTable(a, b) { Table.call(this, a, b); } +var mergeSchemaWithRows_Override; FakeTable.mergeSchemaWithRows_ = function() { var args = [].slice.apply(arguments); - return (mergeSchemaWithRows_Override || mergeSchemaWithRows_Cached) + return (mergeSchemaWithRows_Override || Table.mergeSchemaWithRows_) .apply(null, args); }; -var request_Cached = request; -var request_Override; - -function fakeRequest() { - var args = [].slice.apply(arguments); - var results = (request_Override || request_Cached).apply(null, args); - request_Override = null; - return results; -} - function fakeGsa() { return function(req, callback) { callback(null, req); @@ -69,8 +44,25 @@ function fakeGsa() { describe('BigQuery', function() { var JOB_ID = JOB_ID; var PROJECT_ID = 'test-project'; + + var BigQuery; var bq; + before(function() { + mockery.registerMock('./table.js', FakeTable); + mockery.registerMock('google-service-account', fakeGsa); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + BigQuery = require('../../lib/bigquery'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { bq = new BigQuery({ projectId: PROJECT_ID }); }); @@ -110,7 +102,7 @@ describe('BigQuery', function() { }; bq.createDataset(DATASET_ID, function(err, dataset) { assert.ifError(err); - assert(dataset instanceof Dataset); + assert.equal(dataset.constructor.name, 'Dataset'); done(); }); }); @@ -133,7 +125,7 @@ describe('BigQuery', function() { it('returns a Dataset instance', function() { var ds = bq.dataset(DATASET_ID); - assert(ds instanceof Dataset); + assert.equal(ds.constructor.name, 'Dataset'); }); it('should scope the correct dataset', function() { @@ -183,7 +175,7 @@ describe('BigQuery', function() { }; bq.getDatasets(function(err, datasets) { assert.ifError(err); - assert(datasets[0] instanceof Dataset); + assert.equal(datasets[0].constructor.name, 'Dataset'); done(); }); }); @@ -266,7 +258,7 @@ describe('BigQuery', function() { }; bq.getJobs(function(err, jobs) { assert.ifError(err); - assert(jobs[0] instanceof Job); + assert.equal(jobs[0].constructor.name, 'Job'); done(); }); }); @@ -300,7 +292,7 @@ describe('BigQuery', function() { describe('job', function() { it('should return a Job instance', function() { var job = bq.job(JOB_ID); - assert(job instanceof Job); + assert.equal(job.constructor.name, 'Job'); }); it('should scope the correct job', function() { @@ -377,7 +369,7 @@ describe('BigQuery', function() { it('should populate nextQuery when job is incomplete', function(done) { bq.query({}, function(err, rows, nextQuery) { assert.ifError(err); - assert(nextQuery.job instanceof Job); + assert.equal(nextQuery.job.constructor.name, 'Job'); assert.equal(nextQuery.job.id, JOB_ID); done(); }); @@ -408,7 +400,7 @@ describe('BigQuery', function() { it('should populate nextQuery when more results exist', function(done) { bq.query(options, function(err, rows, nextQuery) { assert.ifError(err); - assert(nextQuery.job instanceof Job); + assert.equal(nextQuery.job.constructor.name, 'Job'); assert.equal(nextQuery.job.id, JOB_ID); assert.equal(nextQuery.pageToken, pageToken); done(); @@ -663,7 +655,7 @@ describe('BigQuery', function() { bq.startQuery('query', function(err, job) { assert.ifError(err); - assert(job instanceof Job); + assert.equal(job.constructor.name, 'Job'); assert.equal(job.id, JOB_ID); assert.deepEqual(job.metadata, jobsResource); done(); @@ -678,7 +670,7 @@ describe('BigQuery', function() { var body = { hi: 'there' }; it('should make correct request', function(done) { - request_Override = function(request) { + bq.makeAuthorizedRequest_ = function(request) { var basePath = 'https://www.googleapis.com/bigquery/v2/projects/'; assert.equal(request.method, method); assert.equal(request.uri, basePath + bq.projectId + path); @@ -690,7 +682,7 @@ describe('BigQuery', function() { }); it('should execute callback', function(done) { - request_Override = function(request, callback) { + bq.makeAuthorizedRequest_ = function(request, callback) { callback(); }; bq.makeReq_(method, path, query, body, done); diff --git a/test/bigquery/table.js b/test/bigquery/table.js index bae5e5c0faa..373d7462ab3 100644 --- a/test/bigquery/table.js +++ b/test/bigquery/table.js @@ -14,16 +14,15 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); var extend = require('extend'); var File = require('../../lib/storage/file'); -var Stream = require('stream'); -var sandbox = require('sandboxed-module'); -var through = require('through2'); +var mockery = require('mockery'); +var stream = require('stream'); var util = require('../../lib/common/util'); function FakeFile(a, b) { @@ -35,14 +34,6 @@ var fakeUtil = extend({}, util, { makeWritableStream: function() { var args = [].slice.call(arguments); (makeWritableStream_Override || util.makeWritableStream).apply(null, args); - makeWritableStream_Override = null; - } -}); - -var Table = sandbox.require('../../lib/bigquery/table', { - requires: { - '../storage/file': FakeFile, - '../common/util': fakeUtil } }); @@ -54,7 +45,7 @@ describe('BigQuery/Table', function() { job: function(id) { return { id: id }; }, - projectId: 'project-id', + projectId: 'project-id' } }; @@ -68,10 +59,27 @@ describe('BigQuery/Table', function() { }; var SCHEMA_STRING = 'id:integer,breed,name,dob:timestamp'; + var Table; var TABLE_ID = 'kittens'; var table; + before(function() { + mockery.registerMock('../storage/file', FakeFile); + mockery.registerMock('../common/util', fakeUtil); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + Table = require('../../lib/bigquery/table'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { + makeWritableStream_Override = null; table = new Table(DATASET, TABLE_ID); }); @@ -111,7 +119,11 @@ describe('BigQuery/Table', function() { }); describe('copy', function() { - var DEST_TABLE = new Table(DATASET, 'destination-table'); + var DEST_TABLE; + + before(function() { + DEST_TABLE = new Table(DATASET, 'destination-table'); + }); it('should throw if a destination is not a Table', function() { assert.throws(function() { @@ -208,7 +220,7 @@ describe('BigQuery/Table', function() { describe('createReadStream', function() { it('should return a stream', function() { - assert(table.createReadStream() instanceof Stream); + assert(table.createReadStream() instanceof stream.Stream); }); it('should call getRows() when asked for data', function(done) { @@ -326,7 +338,7 @@ describe('BigQuery/Table', function() { }); it('should return a stream', function() { - assert(table.createWriteStream() instanceof Stream); + assert(table.createWriteStream() instanceof stream.Stream); }); describe('writable stream', function() { @@ -686,30 +698,34 @@ describe('BigQuery/Table', function() { it('should accept just a File and a callback', function(done) { table.createWriteStream = function() { - var stream = through(); + var ws = new stream.Writable(); setImmediate(function() { - stream.emit('complete'); + ws.emit('complete'); + ws.end(); }); - return stream; + return ws; }; table.import(FILEPATH, done); }); it('should return a stream when a string is given', function() { - table.createWriteStream = through; + table.createWriteStream = function() { + return new stream.Writable(); + }; - assert(table.import(FILEPATH) instanceof Stream); + assert(table.import(FILEPATH) instanceof stream.Stream); }); it('should infer the file format from the given filepath', function(done) { table.createWriteStream = function(metadata) { assert.equal(metadata.sourceFormat, 'NEWLINE_DELIMITED_JSON'); - var stream = through(); + var ws = new stream.Writable(); setImmediate(function() { - stream.emit('complete'); + ws.emit('complete'); + ws.end(); }); - return stream; + return ws; }; table.import(FILEPATH, done); @@ -718,11 +734,12 @@ describe('BigQuery/Table', function() { it('should not infer the file format if one is given', function(done) { table.createWriteStream = function(metadata) { assert.equal(metadata.sourceFormat, 'CSV'); - var stream = through(); + var ws = new stream.Writable(); setImmediate(function() { - stream.emit('complete'); + ws.emit('complete'); + ws.end(); }); - return stream; + return ws; }; table.import(FILEPATH, { sourceFormat: 'CSV' }, done); diff --git a/test/common/util.js b/test/common/util.js index 44d4ab0fbac..b8fd7348c0d 100644 --- a/test/common/util.js +++ b/test/common/util.js @@ -14,42 +14,51 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); var duplexify = require('duplexify'); var gsa = require('google-service-account'); +var mockery = require('mockery'); var request = require('request'); - -var util = require('sandboxed-module') - .require('../../lib/common/util', { - requires: { - 'google-service-account': fakeGsa, - request: fakeRequest - } - }); +var stream = require('stream'); var gsa_Override; function fakeGsa() { var args = [].slice.apply(arguments); var results = (gsa_Override || gsa).apply(null, args); - gsa_Override = null; - return results || { getCredentials: util.noop }; + return results || { getCredentials: function() {} }; } var request_Override; function fakeRequest() { var args = [].slice.apply(arguments); - var results = (request_Override || request).apply(null, args); - request_Override = null; - return results; + return (request_Override || request).apply(null, args); } describe('common/util', function() { + var util; + + before(function() { + mockery.registerMock('google-service-account', fakeGsa); + mockery.registerMock('request', fakeRequest); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + util = require('../../lib/common/util'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { gsa_Override = null; + request_Override = null; }); describe('arrayize', function() { @@ -163,13 +172,13 @@ describe('common/util', function() { it('should emit an error', function(done) { var error = new Error('Error.'); - var dup = duplexify(); - dup.on('error', function(err) { + var ws = new stream.Writable(); + ws.on('error', function(err) { assert.equal(err, error); done(); }); - util.makeWritableStream(dup, { + util.makeWritableStream(ws, { makeAuthorizedRequest: function(request, opts) { opts.onAuthorized(error); } @@ -226,14 +235,15 @@ describe('common/util', function() { it('should set the writable stream', function(done) { var dup = duplexify(); - var stream = duplexify(); + var ws = new stream.Writable(); + ws.write = function() {}; request_Override = function() { - return stream; + return ws; }; dup.setWritable = function(writable) { - assert.equal(writable, stream); + assert.equal(writable, ws); done(); }; @@ -246,14 +256,15 @@ describe('common/util', function() { it('should keep the pipe open on the stream', function(done) { var dup = duplexify(); - var stream = duplexify(); + var ws = new stream.Writable(); + ws.write = function() {}; request_Override = function() { - return stream; + return ws; }; dup.pipe = function(writable) { - assert.equal(writable, stream); + assert.equal(writable, ws); done(); }; diff --git a/test/datastore/index.js b/test/datastore/index.js index e39377c7f8b..e15fedb0683 100644 --- a/test/datastore/index.js +++ b/test/datastore/index.js @@ -14,7 +14,7 @@ * limitations under the License. */ -/*global describe, it */ +/*global describe, it, before, after */ 'use strict'; @@ -30,14 +30,25 @@ var entity = { }; var assert = require('assert'); -var datastore = require('sandboxed-module') - .require('../../lib/datastore/index.js', { - requires: { - './entity': entity - } - }); +var mockery = require('mockery'); describe('Datastore', function() { + var datastore; + + before(function() { + mockery.registerMock('./entity', entity); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + datastore = require('../../lib/datastore/index.js'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + it('should expose Dataset class', function() { assert.equal(typeof datastore.dataset, 'function'); }); diff --git a/test/datastore/request.js b/test/datastore/request.js index 4226d51a108..488fd71c5d4 100644 --- a/test/datastore/request.js +++ b/test/datastore/request.js @@ -14,20 +14,20 @@ * limitations under the License. */ -/*global describe, it, beforeEach, after */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); var ByteBuffer = require('bytebuffer'); -var duplexify = require('duplexify'); var entity = require('../../lib/datastore/entity.js'); var extend = require('extend'); var https = require('https'); +var mockery = require('mockery'); var mockRespGet = require('../testdata/response_get.json'); var pb = require('../../lib/datastore/pb.js'); var Query = require('../../lib/datastore/query.js'); -var Stream = require('stream'); +var stream = require('stream'); var util = require('../../lib/common/util.js'); var httpsRequestCached = https.request; @@ -35,9 +35,7 @@ var httpsRequestOverride = util.noop; extend(true, https, { request: function() { - var requestFn = httpsRequestOverride; - httpsRequestOverride = util.noop; - return requestFn.apply(this, util.toArray(arguments)); + return httpsRequestOverride.apply(this, util.toArray(arguments)); } }); @@ -56,19 +54,29 @@ pb.FakeMethodResponse = { } }; -var Request = require('sandboxed-module') - .require('../../lib/datastore/request.js', { - requires: { - './pb.js': pb, - https: https - } - }); - describe('Request', function() { + var Request; var key; var request; + before(function() { + mockery.registerMock('./pb.js', pb); + mockery.registerMock('https', https); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + Request = require('../../lib/datastore/request.js'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + httpsRequestOverride = httpsRequestCached; + }); + beforeEach(function() { + httpsRequestOverride = util.noop; key = new entity.Key({ namespace: 'namespace', path: ['Company', 123] @@ -79,10 +87,6 @@ describe('Request', function() { }; }); - after(function() { - https.request = httpsRequestCached; - }); - describe('get', function() { it('should get by key', function(done) { request.makeReq_ = function(method, req, callback) { @@ -360,7 +364,7 @@ describe('Request', function() { describe('streams', function() { it('should be a stream if a callback is omitted', function() { - assert(request.runQuery(query) instanceof Stream); + assert(request.runQuery(query) instanceof stream.Stream); }); it('should run the query after being read from', function(done) { @@ -491,7 +495,7 @@ describe('Request', function() { httpsRequestOverride = function(req) { assert.deepEqual(req, mockRequest); done(); - return duplexify(); + return new stream.Writable(); }; request.makeAuthorizedRequest_ = function(opts, callback) { (callback.onAuthorized || callback)(null, mockRequest); @@ -518,10 +522,10 @@ describe('Request', function() { done(); }; httpsRequestOverride = function(req, callback) { - var responseStream = duplexify(); - callback(responseStream); - responseStream.emit('end'); - return duplexify(); + var ws = new stream.Writable(); + callback(ws); + ws.emit('end'); + return ws; }; request.makeReq_('fakeMethod', util.noop); }); @@ -591,12 +595,12 @@ describe('Request', function() { it('should not attach transactional properties', function(done) { var expected = new pb.LookupRequest().toBuffer(); httpsRequestOverride = function() { - var stream = { on: util.noop, end: util.noop }; - stream.write = function(data) { + var ws = new stream.Writable(); + ws.write = function(data) { assert.deepEqual(data, expected); done(); }; - return stream; + return ws; }; request.makeReq_('lookup', util.noop); }); diff --git a/test/datastore/transaction.js b/test/datastore/transaction.js index 76ef2bad16b..182d4275934 100644 --- a/test/datastore/transaction.js +++ b/test/datastore/transaction.js @@ -14,14 +14,14 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); var entity = require('../../lib/datastore/entity.js'); var extend = require('extend'); -var Transaction = require('../../lib/datastore/transaction.js'); +var mockery = require('mockery'); var util = require('../../lib/common/util.js'); var DatastoreRequest_Override = { @@ -47,14 +47,8 @@ var FakeDatastoreRequest = { } }; -var Transaction = require('sandboxed-module') - .require('../../lib/datastore/transaction.js', { - requires: { - './request.js': FakeDatastoreRequest - } - }); - describe('Transaction', function() { + var Transaction; var transaction; var TRANSACTION_ID = 'transaction-id'; @@ -62,6 +56,20 @@ describe('Transaction', function() { return new entity.Key({ path: util.arrayize(path) }); } + before(function() { + mockery.registerMock('./request.js', FakeDatastoreRequest); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + Transaction = require('../../lib/datastore/transaction.js'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { transaction = new Transaction({ authorizeReq_: function(req, callback) { diff --git a/test/pubsub/index.js b/test/pubsub/index.js index 87705f568f5..cb2940e47e2 100644 --- a/test/pubsub/index.js +++ b/test/pubsub/index.js @@ -14,39 +14,48 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); +var mockery = require('mockery'); var request = require('request'); var Subscription = require('../../lib/pubsub/subscription.js'); var Topic = require('../../lib/pubsub/topic.js'); -var PubSub = require('sandboxed-module') - .require('../../lib/pubsub', { - requires: { - './subscription': Subscription, - './topic': Topic, - request: fakeRequest - } - }); - var request_Cached = request; var request_Override; function fakeRequest() { var args = [].slice.apply(arguments); var results = (request_Override || request_Cached).apply(null, args); - request_Override = null; return results; } describe('PubSub', function() { + var PubSub; var PROJECT_ID = 'test-project'; var pubsub; + before(function() { + mockery.registerMock('./subscription.js', Subscription); + mockery.registerMock('./topic.js', Topic); + mockery.registerMock('request', fakeRequest); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + PubSub = require('../../lib/pubsub'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { + request_Override = null; pubsub = new PubSub({ projectId: PROJECT_ID }); pubsub.makeReq_ = function(method, path, q, body, callback) { callback(); diff --git a/test/pubsub/topic.js b/test/pubsub/topic.js index 52514733626..2425b67c804 100644 --- a/test/pubsub/topic.js +++ b/test/pubsub/topic.js @@ -14,11 +14,12 @@ * limitations under the License. */ -/*global describe, it, beforeEach, afterEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); +var mockery = require('mockery'); var util = require('../../lib/common/util.js'); var SubscriptionCached = require('../../lib/pubsub/subscription.js'); @@ -36,14 +37,8 @@ Subscription.formatName_ = function() { return (formatName_Override || formatName_Cached).apply(null, args); }; -var Topic = require('sandboxed-module') - .require('../../lib/pubsub/topic.js', { - requires: { - './subscription.js': Subscription - } - }); - describe('Topic', function() { + var Topic; var PROJECT_ID = 'test-project'; var TOPIC_NAME = 'test-topic'; var pubsubMock = { @@ -52,13 +47,24 @@ describe('Topic', function() { }; var topic; - beforeEach(function() { - topic = new Topic(pubsubMock, { name: TOPIC_NAME }); + before(function() { + mockery.registerMock('./subscription.js', Subscription); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + Topic = require('../../lib/pubsub/topic'); }); - afterEach(function() { + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + + beforeEach(function() { SubscriptionOverride = null; formatName_Override = null; + topic = new Topic(pubsubMock, { name: TOPIC_NAME }); }); describe('initialization', function() { diff --git a/test/storage/bucket.js b/test/storage/bucket.js index cb94a90b631..5718e196826 100644 --- a/test/storage/bucket.js +++ b/test/storage/bucket.js @@ -14,13 +14,14 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; var assert = require('assert'); -var duplexify = require('duplexify'); +var mockery = require('mockery'); var request = require('request'); +var stream = require('stream'); var util = require('../../lib/common/util.js'); function FakeFile(bucket, name, metadata) { @@ -29,33 +30,25 @@ function FakeFile(bucket, name, metadata) { this.metadata = metadata; this.createWriteStream = function(options) { this.metadata = options.metadata; - var dup = duplexify(); - dup._write = function() { - dup.emit('complete'); + var ws = new stream.Writable(); + ws.write = function() { + ws.emit('complete'); + ws.end(); }; - return dup; + return ws; }; } -var Bucket = require('sandboxed-module') - .require('../../lib/storage/bucket.js', { - requires: { - './file.js': FakeFile, - request: fakeRequest - } - }); - var request_Cached = request; var request_Override; function fakeRequest() { var args = [].slice.apply(arguments); - var results = (request_Override || request_Cached).apply(null, args); - request_Override = null; - return results; + return (request_Override || request_Cached).apply(null, args); } describe('Bucket', function() { + var Bucket; var BUCKET_NAME = 'test-bucket'; var bucket; var options = { @@ -64,7 +57,23 @@ describe('Bucket', function() { } }; + before(function() { + mockery.registerMock('./file.js', FakeFile); + mockery.registerMock('request', fakeRequest); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + Bucket = require('../../lib/storage/bucket.js'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { + request_Override = null; bucket = new Bucket(options, BUCKET_NAME); }); @@ -351,13 +360,14 @@ describe('Bucket', function() { var fakeFile = new FakeFile(bucket, 'file-name'); var options = { destination: fakeFile }; fakeFile.createWriteStream = function(options) { - var dup = duplexify(); + var ws = new stream.Writable(); + ws.write = util.noop; setImmediate(function() { var expectedContentType = 'application/json; charset=utf-8'; assert.equal(options.metadata.contentType, expectedContentType); done(); }); - return dup; + return ws; }; bucket.upload(filepath, options, assert.ifError); }); @@ -366,13 +376,14 @@ describe('Bucket', function() { var fakeFile = new FakeFile(bucket, 'file-name'); var options = { destination: fakeFile }; fakeFile.createWriteStream = function(options) { - var dup = duplexify(); + var ws = new stream.Writable(); + ws.write = util.noop; setImmediate(function() { var expectedContentType = 'text/plain; charset=utf-8'; assert.equal(options.metadata.contentType, expectedContentType); done(); }); - return dup; + return ws; }; bucket.upload(textFilepath, options, assert.ifError); }); @@ -382,12 +393,13 @@ describe('Bucket', function() { var metadata = { contentType: 'made-up-content-type' }; var options = { destination: fakeFile, metadata: metadata }; fakeFile.createWriteStream = function(options) { - var dup = duplexify(); + var ws = new stream.Writable(); + ws.write = util.noop; setImmediate(function() { assert.equal(options.metadata.contentType, metadata.contentType); done(); }); - return dup; + return ws; }; bucket.upload(filepath, options, assert.ifError); }); @@ -396,12 +408,13 @@ describe('Bucket', function() { var fakeFile = new FakeFile(bucket, 'file-name'); var options = { destination: fakeFile, resumable: false }; fakeFile.createWriteStream = function(options) { - var dup = duplexify(); + var ws = new stream.Writable(); + ws.write = util.noop; setImmediate(function() { assert.strictEqual(options.resumable, false); done(); }); - return dup; + return ws; }; bucket.upload(filepath, options, assert.ifError); }); @@ -411,11 +424,12 @@ describe('Bucket', function() { var fakeFile = new FakeFile(bucket, 'file-name'); var options = { destination: fakeFile }; fakeFile.createWriteStream = function() { - var dup = duplexify(); + var ws = new stream.Writable(); setImmediate(function() { - dup.emit('error', error); + ws.emit('error', error); + ws.end(); }); - return dup; + return ws; }; bucket.upload(filepath, options, function(err) { assert.equal(err, error); diff --git a/test/storage/file.js b/test/storage/file.js index f6711964b7e..b550cd64aa4 100644 --- a/test/storage/file.js +++ b/test/storage/file.js @@ -14,7 +14,7 @@ * limitations under the License. */ -/*global describe, it, beforeEach */ +/*global describe, it, beforeEach, before, after */ 'use strict'; @@ -24,6 +24,7 @@ var crc = require('fast-crc32c'); var crypto = require('crypto'); var duplexify = require('duplexify'); var extend = require('extend'); +var mockery = require('mockery'); var nodeutil = require('util'); var request = require('request'); var stream = require('stream'); @@ -37,7 +38,9 @@ function FakeDuplexify() { if (!(this instanceof FakeDuplexify)) { return new FakeDuplexify(); } - duplexify.call(this); + stream.Duplex.call(this); + this._read = util.noop; + this._write = util.noop; this.setReadable = function(setReadableStream) { readableStream = setReadableStream; }; @@ -45,14 +48,13 @@ function FakeDuplexify() { writableStream = setWritableStream; }; } -nodeutil.inherits(FakeDuplexify, duplexify); +nodeutil.inherits(FakeDuplexify, stream.Duplex); var makeWritableStream_Override; var fakeUtil = extend({}, util, { makeWritableStream: function() { var args = [].slice.call(arguments); (makeWritableStream_Override || util.makeWritableStream).apply(null, args); - makeWritableStream_Override = null; } }); @@ -62,7 +64,6 @@ var request_Override; function fakeRequest() { var args = [].slice.apply(arguments); var results = (request_Override || request_Cached).apply(null, args); - request_Override = null; return results; } @@ -81,17 +82,8 @@ function FakeConfigStore() { }; } -var File = require('sandboxed-module') - .require('../../lib/storage/file.js', { - requires: { - configstore: FakeConfigStore, - duplexify: FakeDuplexify, - request: fakeRequest, - '../common/util': fakeUtil - } - }); - describe('File', function() { + var File; var FILE_NAME = 'file-name.png'; var options = { makeAuthorizedRequest_: function(req, callback) { @@ -102,7 +94,27 @@ describe('File', function() { var file; var directoryFile; + before(function() { + mockery.registerMock('configstore', FakeConfigStore); + mockery.registerMock('duplexify', FakeDuplexify); + mockery.registerMock('request', fakeRequest); + mockery.registerMock('../common/util.js', fakeUtil); + mockery.enable({ + useCleanCache: true, + warnOnUnregistered: false + }); + File = require('../../lib/storage/file.js'); + }); + + after(function() { + mockery.deregisterAll(); + mockery.disable(); + }); + beforeEach(function() { + makeWritableStream_Override = null; + request_Override = null; + file = new File(bucket, FILE_NAME); file.makeReq_ = util.noop; @@ -1009,9 +1021,9 @@ describe('File', function() { callback(metadata); }; - var stream = duplexify(); + var ws = new stream.Writable(); - stream + ws .on('error', done) .on('complete', function(meta) { assert.deepEqual(meta, metadata); @@ -1019,7 +1031,7 @@ describe('File', function() { done(); }); - file.startSimpleUpload_(stream, metadata); + file.startSimpleUpload_(ws, metadata); }); }); });