Skip to content

Commit 852f923

Browse files
committed
Endpoints for audiences CRUD
1 parent e94991b commit 852f923

File tree

11 files changed

+424
-62
lines changed

11 files changed

+424
-62
lines changed

spec/AudienceRouter.spec.js

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,275 @@
1+
var auth = require('../src/Auth');
2+
var Config = require('../src/Config');
3+
var rest = require('../src/rest');
4+
var AudiencesRouter = require('../src/Routers/AudiencesRouter').AudiencesRouter;
5+
6+
describe('AudiencesRouter', () => {
7+
it('uses find condition from request.body', (done) => {
8+
var config = new Config('test');
9+
var androidAudienceRequest = {
10+
'name': 'Android Users',
11+
'query': '{ "test": "android" }'
12+
};
13+
var iosAudienceRequest = {
14+
'name': 'Iphone Users',
15+
'query': '{ "test": "ios" }'
16+
};
17+
var request = {
18+
config: config,
19+
auth: auth.master(config),
20+
body: {
21+
where: {
22+
query: '{ "test": "android" }'
23+
}
24+
},
25+
query: {},
26+
info: {}
27+
};
28+
29+
var router = new AudiencesRouter();
30+
rest.create(config, auth.nobody(config), '_Audience', androidAudienceRequest)
31+
.then(() => {
32+
return rest.create(config, auth.nobody(config), '_Audience', iosAudienceRequest);
33+
}).then(() => {
34+
return router.handleFind(request);
35+
}).then((res) => {
36+
var results = res.response.results;
37+
expect(results.length).toEqual(1);
38+
done();
39+
}).catch((err) => {
40+
fail(JSON.stringify(err));
41+
done();
42+
});
43+
});
44+
45+
it('uses find condition from request.query', (done) => {
46+
var config = new Config('test');
47+
var androidAudienceRequest = {
48+
'name': 'Android Users',
49+
'query': '{ "test": "android" }'
50+
};
51+
var iosAudienceRequest = {
52+
'name': 'Iphone Users',
53+
'query': '{ "test": "ios" }'
54+
};
55+
var request = {
56+
config: config,
57+
auth: auth.master(config),
58+
body: {},
59+
query: {
60+
where: {
61+
'query': '{ "test": "android" }'
62+
}
63+
},
64+
info: {}
65+
};
66+
67+
var router = new AudiencesRouter();
68+
rest.create(config, auth.nobody(config), '_Audience', androidAudienceRequest)
69+
.then(() => {
70+
return rest.create(config, auth.nobody(config), '_Audience', iosAudienceRequest);
71+
}).then(() => {
72+
return router.handleFind(request);
73+
}).then((res) => {
74+
var results = res.response.results;
75+
expect(results.length).toEqual(1);
76+
done();
77+
}).catch((err) => {
78+
fail(err);
79+
done();
80+
});
81+
});
82+
83+
it('query installations with limit = 0', (done) => {
84+
var config = new Config('test');
85+
var androidAudienceRequest = {
86+
'name': 'Android Users',
87+
'query': '{ "test": "android" }'
88+
};
89+
var iosAudienceRequest = {
90+
'name': 'Iphone Users',
91+
'query': '{ "test": "ios" }'
92+
};
93+
var request = {
94+
config: config,
95+
auth: auth.master(config),
96+
body: {},
97+
query: {
98+
limit: 0
99+
},
100+
info: {}
101+
};
102+
103+
new Config('test');
104+
var router = new AudiencesRouter();
105+
rest.create(config, auth.nobody(config), '_Audience', androidAudienceRequest)
106+
.then(() => {
107+
return rest.create(config, auth.nobody(config), '_Audience', iosAudienceRequest);
108+
}).then(() => {
109+
return router.handleFind(request);
110+
}).then((res) => {
111+
var response = res.response;
112+
expect(response.results.length).toEqual(0);
113+
done();
114+
}).catch((err) => {
115+
fail(JSON.stringify(err));
116+
done();
117+
});
118+
});
119+
120+
it('query installations with count = 1', done => {
121+
var config = new Config('test');
122+
var androidAudienceRequest = {
123+
'name': 'Android Users',
124+
'query': '{ "test": "android" }'
125+
};
126+
var iosAudienceRequest = {
127+
'name': 'Iphone Users',
128+
'query': '{ "test": "ios" }'
129+
};
130+
var request = {
131+
config: config,
132+
auth: auth.master(config),
133+
body: {},
134+
query: {
135+
count: 1
136+
},
137+
info: {}
138+
};
139+
140+
var router = new AudiencesRouter();
141+
rest.create(config, auth.nobody(config), '_Audience', androidAudienceRequest)
142+
.then(() => rest.create(config, auth.nobody(config), '_Audience', iosAudienceRequest))
143+
.then(() => router.handleFind(request))
144+
.then((res) => {
145+
var response = res.response;
146+
expect(response.results.length).toEqual(2);
147+
expect(response.count).toEqual(2);
148+
done();
149+
})
150+
.catch(error => {
151+
fail(JSON.stringify(error));
152+
done();
153+
})
154+
});
155+
156+
it('query installations with limit = 0 and count = 1', (done) => {
157+
var config = new Config('test');
158+
var androidAudienceRequest = {
159+
'name': 'Android Users',
160+
'query': '{ "test": "android" }'
161+
};
162+
var iosAudienceRequest = {
163+
'name': 'Iphone Users',
164+
'query': '{ "test": "ios" }'
165+
};
166+
var request = {
167+
config: config,
168+
auth: auth.master(config),
169+
body: {},
170+
query: {
171+
limit: 0,
172+
count: 1
173+
},
174+
info: {}
175+
};
176+
177+
var router = new AudiencesRouter();
178+
rest.create(config, auth.nobody(config), '_Audience', androidAudienceRequest)
179+
.then(() => {
180+
return rest.create(config, auth.nobody(config), '_Audience', iosAudienceRequest);
181+
}).then(() => {
182+
return router.handleFind(request);
183+
}).then((res) => {
184+
var response = res.response;
185+
expect(response.results.length).toEqual(0);
186+
expect(response.count).toEqual(2);
187+
done();
188+
}).catch((err) => {
189+
fail(JSON.stringify(err));
190+
done();
191+
});
192+
});
193+
194+
it('should create, read, update and delete audiences throw api', (done) => {
195+
Parse._request('POST', 'push_audiences', { name: 'My Audience', query: JSON.stringify({ deviceType: 'ios' })}, { useMasterKey: true })
196+
.then(() => {
197+
Parse._request('GET', 'push_audiences', {}, { useMasterKey: true }).then((results) => {
198+
expect(results.results.length).toEqual(1);
199+
expect(results.results[0].name).toEqual('My Audience');
200+
expect(results.results[0].query.deviceType).toEqual('ios');
201+
Parse._request('GET', `push_audiences/${results.results[0].objectId}`, {}, { useMasterKey: true }).then((results) => {
202+
expect(results.name).toEqual('My Audience');
203+
expect(results.query.deviceType).toEqual('ios');
204+
Parse._request('PUT', `push_audiences/${results.objectId}`, { name: 'My Audience 2' }, { useMasterKey: true }).then(() => {
205+
Parse._request('GET', `push_audiences/${results.objectId}`, {}, { useMasterKey: true }).then((results) => {
206+
expect(results.name).toEqual('My Audience 2');
207+
expect(results.query.deviceType).toEqual('ios');
208+
Parse._request('DELETE', `push_audiences/${results.objectId}`, {}, { useMasterKey: true }).then(() => {
209+
Parse._request('GET', 'push_audiences', {}, { useMasterKey: true }).then((results) => {
210+
expect(results.results.length).toEqual(0);
211+
done();
212+
});
213+
});
214+
});
215+
});
216+
});
217+
});
218+
});
219+
});
220+
221+
it('should only create with master key', (done) => {
222+
Parse._request('POST', 'push_audiences', { name: 'My Audience', query: JSON.stringify({ deviceType: 'ios' })})
223+
.then(
224+
() => {},
225+
(error) => {
226+
expect(error.message).toEqual('unauthorized: master key is required');
227+
done();
228+
}
229+
);
230+
});
231+
232+
it('should only find with master key', (done) => {
233+
Parse._request('GET', 'push_audiences', {})
234+
.then(
235+
() => {},
236+
(error) => {
237+
expect(error.message).toEqual('unauthorized: master key is required');
238+
done();
239+
}
240+
);
241+
});
242+
243+
it('should only get with master key', (done) => {
244+
Parse._request('GET', `push_audiences/someId`, {})
245+
.then(
246+
() => {},
247+
(error) => {
248+
expect(error.message).toEqual('unauthorized: master key is required');
249+
done();
250+
}
251+
);
252+
});
253+
254+
it('should only update with master key', (done) => {
255+
Parse._request('PUT', `push_audiences/someId`, { name: 'My Audience 2' })
256+
.then(
257+
() => {},
258+
(error) => {
259+
expect(error.message).toEqual('unauthorized: master key is required');
260+
done();
261+
}
262+
);
263+
});
264+
265+
it('should only delete with master key', (done) => {
266+
Parse._request('DELETE', `push_audiences/someId`, {})
267+
.then(
268+
() => {},
269+
(error) => {
270+
expect(error.message).toEqual('unauthorized: master key is required');
271+
done();
272+
}
273+
);
274+
});
275+
});

spec/ParseQuery.spec.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -915,15 +915,15 @@ describe('Parse.Query testing', () => {
915915

916916
it("order by descending number and string, with space", function(done) {
917917
var strings = ["a", "b", "c", "d"];
918-
var makeBoxedNumber = function(num, i) {
919-
return new BoxedNumber({ number: num, string: strings[i] });
918+
var makeBoxedNumber = function (num, i) {
919+
return new BoxedNumber({number: num, string: strings[i]});
920920
};
921921
Parse.Object.saveAll([3, 1, 3, 2].map(makeBoxedNumber)).then(
922-
function() {
922+
function () {
923923
var query = new Parse.Query(BoxedNumber);
924924
query.descending("number, string");
925925
query.find(expectSuccess({
926-
success: function(results) {
926+
success: function (results) {
927927
equal(results.length, 4);
928928
equal(results[0].get("number"), 3);
929929
equal(results[0].get("string"), "c");
@@ -936,7 +936,8 @@ describe('Parse.Query testing', () => {
936936
done();
937937
}
938938
}));
939-
}, (err) => {
939+
},
940+
(err) => {
940941
jfail(err);
941942
done();
942943
});

spec/RestQuery.spec.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,10 @@ describe('rest query', () => {
176176
const p0 = rp.get({
177177
headers: headers,
178178
url: 'http://localhost:8378/1/classes/TestParameterEncode?'
179-
+ querystring.stringify({
180-
where: '{"foo":{"$ne": "baz"}}',
181-
limit: 1
182-
}).replace('=', '%3D'),
179+
+ querystring.stringify({
180+
where: '{"foo":{"$ne": "baz"}}',
181+
limit: 1
182+
}).replace('=', '%3D'),
183183
}).then(fail, (response) => {
184184
const error = response.error;
185185
var b = JSON.parse(error);
@@ -189,9 +189,9 @@ describe('rest query', () => {
189189
const p1 = rp.get({
190190
headers: headers,
191191
url: 'http://localhost:8378/1/classes/TestParameterEncode?'
192-
+ querystring.stringify({
193-
limit: 1
194-
}).replace('=', '%3D'),
192+
+ querystring.stringify({
193+
limit: 1
194+
}).replace('=', '%3D'),
195195
}).then(fail, (response) => {
196196
const error = response.error;
197197
var b = JSON.parse(error);

src/Adapters/Storage/Postgres/PostgresStorageAdapter.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -667,11 +667,11 @@ export class PostgresStorageAdapter {
667667
const joins = results.reduce((list, schema) => {
668668
return list.concat(joinTablesForSchema(schema.schema));
669669
}, []);
670-
const classes = ['_SCHEMA','_PushStatus','_JobStatus','_JobSchedule','_Hooks','_GlobalConfig', ...results.map(result => result.className), ...joins];
671-
return this._client.tx(t=>t.batch(classes.map(className=>t.none('DROP TABLE IF EXISTS $<className:name>', { className }))));
670+
const classes = ['_SCHEMA', '_PushStatus', '_JobStatus', '_JobSchedule', '_Hooks', '_GlobalConfig', '_Audience', ...results.map(result => result.className), ...joins];
671+
return this._client.tx(t=>t.batch(classes.map(className=>t.none('DROP TABLE IF EXISTS $<className:name>', {className}))));
672672
}, error => {
673673
if (error.code === PostgresRelationDoesNotExistError) {
674-
// No _SCHEMA collection. Don't delete anything.
674+
// No _SCHEMA collection. Don't delete anything.
675675
return;
676676
} else {
677677
throw error;

src/Controllers/DatabaseController.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -690,11 +690,12 @@ DatabaseController.prototype.reduceRelationKeys = function(className, query) {
690690
return this.relatedIds(
691691
relatedTo.object.className,
692692
relatedTo.key,
693-
relatedTo.object.objectId).then((ids) => {
694-
delete query['$relatedTo'];
695-
this.addInObjectIdsIds(ids, query);
696-
return this.reduceRelationKeys(className, query);
697-
});
693+
relatedTo.object.objectId)
694+
.then((ids) => {
695+
delete query['$relatedTo'];
696+
this.addInObjectIdsIds(ids, query);
697+
return this.reduceRelationKeys(className, query);
698+
});
698699
}
699700
};
700701

0 commit comments

Comments
 (0)