Skip to content

Commit 1ea5edc

Browse files
committed
refactors filesAdapter tests in factories
1 parent 8883541 commit 1ea5edc

File tree

3 files changed

+142
-39
lines changed

3 files changed

+142
-39
lines changed

spec/FilesController.spec.js

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
11
var FilesController = require('../src/Controllers/FilesController').FilesController;
22
var GridStoreAdapter = require("../src/Adapters/Files/GridStoreAdapter").GridStoreAdapter;
3+
var S3Adapter = require("../src/Adapters/Files/S3Adapter").S3Adapter;
34
var Config = require("../src/Config");
45

6+
var FCTestFactory = require("./FilesControllerTestFactory");
7+
8+
59
// Small additional tests to improve overall coverage
610
describe("FilesController",()=>{
711

8-
it("should properly expand objects", (done) => {
9-
var config = new Config(Parse.applicationId);
10-
var adapter = new GridStoreAdapter();
11-
var filesController = new FilesController(adapter);
12-
var result = filesController.expandFilesInObject(config, function(){});
12+
// Test the grid store adapter
13+
var gridStoreAdapter = new GridStoreAdapter();
14+
FCTestFactory.testAdapter("GridStoreAdapter", gridStoreAdapter);
15+
16+
if (process.env.S3_ACCESS_KEY && process.env.S3_SECRET_KEY) {
17+
18+
// Test the S3 Adapter
19+
var s3Adapter = new S3Adapter(process.env.S3_ACCESS_KEY, process.env.S3_SECRET_KEY, 'parse.server.tests');
1320

14-
expect(result).toBeUndefined();
21+
FCTestFactory.testAdapter("S3Adapter",s3Adapter);
1522

16-
var fullFile = {
17-
type: '__type',
18-
url: "http://an.url"
19-
}
23+
// Test S3 with direct access
24+
var s3DirectAccessAdapter = new S3Adapter(process.env.S3_ACCESS_KEY, process.env.S3_SECRET_KEY, 'parse.server.tests', {
25+
directAccess: true
26+
});
2027

21-
var anObject = {
22-
aFile: fullFile
23-
}
24-
filesController.expandFilesInObject(config, anObject);
25-
expect(anObject.aFile.url).toEqual("http://an.url");
28+
FCTestFactory.testAdapter("S3AdapterDirect", s3DirectAccessAdapter);
2629

27-
done();
28-
})
29-
})
30+
} else if (!process.env.TRAVIS) {
31+
console.log("set S3_ACCESS_KEY and S3_SECRET_KEY to test S3Adapter")
32+
}
33+
});

spec/FilesControllerTestFactory.js

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
var FilesController = require('../src/Controllers/FilesController').FilesController;
3+
var Config = require("../src/Config");
4+
5+
var testAdapter = function(name, adapter) {
6+
// Small additional tests to improve overall coverage
7+
8+
var config = new Config(Parse.applicationId);
9+
var filesController = new FilesController(adapter);
10+
11+
describe("FilesController with "+name,()=>{
12+
13+
it("should properly expand objects", (done) => {
14+
15+
var result = filesController.expandFilesInObject(config, function(){});
16+
17+
expect(result).toBeUndefined();
18+
19+
var fullFile = {
20+
type: '__type',
21+
url: "http://an.url"
22+
}
23+
24+
var anObject = {
25+
aFile: fullFile
26+
}
27+
filesController.expandFilesInObject(config, anObject);
28+
expect(anObject.aFile.url).toEqual("http://an.url");
29+
30+
done();
31+
})
32+
33+
it("should properly create, read, delete files", (done) => {
34+
var filename;
35+
filesController.createFile(config, "file.txt", "hello world").then( (result) => {
36+
ok(result.url);
37+
ok(result.name);
38+
filename = result.name;
39+
expect(result.name.match(/file.txt/)).not.toBe(null);
40+
return filesController.getFileData(config, filename);
41+
}, (err) => {
42+
fail("The adapter should create the file");
43+
console.error(err);
44+
done();
45+
}).then((result) => {
46+
expect(result instanceof Buffer).toBe(true);
47+
expect(result.toString('utf-8')).toEqual("hello world");
48+
return filesController.deleteFile(config, filename);
49+
}, (err) => {
50+
fail("The adapter should get the file");
51+
console.error(err);
52+
done();
53+
}).then((result) => {
54+
55+
filesController.getFileData(config, filename).then((res) => {
56+
fail("the file should be deleted");
57+
done();
58+
}, (err) => {
59+
done();
60+
});
61+
62+
}, (err) => {
63+
fail("The adapter should delete the file");
64+
console.error(err);
65+
done();
66+
});
67+
}, 5000); // longer tests
68+
});
69+
}
70+
71+
module.exports = {
72+
testAdapter: testAdapter
73+
}

src/Adapters/Files/S3Adapter.js

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,22 @@ export class S3Adapter extends FilesAdapter {
3333
};
3434
AWS.config._region = this._region;
3535
this._s3Client = new AWS.S3(s3Options);
36+
this._hasBucket = false;
37+
}
38+
39+
createBucket() {
40+
var promise;
41+
if (this._hasBucket) {
42+
promise = Promise.resolve();
43+
} else {
44+
promise = new Promise((resolve, reject) => {
45+
this._s3Client.createBucket(() => {
46+
this._hasBucket = true;
47+
resolve();
48+
});
49+
});
50+
}
51+
return promise;
3652
}
3753

3854
// For a given config object, filename, and data, store a file in S3
@@ -45,26 +61,30 @@ export class S3Adapter extends FilesAdapter {
4561
if (this._directAccess) {
4662
params.ACL = "public-read"
4763
}
48-
return new Promise((resolve, reject) => {
49-
this._s3Client.upload(params, (err, data) => {
50-
if (err !== null) {
51-
return reject(err);
52-
}
53-
resolve(data);
64+
return this.createBucket().then(() => {
65+
return new Promise((resolve, reject) => {
66+
this._s3Client.upload(params, (err, data) => {
67+
if (err !== null) {
68+
return reject(err);
69+
}
70+
resolve(data);
71+
});
5472
});
5573
});
5674
}
5775

5876
deleteFile(config, filename) {
59-
return new Promise((resolve, reject) => {
60-
let params = {
61-
Key: this._bucketPrefix + filename
62-
};
63-
this._s3Client.deleteObject(params, (err, data) =>{
64-
if(err !== null) {
65-
return reject(err);
66-
}
67-
resolve(data);
77+
return this.createBucket().then(() => {
78+
return new Promise((resolve, reject) => {
79+
let params = {
80+
Key: this._bucketPrefix + filename
81+
};
82+
this._s3Client.deleteObject(params, (err, data) =>{
83+
if(err !== null) {
84+
return reject(err);
85+
}
86+
resolve(data);
87+
});
6888
});
6989
});
7090
}
@@ -73,12 +93,18 @@ export class S3Adapter extends FilesAdapter {
7393
// Returns a promise that succeeds with the buffer result from S3
7494
getFileData(config, filename) {
7595
let params = {Key: this._bucketPrefix + filename};
76-
return new Promise((resolve, reject) => {
77-
this._s3Client.getObject(params, (err, data) => {
78-
if (err !== null) {
79-
return reject(err);
80-
}
81-
resolve(data.Body);
96+
return this.createBucket().then(() => {
97+
return new Promise((resolve, reject) => {
98+
this._s3Client.getObject(params, (err, data) => {
99+
if (err !== null) {
100+
return reject(err);
101+
}
102+
// Something happend here...
103+
if (data && !data.Body) {
104+
return reject(data);
105+
}
106+
resolve(data.Body);
107+
});
82108
});
83109
});
84110
}

0 commit comments

Comments
 (0)