This commit is contained in:
Christoph Wiechert
2017-04-23 13:41:29 +02:00
commit 30d6918b83
42 changed files with 2018 additions and 0 deletions

148
tmp/test/store.spec.js Normal file
View File

@@ -0,0 +1,148 @@
"use strict";
const fsp = require("fs-promise");
const path = require("path");
const Store = require("./store");
const httpErrors = require('http-errors');
const uploadDir = path.resolve(__dirname, "data");
describe("psitransfer store", () => {
let store;
let sid;
let uuid;
let fid;
let metaData;
let info;
let stat;
beforeEach(() => {
store = new Store(uploadDir);
sid = "221813e1688d";
uuid = "e40bc20e-5be3-4906-903c-895f05e49efe";
fsp.ensureDirSync(path.resolve(uploadDir, sid));
fid = `${sid}++${uuid}`;
metaData = {
uploadLength: 0,
metadata: {
sid,
retention: "259200",
password: "",
name: "test.txt",
key: uuid,
createdAt: "" + Date.now()
},
size: 0,
offset: 0
};
info = {
offset: 100,
uploadLength: 100,
metadata: {
sid: 'fea60a1beba6',
retention: '259200',
password: '',
name: 'bacon.ham',
key: '1215182b-ca57-4212-9e87-c7028190ff69',
createdAt: '1483890816120'
},
isPartial: true,
};
stat = {
size: 287
};
});
afterEach((next) => {
fsp.remove(uploadDir, next);
});
it("should properly construct", () => {
expect(store.dir).toEqual(uploadDir);
});
it("should create new files", async() => {
let fileName = store.getFilename(fid);
spyOn(store, "getFilename").and.callThrough();
spyOn(fsp, "ensureDir").and.returnValue(Promise.resolve());
spyOn(fsp, "writeJson").and.returnValue(Promise.resolve());
expect(await store.create(fid, metaData)).toEqual({
uploadId: fid
});
expect(store.getFilename).toHaveBeenCalled();
expect(fsp.ensureDir).toHaveBeenCalled();
expect(fsp.writeJson).toHaveBeenCalled();
});
it("should evaluate file info", async() => {
spyOn(fsp, "readJson").and.returnValue(Promise.resolve(info));
spyOn(fsp, "stat").and.returnValue(Promise.resolve(stat));
expect(await store.info(fid)).toEqual(Object.assign({}, info, stat));
});
it("should throw an http error on file info if file doesn't exist", (next) => {
store.info(fid)
// TODO use always when available
// .always(() => next());
.then(() => {
// if this test fails you accidently created that file and didn't cleanup
expect(true).toBeFalsy();
next();
})
.catch((e) => {
expect(e).toEqual(jasmine.any(httpErrors.NotFound().constructor));
next();
});
});
it("should append file content", async() => {
let readStream = fsp.createReadStream('/dev/urandom', {start: 0, end: 99});
spyOn(store, "info").and.returnValue(Promise.resolve(info));
spyOn(fsp, "writeJson").and.returnValue(Promise.resolve());
spyOn(fsp, "createWriteStream").and.callThrough();
let retVal = await store.append(fid, readStream, 0);
expect(retVal).toEqual({offset: 100, upload: info});
expect(store.info).toHaveBeenCalledWith(fid);
expect(fsp.writeJson).toHaveBeenCalled();
});
it("should create a read stream", (next) => {
let cb = jasmine.createSpy('cb');
spyOn(store, "info").and.returnValue(Promise.resolve(info));
spyOn(store, "getFilename");
spyOn(fsp, "createReadStream");
store.createReadStream(fid, 0, 100, cb);
expect(store.getFilename).toHaveBeenCalledTimes(2);
expect(store.info).toHaveBeenCalled();
expect(fsp.createReadStream).toHaveBeenCalled();
setTimeout(() => {
expect(cb).toHaveBeenCalled();
next();
}, 0);
});
it("should delete files", async() => {
spyOn(fsp, "unlink");
spyOn(store, "getFilename");
await store.del(fid);
expect(fsp.unlink).toHaveBeenCalledTimes(2);
expect(store.getFilename).toHaveBeenCalledTimes(3);
});
});