const ParseServerRESTController = require('../lib/ParseServerRESTController') .ParseServerRESTController; const ParseServer = require('../lib/ParseServer').default; const Parse = require('parse/node').Parse; let RESTController; describe('ParseServerRESTController', () => { beforeEach(() => { RESTController = ParseServerRESTController( Parse.applicationId, ParseServer.promiseRouter({ appId: Parse.applicationId }) ); }); it('should handle a get request', done => { RESTController.request('GET', '/classes/MyObject').then( res => { expect(res.results.length).toBe(0); done(); }, err => { console.log(err); jfail(err); done(); } ); }); it('should handle a get request with full serverURL mount path', done => { RESTController.request('GET', '/1/classes/MyObject').then( res => { expect(res.results.length).toBe(0); done(); }, err => { jfail(err); done(); } ); }); it('should handle a POST batch', done => { RESTController.request('POST', 'batch', { requests: [ { method: 'GET', path: '/classes/MyObject', }, { method: 'POST', path: '/classes/MyObject', body: { key: 'value' }, }, { method: 'GET', path: '/classes/MyObject', }, ], }).then( res => { expect(res.length).toBe(3); done(); }, err => { jfail(err); done(); } ); }); it('should handle a POST request', done => { RESTController.request('POST', '/classes/MyObject', { key: 'value' }) .then(() => { return RESTController.request('GET', '/classes/MyObject'); }) .then(res => { expect(res.results.length).toBe(1); expect(res.results[0].key).toEqual('value'); done(); }) .catch(err => { console.log(err); jfail(err); done(); }); }); it('ensures sessionTokens are properly handled', done => { let userId; Parse.User.signUp('user', 'pass') .then(user => { userId = user.id; const sessionToken = user.getSessionToken(); return RESTController.request('GET', '/users/me', undefined, { sessionToken, }); }) .then(res => { // Result is in JSON format expect(res.objectId).toEqual(userId); done(); }) .catch(err => { console.log(err); jfail(err); done(); }); }); it('ensures masterKey is properly handled', done => { let userId; Parse.User.signUp('user', 'pass') .then(user => { userId = user.id; return Parse.User.logOut().then(() => { return RESTController.request('GET', '/classes/_User', undefined, { useMasterKey: true, }); }); }) .then( res => { expect(res.results.length).toBe(1); expect(res.results[0].objectId).toEqual(userId); done(); }, err => { jfail(err); done(); } ); }); it('ensures no user is created when passing an empty username', done => { RESTController.request('POST', '/classes/_User', { username: '', password: 'world', }).then( () => { jfail( new Error( 'Success callback should not be called when passing an empty username.' ) ); done(); }, err => { expect(err.code).toBe(Parse.Error.USERNAME_MISSING); expect(err.message).toBe('bad or missing username'); done(); } ); }); it('ensures no user is created when passing an empty password', done => { RESTController.request('POST', '/classes/_User', { username: 'hello', password: '', }).then( () => { jfail( new Error( 'Success callback should not be called when passing an empty password.' ) ); done(); }, err => { expect(err.code).toBe(Parse.Error.PASSWORD_MISSING); expect(err.message).toBe('password is required'); done(); } ); }); it('ensures no session token is created on creating users', done => { RESTController.request('POST', '/classes/_User', { username: 'hello', password: 'world', }) .then(user => { expect(user.sessionToken).toBeUndefined(); const query = new Parse.Query('_Session'); return query.find({ useMasterKey: true }); }) .then(sessions => { expect(sessions.length).toBe(0); done(); }, done.fail); }); it('ensures a session token is created when passing installationId != cloud', done => { RESTController.request( 'POST', '/classes/_User', { username: 'hello', password: 'world' }, { installationId: 'my-installation' } ) .then(user => { expect(user.sessionToken).not.toBeUndefined(); const query = new Parse.Query('_Session'); return query.find({ useMasterKey: true }); }) .then( sessions => { expect(sessions.length).toBe(1); expect(sessions[0].get('installationId')).toBe('my-installation'); done(); }, err => { jfail(err); done(); } ); }); });