|  |  |  | /* global textsecure, BlockedNumberController, storage */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | describe('Blocked Number Controller', () => { | 
					
						
							|  |  |  |   beforeEach(async () => { | 
					
						
							|  |  |  |     // Purge everything manually
 | 
					
						
							|  |  |  |     const numbers = storage.getBlockedNumbers(); | 
					
						
							|  |  |  |     numbers.forEach(storage.removeBlockedNumber); | 
					
						
							|  |  |  |     window.getBlockedNumbers().reset([]); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('reset', () => { | 
					
						
							|  |  |  |     it('clears blocked numbers', () => { | 
					
						
							|  |  |  |       BlockedNumberController.block('1'); | 
					
						
							|  |  |  |       assert.isNotEmpty(storage.getBlockedNumbers()); | 
					
						
							|  |  |  |       assert.isNotEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.reset(); | 
					
						
							|  |  |  |       assert.isEmpty(storage.getBlockedNumbers()); | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('refresh', () => { | 
					
						
							|  |  |  |     it('loads blocked numbers from storage', () => { | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       storage.addBlockedNumber('1'); | 
					
						
							|  |  |  |       storage.addBlockedNumber('2'); | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const blocked = window.getBlockedNumbers().map(m => m.get('number')); | 
					
						
							|  |  |  |       assert.lengthOf(blocked, 2); | 
					
						
							|  |  |  |       assert.deepEqual(['1', '2'], blocked.sort()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('overrides old numbers if we refresh again', () => { | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       storage.addBlockedNumber('1'); | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  |       assert.isNotEmpty( | 
					
						
							|  |  |  |         window.getBlockedNumbers().find(m => m.get('number') === '1') | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       storage.removeBlockedNumber('1'); | 
					
						
							|  |  |  |       storage.addBlockedNumber('2'); | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  |       assert.isNotEmpty( | 
					
						
							|  |  |  |         window.getBlockedNumbers().find(m => m.get('number') === '2') | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('throws if storage is invalid', () => { | 
					
						
							|  |  |  |       const _storage = window.storage; | 
					
						
							|  |  |  |       window.storage = null; | 
					
						
							|  |  |  |       assert.throws( | 
					
						
							|  |  |  |         () => BlockedNumberController.refresh(), | 
					
						
							|  |  |  |         'BlockedNumberController: Could not load blocked numbers' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       window.storage = _storage; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('block', () => { | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  |       assert.isEmpty(storage.getBlockedNumbers()); | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('adds number to the blocked list', () => { | 
					
						
							|  |  |  |       BlockedNumberController.block('1'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const numbers = window.getBlockedNumbers().models; | 
					
						
							|  |  |  |       assert.lengthOf(numbers, 1); | 
					
						
							|  |  |  |       assert.strictEqual('1', numbers[0].get('number')); | 
					
						
							|  |  |  |       assert.deepEqual(['1'], storage.getBlockedNumbers()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('only blocks the same number once', () => { | 
					
						
							|  |  |  |       BlockedNumberController.block('2'); | 
					
						
							|  |  |  |       BlockedNumberController.block('2'); | 
					
						
							|  |  |  |       assert.lengthOf(window.getBlockedNumbers().models, 1); | 
					
						
							|  |  |  |       assert.deepEqual(['2'], storage.getBlockedNumbers()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('does not block our own number', () => { | 
					
						
							|  |  |  |       BlockedNumberController.block(textsecure.storage.user.getNumber()); | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  |       assert.isEmpty(storage.getBlockedNumbers()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('unblock', () => { | 
					
						
							|  |  |  |     beforeEach(() => { | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  |       assert.isEmpty(storage.getBlockedNumbers()); | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('removes number from the blocked list', () => { | 
					
						
							|  |  |  |       BlockedNumberController.block('1'); | 
					
						
							|  |  |  |       BlockedNumberController.block('2'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert.lengthOf(window.getBlockedNumbers().models, 2); | 
					
						
							|  |  |  |       assert.lengthOf(storage.getBlockedNumbers(), 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.unblock('1'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const numbers = window.getBlockedNumbers().models; | 
					
						
							|  |  |  |       assert.lengthOf(numbers, 1); | 
					
						
							|  |  |  |       assert.isEmpty(numbers.filter(n => n.get('number') === '1')); | 
					
						
							|  |  |  |       assert.deepEqual(['2'], storage.getBlockedNumbers()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     it('removes number from the blocked list even if it is not present in the collection', () => { | 
					
						
							|  |  |  |       BlockedNumberController.block('1'); | 
					
						
							|  |  |  |       BlockedNumberController.block('2'); | 
					
						
							|  |  |  |       window.getBlockedNumbers().reset([]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert.isEmpty(window.getBlockedNumbers().models); | 
					
						
							|  |  |  |       assert.lengthOf(storage.getBlockedNumbers(), 2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.unblock('1'); | 
					
						
							|  |  |  |       assert.deepEqual(['2'], storage.getBlockedNumbers()); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('unblockAll', () => { | 
					
						
							|  |  |  |     it('removes all our blocked numbers', () => { | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.block('1'); | 
					
						
							|  |  |  |       BlockedNumberController.block('2'); | 
					
						
							|  |  |  |       BlockedNumberController.block('3'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert.lengthOf(window.getBlockedNumbers().models, 3); | 
					
						
							|  |  |  |       assert.lengthOf(storage.getBlockedNumbers(), 3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.unblockAll(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       assert.lengthOf(window.getBlockedNumbers().models, 0); | 
					
						
							|  |  |  |       assert.lengthOf(storage.getBlockedNumbers(), 0); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   describe('isBlocked', () => { | 
					
						
							|  |  |  |     it('returns whether a number is blocked', () => { | 
					
						
							|  |  |  |       BlockedNumberController.refresh(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.block('1'); | 
					
						
							|  |  |  |       assert.isOk(BlockedNumberController.isBlocked('1')); | 
					
						
							|  |  |  |       assert.isNotOk(BlockedNumberController.isBlocked('2')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BlockedNumberController.unblock('1'); | 
					
						
							|  |  |  |       assert.isNotOk(BlockedNumberController.isBlocked('1')); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |