Skip to content

Commit dddb679

Browse files
committed
Merge pull request parse-community#549 from flovilmart/refactors-adapter-controller
Improves Controller and Adapter relationship
2 parents 0dda59f + 045caca commit dddb679

15 files changed

+562
-327
lines changed

spec/AdaptableController.spec.js

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
2+
var AdaptableController = require("../src/Controllers/AdaptableController").AdaptableController;
3+
var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default;
4+
var FilesController = require("../src/Controllers/FilesController").FilesController;
5+
6+
var MockController = function(options) {
7+
AdaptableController.call(this, options);
8+
}
9+
MockController.prototype = Object.create(AdaptableController.prototype);
10+
MockController.prototype.constructor = AdaptableController;
11+
12+
describe("AdaptableController", ()=>{
13+
14+
it("should use the provided adapter", (done) => {
15+
var adapter = new FilesAdapter();
16+
var controller = new FilesController(adapter);
17+
expect(controller.adapter).toBe(adapter);
18+
// make sure _adapter is private
19+
expect(controller._adapter).toBe(undefined);
20+
// Override _adapter is not doing anything
21+
controller._adapter = "Hello";
22+
expect(controller.adapter).toBe(adapter);
23+
done();
24+
});
25+
26+
it("should throw when creating a new mock controller", (done) => {
27+
var adapter = new FilesAdapter();
28+
expect(() => {
29+
new MockController(adapter);
30+
}).toThrow();
31+
done();
32+
});
33+
34+
it("should fail setting the wrong adapter to the controller", (done) => {
35+
function WrongAdapter() {};
36+
var adapter = new FilesAdapter();
37+
var controller = new FilesController(adapter);
38+
var otherAdapter = new WrongAdapter();
39+
expect(() => {
40+
controller.adapter = otherAdapter;
41+
}).toThrow();
42+
done();
43+
});
44+
45+
it("should fail to instantiate a controller with wrong adapter", (done) => {
46+
function WrongAdapter() {};
47+
var adapter = new WrongAdapter();
48+
expect(() => {
49+
new FilesController(adapter);
50+
}).toThrow();
51+
done();
52+
});
53+
54+
it("should fail to instantiate a controller without an adapter", (done) => {
55+
expect(() => {
56+
new FilesController();
57+
}).toThrow();
58+
done();
59+
});
60+
61+
it("should accept an object adapter", (done) => {
62+
var adapter = {
63+
createFile: function(config, filename, data) { },
64+
deleteFile: function(config, filename) { },
65+
getFileData: function(config, filename) { },
66+
getFileLocation: function(config, filename) { },
67+
}
68+
expect(() => {
69+
new FilesController(adapter);
70+
}).not.toThrow();
71+
done();
72+
});
73+
74+
it("should accept an object adapter", (done) => {
75+
function AGoodAdapter() {};
76+
AGoodAdapter.prototype.createFile = function(config, filename, data) { };
77+
AGoodAdapter.prototype.deleteFile = function(config, filename) { };
78+
AGoodAdapter.prototype.getFileData = function(config, filename) { };
79+
AGoodAdapter.prototype.getFileLocation = function(config, filename) { };
80+
81+
var adapter = new AGoodAdapter();
82+
expect(() => {
83+
new FilesController(adapter);
84+
}).not.toThrow();
85+
done();
86+
});
87+
});

spec/AdapterLoader.spec.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
var AdapterLoader = require("../src/Adapters/AdapterLoader").AdapterLoader;
3+
var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default;
4+
5+
describe("AdaptableController", ()=>{
6+
7+
it("should instantiate an adapter from string in object", (done) => {
8+
var adapterPath = require('path').resolve("./spec/MockAdapter");
9+
10+
var adapter = AdapterLoader.load({
11+
adapter: adapterPath,
12+
key: "value",
13+
foo: "bar"
14+
});
15+
16+
expect(adapter instanceof Object).toBe(true);
17+
expect(adapter.options.key).toBe("value");
18+
expect(adapter.options.foo).toBe("bar");
19+
done();
20+
});
21+
22+
it("should instantiate an adapter from string", (done) => {
23+
var adapterPath = require('path').resolve("./spec/MockAdapter");
24+
var adapter = AdapterLoader.load(adapterPath);
25+
26+
expect(adapter instanceof Object).toBe(true);
27+
expect(adapter.options).toBe(adapterPath);
28+
done();
29+
});
30+
31+
it("should instantiate an adapter from string that is module", (done) => {
32+
var adapterPath = require('path').resolve("./src/Adapters/Files/FilesAdapter");
33+
var adapter = AdapterLoader.load({
34+
adapter: adapterPath
35+
});
36+
37+
expect(adapter instanceof FilesAdapter).toBe(true);
38+
done();
39+
});
40+
41+
it("should instantiate an adapter from function/Class", (done) => {
42+
var adapter = AdapterLoader.load({
43+
adapter: FilesAdapter
44+
});
45+
expect(adapter instanceof FilesAdapter).toBe(true);
46+
done();
47+
});
48+
49+
it("should instantiate the default adapter from Class", (done) => {
50+
var adapter = AdapterLoader.load(null, FilesAdapter);
51+
expect(adapter instanceof FilesAdapter).toBe(true);
52+
done();
53+
});
54+
55+
it("should use the default adapter", (done) => {
56+
var defaultAdapter = new FilesAdapter();
57+
var adapter = AdapterLoader.load(null, defaultAdapter);
58+
expect(adapter instanceof FilesAdapter).toBe(true);
59+
done();
60+
});
61+
62+
it("should use the provided adapter", (done) => {
63+
var originalAdapter = new FilesAdapter();
64+
var adapter = AdapterLoader.load(originalAdapter);
65+
expect(adapter).toBe(originalAdapter);
66+
done();
67+
});
68+
});

spec/FilesController.spec.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
var FilesController = require('../src/Controllers/FilesController').FilesController;
2+
var GridStoreAdapter = require("../src/Adapters/Files/GridStoreAdapter").GridStoreAdapter;
23
var Config = require("../src/Config");
34

45
// Small additional tests to improve overall coverage
56
describe("FilesController",()=>{
67

78
it("should properly expand objects", (done) => {
89
var config = new Config(Parse.applicationId);
9-
var filesController = new FilesController();
10+
var adapter = new GridStoreAdapter();
11+
var filesController = new FilesController(adapter);
1012
var result = filesController.expandFilesInObject(config, function(){});
1113

1214
expect(result).toBeUndefined();

spec/LoggerController.spec.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,10 @@ describe('LoggerController', () => {
7676
});
7777

7878
it('should throw without an adapter', (done) => {
79-
80-
var loggerController = new LoggerController();
79+
8180

8281
expect(() => {
83-
loggerController.getLogs();
82+
var loggerController = new LoggerController();
8483
}).toThrow();
8584
done();
8685
});

spec/MockAdapter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = function(options) {
2+
this.options = options;
3+
}

spec/OneSignalPushAdapter.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,8 @@ describe('OneSignalPushAdapter', () => {
227227

228228
function makeDevice(deviceToken, appIdentifier) {
229229
return {
230-
deviceToken: deviceToken
230+
deviceToken: deviceToken,
231+
appIdentifier: appIdentifier
231232
};
232233
}
233234

src/Adapters/AdapterLoader.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
export class AdapterLoader {
3+
static load(options, defaultAdapter) {
4+
let adapter;
5+
6+
// We have options and options have adapter key
7+
if (options) {
8+
// Pass an adapter as a module name, a function or an instance
9+
if (typeof options == "string" || typeof options == "function" || options.constructor != Object) {
10+
adapter = options;
11+
}
12+
if (options.adapter) {
13+
adapter = options.adapter;
14+
}
15+
}
16+
17+
if (!adapter) {
18+
adapter = defaultAdapter;
19+
}
20+
21+
// This is a string, require the module
22+
if (typeof adapter === "string") {
23+
adapter = require(adapter);
24+
// If it's define as a module, get the default
25+
if (adapter.default) {
26+
adapter = adapter.default;
27+
}
28+
}
29+
// From there it's either a function or an object
30+
// if it's an function, instanciate and pass the options
31+
if (typeof adapter === "function") {
32+
var Adapter = adapter;
33+
adapter = new Adapter(options);
34+
}
35+
return adapter;
36+
}
37+
}
38+
39+
export default AdapterLoader;

0 commit comments

Comments
 (0)