import AWS from "aws-sdk"; import { GetObjectRequest, ListObjectsV2Request } from "aws-sdk/clients/s3"; import { config } from "../../src/utils/config"; import sinon from "sinon"; import stream from "stream"; import moment from "moment"; const recursiveReaddir = require("recursive-readdir"); const fs = require("fs"); export default function createS3Stub(rootDir?: string) { if (rootDir) { config.S3_THRESHOLD_BUCKET = rootDir; config.AUDIENCE_S3_BUCKET = rootDir; config.S3_CONTEXT_BUCKET = rootDir; config.CTA_S3_BUCKET = rootDir; config.S3_BLACKLIST_EXTERNAL_BUCKET = rootDir; } return sinon.stub(AWS, "S3").returns({ getObject: (params: GetObjectRequest) => _getObjectStub( params.Bucket, params.Key, (config.INVENTORY === "internal" ? moment.utc("2021-06-21") : moment.utc()).toDate() ), listObjectsV2: (params: ListObjectsV2Request) => _listObjectsV2Stub(params.Bucket, params.Prefix!), }); } function _getObjectStub(bucket: string, key: string, lastModified: Date) { const result = fs.readFileSync(bucket + "/" + key); const readable = new stream.Readable(); readable.push(result); readable.push(null); return { createReadStream: sinon.stub().returns(readable), promise: sinon.stub().returns(Promise.resolve({ Body: result, LastModified: lastModified })), }; } function _listObjectsV2Stub(bucket: string, prefix: string) { const promise = recursiveReaddir(bucket + "/" + prefix).then((filenames: any[]) => { return { Contents: filenames.map((f) => { return { Key: f.slice(bucket.length + 1) }; }), }; }); return { promise: sinon.stub().returns(promise), }; }