Skip to content

Commit 9287afc

Browse files
committed
refactors filesAdapter tests in factories
1 parent 0b990b6 commit 9287afc

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
@@ -48,6 +48,22 @@ export class S3Adapter extends FilesAdapter {
4848
};
4949
AWS.config._region = this._region;
5050
this._s3Client = new AWS.S3(s3Options);
51+
this._hasBucket = false;
52+
}
53+
54+
createBucket() {
55+
var promise;
56+
if (this._hasBucket) {
57+
promise = Promise.resolve();
58+
} else {
59+
promise = new Promise((resolve, reject) => {
60+
this._s3Client.createBucket(() => {
61+
this._hasBucket = true;
62+
resolve();
63+
});
64+
});
65+
}
66+
return promise;
5167
}
5268

5369
// For a given config object, filename, and data, store a file in S3
@@ -60,26 +76,30 @@ export class S3Adapter extends FilesAdapter {
6076
if (this._directAccess) {
6177
params.ACL = "public-read"
6278
}
63-
return new Promise((resolve, reject) => {
64-
this._s3Client.upload(params, (err, data) => {
65-
if (err !== null) {
66-
return reject(err);
67-
}
68-
resolve(data);
79+
return this.createBucket().then(() => {
80+
return new Promise((resolve, reject) => {
81+
this._s3Client.upload(params, (err, data) => {
82+
if (err !== null) {
83+
return reject(err);
84+
}
85+
resolve(data);
86+
});
6987
});
7088
});
7189
}
7290

7391
deleteFile(config, filename) {
74-
return new Promise((resolve, reject) => {
75-
let params = {
76-
Key: this._bucketPrefix + filename
77-
};
78-
this._s3Client.deleteObject(params, (err, data) =>{
79-
if(err !== null) {
80-
return reject(err);
81-
}
82-
resolve(data);
92+
return this.createBucket().then(() => {
93+
return new Promise((resolve, reject) => {
94+
let params = {
95+
Key: this._bucketPrefix + filename
96+
};
97+
this._s3Client.deleteObject(params, (err, data) =>{
98+
if(err !== null) {
99+
return reject(err);
100+
}
101+
resolve(data);
102+
});
83103
});
84104
});
85105
}
@@ -88,12 +108,18 @@ export class S3Adapter extends FilesAdapter {
88108
// Returns a promise that succeeds with the buffer result from S3
89109
getFileData(config, filename) {
90110
let params = {Key: this._bucketPrefix + filename};
91-
return new Promise((resolve, reject) => {
92-
this._s3Client.getObject(params, (err, data) => {
93-
if (err !== null) {
94-
return reject(err);
95-
}
96-
resolve(data.Body);
111+
return this.createBucket().then(() => {
112+
return new Promise((resolve, reject) => {
113+
this._s3Client.getObject(params, (err, data) => {
114+
if (err !== null) {
115+
return reject(err);
116+
}
117+
// Something happend here...
118+
if (data && !data.Body) {
119+
return reject(data);
120+
}
121+
resolve(data.Body);
122+
});
97123
});
98124
});
99125
}

0 commit comments

Comments
 (0)