Added tests to adapter loader, cleaned up README, renamed to GCS_BUCKET from GCS_BUCKET_NAME
This commit is contained in:
22
README.md
22
README.md
@@ -135,9 +135,14 @@ PARSE_SERVER_MAX_UPLOAD_SIZE
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Configuring S3 Adapter
|
##### Configuring File Adapters
|
||||||
|
Parse Server allows developers to choose from several options when hosting files: the `GridStoreAdapter`, which backed by MongoDB; the `S3Adapter`, which is backed by [Amazon S3](https://aws.amazon.com/s3/); or the `GCSAdapter`, which is backed by [Google Cloud Storage](https://cloud.google.com/storage/).
|
||||||
|
|
||||||
You can use the following environment variable setup the S3 adapter
|
`GridStoreAdapter` is used by default and requires no setup, but if you're interested in using S3 or GCS, additional configuration information is available below.
|
||||||
|
|
||||||
|
###### Configuring `S3Adapter`
|
||||||
|
|
||||||
|
You can use the following environment variable setup to enable the S3 adapter:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
S3_ACCESS_KEY
|
S3_ACCESS_KEY
|
||||||
@@ -149,6 +154,19 @@ S3_DIRECT_ACCESS
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
###### Configuring `GCSAdapter`
|
||||||
|
|
||||||
|
You can use the following environment variable setup to enable the GCS adapter:
|
||||||
|
|
||||||
|
```js
|
||||||
|
GCP_PROJECT_ID
|
||||||
|
GCP_KEYFILE_PATH
|
||||||
|
GCS_BUCKET
|
||||||
|
GCS_BUCKET_PREFIX
|
||||||
|
GCS_DIRECT_ACCESS
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Server guide](CONTRIBUTING.md).
|
We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Server guide](CONTRIBUTING.md).
|
||||||
|
|||||||
@@ -3,44 +3,45 @@ var loadAdapter = require("../src/Adapters/AdapterLoader").loadAdapter;
|
|||||||
var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default;
|
var FilesAdapter = require("../src/Adapters/Files/FilesAdapter").default;
|
||||||
var ParsePushAdapter = require("../src/Adapters/Push/ParsePushAdapter");
|
var ParsePushAdapter = require("../src/Adapters/Push/ParsePushAdapter");
|
||||||
var S3Adapter = require("../src/Adapters/Files/S3Adapter").default;
|
var S3Adapter = require("../src/Adapters/Files/S3Adapter").default;
|
||||||
|
var GCSAdapter = require("../src/Adapters/Files/GCSAdapter").default;
|
||||||
|
|
||||||
describe("AdapterLoader", ()=>{
|
describe("AdapterLoader", ()=>{
|
||||||
|
|
||||||
it("should instantiate an adapter from string in object", (done) => {
|
it("should instantiate an adapter from string in object", (done) => {
|
||||||
var adapterPath = require('path').resolve("./spec/MockAdapter");
|
var adapterPath = require('path').resolve("./spec/MockAdapter");
|
||||||
|
|
||||||
var adapter = loadAdapter({
|
var adapter = loadAdapter({
|
||||||
adapter: adapterPath,
|
adapter: adapterPath,
|
||||||
options: {
|
options: {
|
||||||
key: "value",
|
key: "value",
|
||||||
foo: "bar"
|
foo: "bar"
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(adapter instanceof Object).toBe(true);
|
expect(adapter instanceof Object).toBe(true);
|
||||||
expect(adapter.options.key).toBe("value");
|
expect(adapter.options.key).toBe("value");
|
||||||
expect(adapter.options.foo).toBe("bar");
|
expect(adapter.options.foo).toBe("bar");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should instantiate an adapter from string", (done) => {
|
it("should instantiate an adapter from string", (done) => {
|
||||||
var adapterPath = require('path').resolve("./spec/MockAdapter");
|
var adapterPath = require('path').resolve("./spec/MockAdapter");
|
||||||
var adapter = loadAdapter(adapterPath);
|
var adapter = loadAdapter(adapterPath);
|
||||||
|
|
||||||
expect(adapter instanceof Object).toBe(true);
|
expect(adapter instanceof Object).toBe(true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should instantiate an adapter from string that is module", (done) => {
|
it("should instantiate an adapter from string that is module", (done) => {
|
||||||
var adapterPath = require('path').resolve("./src/Adapters/Files/FilesAdapter");
|
var adapterPath = require('path').resolve("./src/Adapters/Files/FilesAdapter");
|
||||||
var adapter = loadAdapter({
|
var adapter = loadAdapter({
|
||||||
adapter: adapterPath
|
adapter: adapterPath
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(adapter instanceof FilesAdapter).toBe(true);
|
expect(adapter instanceof FilesAdapter).toBe(true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should instantiate an adapter from function/Class", (done) => {
|
it("should instantiate an adapter from function/Class", (done) => {
|
||||||
var adapter = loadAdapter({
|
var adapter = loadAdapter({
|
||||||
adapter: FilesAdapter
|
adapter: FilesAdapter
|
||||||
@@ -48,27 +49,27 @@ describe("AdapterLoader", ()=>{
|
|||||||
expect(adapter instanceof FilesAdapter).toBe(true);
|
expect(adapter instanceof FilesAdapter).toBe(true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should instantiate the default adapter from Class", (done) => {
|
it("should instantiate the default adapter from Class", (done) => {
|
||||||
var adapter = loadAdapter(null, FilesAdapter);
|
var adapter = loadAdapter(null, FilesAdapter);
|
||||||
expect(adapter instanceof FilesAdapter).toBe(true);
|
expect(adapter instanceof FilesAdapter).toBe(true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should use the default adapter", (done) => {
|
it("should use the default adapter", (done) => {
|
||||||
var defaultAdapter = new FilesAdapter();
|
var defaultAdapter = new FilesAdapter();
|
||||||
var adapter = loadAdapter(null, defaultAdapter);
|
var adapter = loadAdapter(null, defaultAdapter);
|
||||||
expect(adapter instanceof FilesAdapter).toBe(true);
|
expect(adapter instanceof FilesAdapter).toBe(true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should use the provided adapter", (done) => {
|
it("should use the provided adapter", (done) => {
|
||||||
var originalAdapter = new FilesAdapter();
|
var originalAdapter = new FilesAdapter();
|
||||||
var adapter = loadAdapter(originalAdapter);
|
var adapter = loadAdapter(originalAdapter);
|
||||||
expect(adapter).toBe(originalAdapter);
|
expect(adapter).toBe(originalAdapter);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should fail loading an improperly configured adapter", (done) => {
|
it("should fail loading an improperly configured adapter", (done) => {
|
||||||
var Adapter = function(options) {
|
var Adapter = function(options) {
|
||||||
if (!options.foo) {
|
if (!options.foo) {
|
||||||
@@ -79,14 +80,14 @@ describe("AdapterLoader", ()=>{
|
|||||||
param: "key",
|
param: "key",
|
||||||
doSomething: function() {}
|
doSomething: function() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
expect(() => {
|
expect(() => {
|
||||||
var adapter = loadAdapter(adapterOptions, Adapter);
|
var adapter = loadAdapter(adapterOptions, Adapter);
|
||||||
expect(adapter).toEqual(adapterOptions);
|
expect(adapter).toEqual(adapterOptions);
|
||||||
}).not.toThrow("foo is required for that adapter");
|
}).not.toThrow("foo is required for that adapter");
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should load push adapter from options", (done) => {
|
it("should load push adapter from options", (done) => {
|
||||||
var options = {
|
var options = {
|
||||||
ios: {
|
ios: {
|
||||||
@@ -100,7 +101,7 @@ describe("AdapterLoader", ()=>{
|
|||||||
}).not.toThrow();
|
}).not.toThrow();
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should load S3Adapter from direct passing", (done) => {
|
it("should load S3Adapter from direct passing", (done) => {
|
||||||
var s3Adapter = new S3Adapter("key", "secret", "bucket")
|
var s3Adapter = new S3Adapter("key", "secret", "bucket")
|
||||||
expect(() => {
|
expect(() => {
|
||||||
@@ -109,4 +110,13 @@ describe("AdapterLoader", ()=>{
|
|||||||
}).not.toThrow();
|
}).not.toThrow();
|
||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("should load GCSAdapter from direct passing", (done) => {
|
||||||
|
var gcsAdapter = new GCSAdapter("projectId", "path/to/keyfile", "bucket")
|
||||||
|
expect(() => {
|
||||||
|
var adapter = loadAdapter(gcsAdapter, FilesAdapter);
|
||||||
|
expect(adapter).toBe(gcsAdapter);
|
||||||
|
}).not.toThrow();
|
||||||
|
done();
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -32,21 +32,21 @@ describe("FilesController",()=>{
|
|||||||
console.log("set S3_ACCESS_KEY and S3_SECRET_KEY to test S3Adapter")
|
console.log("set S3_ACCESS_KEY and S3_SECRET_KEY to test S3Adapter")
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.env.GCP_PROJECT_ID && process.env.GCP_KEYFILE_PATH && process.env.GCS_BUCKET_NAME) {
|
if (process.env.GCP_PROJECT_ID && process.env.GCP_KEYFILE_PATH && process.env.GCS_BUCKET) {
|
||||||
|
|
||||||
// Test the GCS Adapter
|
// Test the GCS Adapter
|
||||||
var gcsAdapter = new GCSAdapter(process.env.GCP_PROJECT_ID, process.env.GCP_KEYFILE_PATH, process.env.GCS_BUCKET_NAME);
|
var gcsAdapter = new GCSAdapter(process.env.GCP_PROJECT_ID, process.env.GCP_KEYFILE_PATH, process.env.GCS_BUCKET);
|
||||||
|
|
||||||
FCTestFactory.testAdapter("GCSAdapter", gcsAdapter);
|
FCTestFactory.testAdapter("GCSAdapter", gcsAdapter);
|
||||||
|
|
||||||
// Test GCS with direct access
|
// Test GCS with direct access
|
||||||
var gcsDirectAccessAdapter = new GCSAdapter(process.env.GCP_PROJECT_ID, process.env.GCP_KEYFILE_PATH, process.env.GCS_BUCKET_NAME, {
|
var gcsDirectAccessAdapter = new GCSAdapter(process.env.GCP_PROJECT_ID, process.env.GCP_KEYFILE_PATH, process.env.GCS_BUCKET, {
|
||||||
directAccess: true
|
directAccess: true
|
||||||
});
|
});
|
||||||
|
|
||||||
FCTestFactory.testAdapter("GCSAdapterDirect", gcsDirectAccessAdapter);
|
FCTestFactory.testAdapter("GCSAdapterDirect", gcsDirectAccessAdapter);
|
||||||
|
|
||||||
} else if (!process.env.TRAVIS) {
|
} else if (!process.env.TRAVIS) {
|
||||||
console.log("set GCP_PROJECT_ID, GCP_KEYFILE_PATH, and GCS_BUCKET_NAME to test GCSAdapter")
|
console.log("set GCP_PROJECT_ID, GCP_KEYFILE_PATH, and GCS_BUCKET to test GCSAdapter")
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export class GCSAdapter extends FilesAdapter {
|
|||||||
constructor(
|
constructor(
|
||||||
projectId = requiredOrFromEnvironment('GCP_PROJECT_ID', 'projectId'),
|
projectId = requiredOrFromEnvironment('GCP_PROJECT_ID', 'projectId'),
|
||||||
keyFilename = requiredOrFromEnvironment('GCP_KEYFILE_PATH', 'keyfile path'),
|
keyFilename = requiredOrFromEnvironment('GCP_KEYFILE_PATH', 'keyfile path'),
|
||||||
bucket = requiredOrFromEnvironment('GCS_BUCKET_NAME', 'bucket name'),
|
bucket = requiredOrFromEnvironment('GCS_BUCKET', 'bucket name'),
|
||||||
{ bucketPrefix = fromEnvironmentOrDefault('GCS_BUCKET_PREFIX', ''),
|
{ bucketPrefix = fromEnvironmentOrDefault('GCS_BUCKET_PREFIX', ''),
|
||||||
directAccess = fromEnvironmentOrDefault('GCS_DIRECT_ACCESS', false) } = {}) {
|
directAccess = fromEnvironmentOrDefault('GCS_DIRECT_ACCESS', false) } = {}) {
|
||||||
super();
|
super();
|
||||||
|
|||||||
Reference in New Issue
Block a user