commit
ea1d007b4f
@ -0,0 +1,157 @@
|
||||
/* 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'));
|
||||
});
|
||||
});
|
||||
});
|
@ -0,0 +1,116 @@
|
||||
/* global storage */
|
||||
|
||||
/* eslint no-await-in-loop: 0 */
|
||||
|
||||
'use strict';
|
||||
|
||||
const PROFILE_ID = 'local-profile';
|
||||
|
||||
describe('Profile', () => {
|
||||
beforeEach(async () => {
|
||||
await clearDatabase();
|
||||
await storage.remove(PROFILE_ID);
|
||||
});
|
||||
|
||||
describe('getLocalProfile', () => {
|
||||
it('returns the local profile', async () => {
|
||||
const values = [null, 'hello', { a: 'b' }];
|
||||
for(let i = 0; i < values.length; i += 1) {
|
||||
await storage.put(PROFILE_ID, values[i]);
|
||||
assert.strictEqual(values[i], storage.getLocalProfile());
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('saveLocalProfile', () => {
|
||||
it('saves a profile', async () => {
|
||||
const values = [null, 'hello', { a: 'b' }];
|
||||
for(let i = 0; i < values.length; i += 1) {
|
||||
await storage.saveLocalProfile(values[i]);
|
||||
assert.strictEqual(values[i], storage.get(PROFILE_ID));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('removeLocalProfile', () => {
|
||||
it('removes a profile', async () => {
|
||||
await storage.saveLocalProfile('a');
|
||||
assert.strictEqual('a', storage.getLocalProfile());
|
||||
|
||||
await storage.removeLocalProfile();
|
||||
assert.strictEqual(null, storage.getLocalProfile());
|
||||
});
|
||||
});
|
||||
|
||||
describe('setProfileName', () => {
|
||||
it('throws if a name is not a string', async () => {
|
||||
const values = [0, { a: 'b'}, [1, 2]];
|
||||
for(let i = 0; i < values.length; i += 1) {
|
||||
try {
|
||||
await storage.setProfileName(values[i]);
|
||||
assert.fail(`setProfileName did not throw an error for ${typeof values[i]}`);
|
||||
} catch (e) {
|
||||
assert.throws(() => { throw e; }, 'Name must be a string!');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('does not throw if we pass a string or null', async () => {
|
||||
const values = [null, '1'];
|
||||
for(let i = 0; i < values.length; i += 1) {
|
||||
try {
|
||||
await storage.setProfileName(values[i]);
|
||||
} catch (e) {
|
||||
assert.fail('setProfileName threw an error');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('saves the display name', async () => {
|
||||
await storage.setProfileName('hi there!');
|
||||
|
||||
const expected = {
|
||||
displayName: 'hi there!',
|
||||
};
|
||||
const profile = storage.getLocalProfile();
|
||||
assert.exists(profile.name);
|
||||
assert.deepEqual(expected, profile.name);
|
||||
});
|
||||
|
||||
it('saves the display name without overwriting the other profile properties', async () => {
|
||||
const profile = { title: 'hello' };
|
||||
await storage.put(PROFILE_ID, profile);
|
||||
await storage.setProfileName('hi there!');
|
||||
|
||||
const expected = {
|
||||
...profile,
|
||||
name: {
|
||||
displayName: 'hi there!',
|
||||
},
|
||||
};
|
||||
assert.deepEqual(expected, storage.getLocalProfile());
|
||||
});
|
||||
|
||||
it('trims the display name', async () => {
|
||||
await storage.setProfileName(' in middle ');
|
||||
const profile = storage.getLocalProfile();
|
||||
const name = {
|
||||
displayName: 'in middle',
|
||||
};
|
||||
assert.deepEqual(name, profile.name);
|
||||
});
|
||||
|
||||
it('unsets the name property if it is empty', async () => {
|
||||
const profile = {
|
||||
name: {
|
||||
displayName: 'HI THERE!',
|
||||
},
|
||||
};
|
||||
await storage.put(PROFILE_ID, profile);
|
||||
assert.exists(storage.getLocalProfile().name);
|
||||
|
||||
await storage.setProfileName('');
|
||||
assert.notExists(storage.getLocalProfile().name);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue