Skip to content

Commit

Permalink
Merge pull request #144 from jstewmon/createReadStream-stream
Browse files Browse the repository at this point in the history
support passing a Readable stream as the stub for S3.GetObject
  • Loading branch information
nelsonic committed Aug 6, 2018
2 parents 9dd9bf5 + 26f3975 commit 0bbb054
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 42 deletions.
20 changes: 12 additions & 8 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,18 @@ function mockServiceMethod(service, client, method, replace) {
return promise;
} : undefined,
createReadStream: function() {
var stream = new Readable();
stream._read = function(size) {
if(typeof(replace) === 'string' || Buffer.isBuffer(replace)) {
this.push(replace);
}
this.push(null);
};
return stream;
if (replace instanceof Readable) {
return replace;
} else {
var stream = new Readable();
stream._read = function(size) {
if(typeof(replace) === 'string' || Buffer.isBuffer(replace)) {
this.push(replace);
}
this.push(null);
};
return stream;
}
},
on: function(eventName, callback) {
},
Expand Down
8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
"index.js"
],
"scripts": {
"nocov": "tape test/*.js",
"test": "nyc --reporter=lcov tape ./test/*.js",
"coverage": "nyc tape ./test/*.js && nyc check-coverage --statements 100 --functions 100 --lines 100 --branches 100 --report html"
"nocov": "tap test/*.js",
"test": "nyc --reporter=lcov tap ./test/*.js",
"coverage": "nyc tap ./test/*.js && nyc check-coverage --statements 100 --functions 100 --lines 100 --branches 100 --report html"
},
"repository": {
"type": "git",
Expand Down Expand Up @@ -43,6 +43,6 @@
"concat-stream": "^1.6.2",
"is-node-stream": "^1.0.0",
"nyc": "^12.0.2",
"tape": "^4.9.1"
"tap": "^12.0.1"
}
}
52 changes: 22 additions & 30 deletions test/index.test.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
var test = require('tape');
var tap = require('tap');
var test = tap.test;
var awsMock = require('../index.js');
var AWS = require('aws-sdk');
var isNodeStream = require('is-node-stream');
var concatStream = require('concat-stream');
var Readable = require('stream').Readable;

AWS.config.paramValidation = false;

tap.afterEach(function (done) {
awsMock.restore();
done();
});

test('AWS.mock function should mock AWS service and method on the service', function(t){
t.test('mock function replaces method with a function that returns replace string', function(st){
awsMock.mock('SNS', 'publish', 'message');
var sns = new AWS.SNS();
sns.publish({}, function(err, data){
st.equals(data, 'message');
awsMock.restore('SNS');
st.end();
});
});
Expand All @@ -23,7 +29,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
var sns = new AWS.SNS();
sns.publish({}, function(err, data){
st.equals(data, 'message');
awsMock.restore('SNS');
st.end();
});
});
Expand All @@ -37,7 +42,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
s3.upload({}, {test: 'message'}, function(err, data) {
st.equals(data.test, 'message');
awsMock.restore('S3');
st.end();
});
});
Expand All @@ -48,7 +52,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
s3.getObject({Bucket: 'b', notKey: 'k'}, function(err, data) {
st.ok(err);
st.notOk(data);
awsMock.restore('S3', 'getObject');
st.end();
});
});
Expand All @@ -57,7 +60,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
var s3 = new AWS.S3({paramValidation: true});
s3.getSignedUrl('getObject', {}, function(err, data) {
st.equals(data, 'message');
awsMock.restore('S3');
st.end();
});
});
Expand All @@ -67,7 +69,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
s3.getObject({Bucket: 'b', Key: 'k'}, function(err, data) {
st.notOk(err);
st.equals(data.Body, 'body');
awsMock.restore('S3', 'getObject');
st.end();
});
});
Expand All @@ -81,7 +82,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
sns.publish({}, function(err, data){
st.equals(data, 'message');
awsMock.restore('SNS');
st.end();
});
});
Expand All @@ -95,7 +95,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
sns.subscribe({}, function(err, data){
st.equals(data, 'test');
awsMock.restore('SNS');
st.end();
});
});
Expand All @@ -117,8 +116,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
if (typeof(Promise) === 'function') {
t.test('promises are supported', function(st){
awsMock.restore('Lambda', 'getFunction');
awsMock.restore('Lambda', 'createFunction');
var error = new Error('on purpose');
awsMock.mock('Lambda', 'getFunction', function(params, callback) {
callback(null, 'message');
Expand All @@ -137,8 +134,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
});
t.test('replacement returns thennable', function(st){
awsMock.restore('Lambda', 'getFunction');
awsMock.restore('Lambda', 'createFunction');
var error = new Error('on purpose');
awsMock.mock('Lambda', 'getFunction', function(params) {
return Promise.resolve('message')
Expand Down Expand Up @@ -169,8 +164,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
st.end();
});
t.test('promises work with async completion', function(st){
awsMock.restore('Lambda', 'getFunction');
awsMock.restore('Lambda', 'createFunction');
var error = new Error('on purpose');
awsMock.mock('Lambda', 'getFunction', function(params, callback) {
setTimeout(callback.bind(this, null, 'message'), 10);
Expand All @@ -189,7 +182,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
});
t.test('promises can be configured', function(st){
awsMock.restore('Lambda', 'getFunction');
awsMock.mock('Lambda', 'getFunction', function(params, callback) {
callback(null, 'message');
});
Expand Down Expand Up @@ -224,7 +216,17 @@ test('AWS.mock function should mock AWS service and method on the service', func
req = s3.getObject('getObject');
var stream = req.createReadStream();
stream.pipe(concatStream(function() {
awsMock.restore('S3', 'getObject');
st.end();
}));
});
t.test('request object createReadStream works with streams', function(st) {
var bodyStream = new Readable();
bodyStream.push('body');
bodyStream.push(null);
awsMock.mock('S3', 'getObject', bodyStream);
var stream = new AWS.S3().getObject('getObject').createReadStream();
stream.pipe(concatStream(function(actual) {
st.equals(actual.toString(), 'body');
st.end();
}));
});
Expand All @@ -235,7 +237,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
var stream = req.createReadStream();
stream.pipe(concatStream(function(actual) {
st.equals(actual.toString(), 'body');
awsMock.restore('S3', 'getObject');
st.end();
}));
});
Expand All @@ -246,7 +247,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
var stream = req.createReadStream();
stream.pipe(concatStream(function(actual) {
st.equals(actual.toString(), 'body');
awsMock.restore('S3', 'getObject');
st.end();
}));
});
Expand All @@ -257,7 +257,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
var stream = req.createReadStream();
stream.pipe(concatStream(function(actual) {
st.equals(actual.toString(), '');
awsMock.restore('S3', 'getObject');
st.end();
}));
});
Expand All @@ -268,7 +267,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
var stream = req.createReadStream();
stream.pipe(concatStream(function(actual) {
st.equals(actual.toString(), '');
awsMock.restore('S3', 'getObject');
st.end();
}));
});
Expand Down Expand Up @@ -383,7 +381,6 @@ test('AWS.mock function should mock AWS service and method on the service', func
docClient.query({}, function(err, data){
console.warn(err);
st.equals(data, 'test');
awsMock.restore('DynamoDB.DocumentClient', 'query');
st.end();
});
});
Expand Down Expand Up @@ -451,12 +448,12 @@ test('AWS.mock function should mock AWS service and method on the service', func
});
st.end();
});
t.test('Mocked service should return the sinon stub', function(st) {
t.skip('Mocked service should return the sinon stub', function(st) {
// TODO: the stub is only returned if an instance was already constructed
var stub = awsMock.mock('CloudSearchDomain', 'search');
st.equals(stub.stub.isSinonProxy, true);
st.end();
});
t.end();
t.test('Restore should not fail when the stub did not exist.', function (st) {
// This test will fail when restoring throws unneeded errors.
try {
Expand All @@ -466,8 +463,8 @@ test('AWS.mock function should mock AWS service and method on the service', func
} catch (e) {
console.log(e);
}

});
t.end();
});

test('AWS.setSDK function should mock a specific AWS module', function(t) {
Expand All @@ -477,7 +474,6 @@ test('AWS.setSDK function should mock a specific AWS module', function(t) {
var sns = new AWS.SNS();
sns.publish({}, function(err, data){
st.equals(data, 'message');
awsMock.restore('SNS');
st.end();
});
});
Expand All @@ -488,8 +484,6 @@ test('AWS.setSDK function should mock a specific AWS module', function(t) {
awsMock.mock('SNS', 'publish', 'message');
});
awsMock.setSDK('aws-sdk');
awsMock.restore();

st.end();
});
t.end();
Expand All @@ -503,7 +497,6 @@ test('AWS.setSDKInstance function should mock a specific AWS module', function(t
var sns = new AWS.SNS();
sns.publish({}, function(err, data){
st.equals(data, 'message2');
awsMock.restore('SNS');
st.end();
});
});
Expand All @@ -515,7 +508,6 @@ test('AWS.setSDKInstance function should mock a specific AWS module', function(t
awsMock.mock('SNS', 'publish', 'message');
});
awsMock.setSDKInstance(AWS);
awsMock.restore();
st.end();
});
t.end();
Expand Down

0 comments on commit 0bbb054

Please sign in to comment.