multer-s3-transform
Version:
Streaming multer storage engine for AWS S3
281 lines (233 loc) • 7.98 kB
JavaScript
/* eslint-env mocha */
var multerS3 = require("../");
var fs = require("fs");
var path = require("path");
var extend = require("xtend");
var assert = require("assert");
var multer = require("multer");
var stream = require("stream");
var FormData = require("form-data");
var onFinished = require("on-finished");
var mockS3 = require("./util/mock-s3");
var VALID_OPTIONS = {
bucket: "string",
};
var INVALID_OPTIONS = [
["numeric key", { key: 1337 }],
["string key", { key: "string" }],
["numeric bucket", { bucket: 1337 }],
["numeric contentType", { contentType: 1337 }],
];
function submitForm(multer, form, cb) {
form.getLength(function (err, length) {
if (err) return cb(err);
var req = new stream.PassThrough();
req.complete = false;
form.once("end", function () {
req.complete = true;
});
form.pipe(req);
req.headers = {
"content-type": "multipart/form-data; boundary=" + form.getBoundary(),
"content-length": length,
};
multer(req, null, function (err) {
onFinished(req, function () {
cb(err, req);
});
});
});
}
describe("Multer S3", function () {
it("is exposed as a function", function () {
assert.equal(typeof multerS3, "function");
});
INVALID_OPTIONS.forEach(function (testCase) {
it("throws when given " + testCase[0], function () {
function testBody() {
multerS3(extend(VALID_OPTIONS, testCase[1]));
}
assert.throws(testBody, TypeError);
});
});
it("upload files", function (done) {
var s3 = mockS3();
var form = new FormData();
var storage = multerS3({ s3: s3, bucket: "test" });
var upload = multer({ storage: storage });
var parser = upload.single("image");
var image = fs.createReadStream(
path.join(__dirname, "files", "ffffff.png")
);
form.append("name", "Multer");
form.append("image", image);
submitForm(parser, form, function (err, req) {
assert.ifError(err);
assert.equal(req.body.name, "Multer");
assert.equal(req.file.fieldname, "image");
assert.equal(req.file.originalname, "ffffff.png");
assert.equal(req.file.size, 68);
assert.equal(req.file.bucket, "test");
assert.equal(req.file.etag, "mock-etag");
assert.equal(req.file.location, "mock-location");
done();
});
});
it("uploads file with AES256 server-side encryption", function (done) {
var s3 = mockS3();
var form = new FormData();
var storage = multerS3({
s3: s3,
bucket: "test",
serverSideEncryption: "AES256",
});
var upload = multer({ storage: storage });
var parser = upload.single("image");
var image = fs.createReadStream(
path.join(__dirname, "files", "ffffff.png")
);
form.append("name", "Multer");
form.append("image", image);
submitForm(parser, form, function (err, req) {
assert.ifError(err);
assert.equal(req.body.name, "Multer");
assert.equal(req.file.fieldname, "image");
assert.equal(req.file.originalname, "ffffff.png");
assert.equal(req.file.size, 68);
assert.equal(req.file.bucket, "test");
assert.equal(req.file.etag, "mock-etag");
assert.equal(req.file.location, "mock-location");
assert.equal(req.file.serverSideEncryption, "AES256");
done();
});
});
it("uploads file with AWS KMS-managed server-side encryption", function (done) {
var s3 = mockS3();
var form = new FormData();
var storage = multerS3({
s3: s3,
bucket: "test",
serverSideEncryption: "aws:kms",
});
var upload = multer({ storage: storage });
var parser = upload.single("image");
var image = fs.createReadStream(
path.join(__dirname, "files", "ffffff.png")
);
form.append("name", "Multer");
form.append("image", image);
submitForm(parser, form, function (err, req) {
assert.ifError(err);
assert.equal(req.body.name, "Multer");
assert.equal(req.file.fieldname, "image");
assert.equal(req.file.originalname, "ffffff.png");
assert.equal(req.file.size, 68);
assert.equal(req.file.bucket, "test");
assert.equal(req.file.etag, "mock-etag");
assert.equal(req.file.location, "mock-location");
assert.equal(req.file.serverSideEncryption, "aws:kms");
done();
});
});
it("uploads PNG file with correct content-type", function (done) {
var s3 = mockS3();
var form = new FormData();
var storage = multerS3({
s3: s3,
bucket: "test",
serverSideEncryption: "aws:kms",
contentType: multerS3.AUTO_CONTENT_TYPE,
});
var upload = multer({ storage: storage });
var parser = upload.single("image");
var image = fs.createReadStream(
path.join(__dirname, "files", "ffffff.png")
);
form.append("name", "Multer");
form.append("image", image);
submitForm(parser, form, function (err, req) {
assert.ifError(err);
assert.equal(req.body.name, "Multer");
assert.equal(req.file.fieldname, "image");
assert.equal(req.file.contentType, "image/png");
assert.equal(req.file.originalname, "ffffff.png");
assert.equal(req.file.size, 68);
assert.equal(req.file.bucket, "test");
assert.equal(req.file.etag, "mock-etag");
assert.equal(req.file.location, "mock-location");
assert.equal(req.file.serverSideEncryption, "aws:kms");
done();
});
});
it("uploads SVG file with correct content-type", function (done) {
var s3 = mockS3();
var form = new FormData();
var storage = multerS3({
s3: s3,
bucket: "test",
serverSideEncryption: "aws:kms",
contentType: multerS3.AUTO_CONTENT_TYPE,
});
var upload = multer({ storage: storage });
var parser = upload.single("image");
var image = fs.createReadStream(path.join(__dirname, "files", "test.svg"));
form.append("name", "Multer");
form.append("image", image);
submitForm(parser, form, function (err, req) {
assert.ifError(err);
assert.equal(req.body.name, "Multer");
assert.equal(req.file.fieldname, "image");
assert.equal(req.file.contentType, "image/svg+xml");
assert.equal(req.file.originalname, "test.svg");
assert.equal(req.file.size, 100);
assert.equal(req.file.bucket, "test");
assert.equal(req.file.etag, "mock-etag");
assert.equal(req.file.location, "mock-location");
assert.equal(req.file.serverSideEncryption, "aws:kms");
done();
});
});
it("upload transformed files", function (done) {
var s3 = mockS3();
var form = new FormData();
var storage = multerS3({
s3: s3,
bucket: "test",
shouldTransform: true,
transforms: [
{
key: "test",
transform: function (req, file, cb) {
cb(null, new stream.PassThrough());
},
},
{
key: "test2",
transform: function (req, file, cb) {
cb(null, new stream.PassThrough());
},
},
],
});
var upload = multer({ storage: storage });
var parser = upload.single("image");
var image = fs.createReadStream(
path.join(__dirname, "files", "ffffff.png")
);
form.append("name", "Multer");
form.append("image", image);
submitForm(parser, form, function (err, req) {
assert.ifError(err);
assert.equal(req.body.name, "Multer");
assert.equal(req.file.fieldname, "image");
assert.equal(req.file.originalname, "ffffff.png");
assert.equal(req.file.transforms[0].size, 68);
assert.equal(req.file.transforms[0].bucket, "test");
assert.equal(req.file.transforms[0].key, "test");
assert.equal(req.file.transforms[0].etag, "mock-etag");
assert.equal(req.file.transforms[0].location, "mock-location");
assert.equal(req.file.transforms[1].key, "test2");
done();
});
});
});