dwyl / aws-sdk-mock

:rainbow: AWSomocks for Javascript/Node.js aws-sdk tested, documented & maintained. Contributions welcome!
Apache License 2.0
1.11k stars 110 forks source link

Getting 'ExpiredToken: The provided token has expired.' when trying to mock S3.listObjects #108

Open nguyeti opened 6 years ago

nguyeti commented 6 years ago

Here is the module I want to test

'use strict';
var AWS = require('aws-sdk');
var async = require('async');
var s3 = new AWS.S3();
const BUCKET_NAME = process.env.BUCKET_NAME;
var workletData = {};
exports.workletData = workletData;
exports.loadWorkletData = loadWorkletData;
function loadWorkletData() {
  async.waterfall([
      function getBucketItemList(callback) {
        var params = {
          Bucket: BUCKET_NAME
        };
        s3.listObjects(params, function(err, data) {
          if (err) {
            callback(err, null);
          } else {
            var bucketContent = data.Contents;
            callback(null, bucketContent);
          }
        });
      },
      function getBucketObjectDetails(bucketContent, callback) {
        async.forEach(bucketContent, function(item, callback) {
          var params = {
            Bucket: BUCKET_NAME,
            Key: item.Key
          };

          s3.getObject(params, function(err, data) {
            if (err) {
              return callback(err);
            } else {
              var fileContent = data.Body.toString();
              var json = JSON.parse(fileContent);
              workletData[json.name] = json;
              callback();
            }
          });
        }, function(err, data) {
          if (err) {
            console.log(err);
            callback(err);
          } else {
            callback();
          }
        });
      }
    ],
    function(err, result) {
      if (err) {
        throw err;
      } else {
        console.log('Worklet data loaded.');
      }
    });
};

this is the test

describe('workletLoader', function () {
    it('should invoke a lambda function', function(done) {
        before(function() {
            AWS.mock('S3', 'listObjectsV2', function (params, callback) {
                callback(null, 'listObjects');
            });

            AWS.mock('S3', 'getObject', function (params, callback) {
                callback(null, 'getObject');
            });
        });

        after(function(){
            AWS.restore('S3', 'listObjectsV2');
            AWS.restore('S3', 'getObject');
        });
        workletLoader.loadWorkletData(function(err, data) {
            should.not.exist(err);
            done();
        });
    });
});

I am getting ExpiredToken: The provided token has expired.

Looks like the methods are not properly mocked. Any suggestions>?

jruts commented 6 years ago

@nguyeti could you try to move this line of code var s3 = new AWS.S3(); into your loadWorkletData function and see what the result is?