Skip to content

Commit edd3d4b

Browse files
committed
Endpoints for audiences CRUD
1 parent e94991b commit edd3d4b

File tree

11 files changed

+448
-74
lines changed

11 files changed

+448
-74
lines changed

spec/AudienceRouter.spec.js

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

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: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -175,28 +175,28 @@ describe('rest query', () => {
175175

176176
const p0 = rp.get({
177177
headers: headers,
178-
url: 'http://localhost:8378/1/classes/TestParameterEncode?'
179-
+ querystring.stringify({
180-
where: '{"foo":{"$ne": "baz"}}',
181-
limit: 1
182-
}).replace('=', '%3D'),
183-
}).then(fail, (response) => {
184-
const error = response.error;
185-
var b = JSON.parse(error);
186-
expect(b.code).toEqual(Parse.Error.INVALID_QUERY);
187-
});
178+
url: 'http://localhost:8378/1/classes/TestParameterEncode?' + querystring.stringify({
179+
where: '{"foo":{"$ne": "baz"}}',
180+
limit: 1
181+
}).replace('=', '%3D'),
182+
})
183+
.then(fail, (response) => {
184+
const error = response.error;
185+
var b = JSON.parse(error);
186+
expect(b.code).toEqual(Parse.Error.INVALID_QUERY);
187+
});
188188

189189
const p1 = rp.get({
190190
headers: headers,
191-
url: 'http://localhost:8378/1/classes/TestParameterEncode?'
192-
+ querystring.stringify({
193-
limit: 1
194-
}).replace('=', '%3D'),
195-
}).then(fail, (response) => {
196-
const error = response.error;
197-
var b = JSON.parse(error);
198-
expect(b.code).toEqual(Parse.Error.INVALID_QUERY);
199-
});
191+
url: 'http://localhost:8378/1/classes/TestParameterEncode?' + querystring.stringify({
192+
limit: 1
193+
}).replace('=', '%3D'),
194+
})
195+
.then(fail, (response) => {
196+
const error = response.error;
197+
var b = JSON.parse(error);
198+
expect(b.code).toEqual(Parse.Error.INVALID_QUERY);
199+
});
200200
return Promise.all([p0, p1]);
201201
}).then(done).catch((err) => {
202202
jfail(err);

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)