|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const Parse = require('../../react-native'); |
| 4 | +const { resolvingPromise } = require('../../lib/react-native/promiseUtils'); |
| 5 | +const CryptoController = require('../../lib/react-native/CryptoController'); |
| 6 | +const LocalDatastoreController = require('../../lib/react-native/LocalDatastoreController.default'); |
| 7 | +const StorageController = require('../../lib/react-native/StorageController.default'); |
| 8 | +const RESTController = require('../../lib/react-native/RESTController'); |
| 9 | + |
| 10 | +RESTController._setXHR(require('xmlhttprequest').XMLHttpRequest); |
| 11 | + |
| 12 | +describe('Parse React Native', () => { |
| 13 | + beforeEach(() => { |
| 14 | + // Set up missing controllers and configurations |
| 15 | + Parse.CoreManager.setWebSocketController(require('ws')); |
| 16 | + Parse.CoreManager.setEventEmitter(require('events').EventEmitter); |
| 17 | + Parse.CoreManager.setLocalDatastoreController(LocalDatastoreController); |
| 18 | + Parse.CoreManager.setStorageController(StorageController); |
| 19 | + Parse.CoreManager.setRESTController(RESTController); |
| 20 | + Parse.CoreManager.setCryptoController(CryptoController); |
| 21 | + |
| 22 | + Parse.initialize('integration'); |
| 23 | + Parse.CoreManager.set('SERVER_URL', 'http://localhost:1337/parse'); |
| 24 | + Parse.CoreManager.set('MASTER_KEY', 'notsosecret'); |
| 25 | + Parse.enableLocalDatastore(); |
| 26 | + }); |
| 27 | + |
| 28 | + afterEach(async () => { |
| 29 | + await Parse.User.logOut(); |
| 30 | + Parse.Storage._clear(); |
| 31 | + }); |
| 32 | + |
| 33 | + it('can log in a user', async () => { |
| 34 | + // Handle Storage Controller |
| 35 | + await Parse.User.signUp('asdf', 'zxcv') |
| 36 | + const user = await Parse.User.logIn('asdf', 'zxcv'); |
| 37 | + expect(user.get('username')).toBe('asdf'); |
| 38 | + expect(user.existed()).toBe(true); |
| 39 | + }); |
| 40 | + |
| 41 | + it('can encrypt user', async () => { |
| 42 | + // Handle Crypto Controller |
| 43 | + Parse.User.enableUnsafeCurrentUser(); |
| 44 | + Parse.enableEncryptedUser(); |
| 45 | + Parse.secret = 'My Secret Key'; |
| 46 | + const user = new Parse.User(); |
| 47 | + user.setUsername('usernameENC'); |
| 48 | + user.setPassword('passwordENC'); |
| 49 | + await user.signUp(); |
| 50 | + |
| 51 | + const path = Parse.Storage.generatePath('currentUser'); |
| 52 | + const encryptedUser = Parse.Storage.getItem(path); |
| 53 | + |
| 54 | + const crypto = Parse.CoreManager.getCryptoController(); |
| 55 | + |
| 56 | + const decryptedUser = crypto.decrypt(encryptedUser, Parse.CoreManager.get('ENCRYPTED_KEY')); |
| 57 | + expect(JSON.parse(decryptedUser).objectId).toBe(user.id); |
| 58 | + |
| 59 | + const currentUser = Parse.User.current(); |
| 60 | + expect(currentUser).toEqual(user); |
| 61 | + |
| 62 | + const currentUserAsync = await Parse.User.currentAsync(); |
| 63 | + expect(currentUserAsync).toEqual(user); |
| 64 | + await Parse.User.logOut(); |
| 65 | + Parse.CoreManager.set('ENCRYPTED_USER', false); |
| 66 | + Parse.CoreManager.set('ENCRYPTED_KEY', null); |
| 67 | + }); |
| 68 | + |
| 69 | + it('can pin saved object LDS', async () => { |
| 70 | + // Handle LocalDatastore Controller |
| 71 | + function LDS_KEY(object) { |
| 72 | + return Parse.LocalDatastore.getKeyForObject(object); |
| 73 | + } |
| 74 | + const object = new Parse.Object('TestObject'); |
| 75 | + object.set('field', 'test'); |
| 76 | + await object.save(); |
| 77 | + await object.pin(); |
| 78 | + const localDatastore = await Parse.LocalDatastore._getAllContents(); |
| 79 | + const cachedObject = localDatastore[LDS_KEY(object)][0]; |
| 80 | + expect(Object.keys(localDatastore).length).toBe(2); |
| 81 | + expect(cachedObject.objectId).toBe(object.id); |
| 82 | + expect(cachedObject.field).toBe('test'); |
| 83 | + }); |
| 84 | + |
| 85 | + it('can subscribe to query', async () => { |
| 86 | + // Handle WebSocket Controller |
| 87 | + const object = new Parse.Object('TestObject'); |
| 88 | + await object.save(); |
| 89 | + const installationId = await Parse.CoreManager.getInstallationController().currentInstallationId(); |
| 90 | + |
| 91 | + const query = new Parse.Query('TestObject'); |
| 92 | + query.equalTo('objectId', object.id); |
| 93 | + const subscription = await query.subscribe(); |
| 94 | + const promise = resolvingPromise(); |
| 95 | + subscription.on('update', (object, _, response) => { |
| 96 | + expect(object.get('foo')).toBe('bar'); |
| 97 | + expect(response.installationId).toBe(installationId); |
| 98 | + promise.resolve(); |
| 99 | + }); |
| 100 | + object.set({ foo: 'bar' }); |
| 101 | + await object.save(); |
| 102 | + await promise; |
| 103 | + }); |
| 104 | +}); |
0 commit comments