|  | 
|  | 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