refactor: initialise settings from config module and persist only the values

Closes #30, #59
This commit is contained in:
Sebastian Lange
2019-04-29 14:04:25 +02:00
parent e1039aa226
commit 235693a9e2
14 changed files with 1673 additions and 256 deletions

View File

@@ -14,123 +14,165 @@
*/
import {TestBed} from '@angular/core/testing';
import {SCSetting, SCThingOriginType, SCThingType} from '@openstapps/core';
import {StorageModule} from '../storage/storage.module';
import {ConfigProvider} from '../config/config.provider';
import {StorageProvider} from '../storage/storage.provider';
import {SettingsProvider} from './settings.provider';
import {SettingsProvider, SettingValuesContainer, STORAGE_KEY_SETTING_VALUES} from './settings.provider';
import {Geolocation} from '@ionic-native/geolocation/ngx';
describe('SettingsProvider', () => {
let configProviderSpy: jasmine.SpyObj<ConfigProvider>;
let settingsProvider: SettingsProvider;
let storageModule: StorageProvider;
let storageProviderSpy: jasmine.SpyObj<StorageProvider>;
beforeEach(async () => {
TestBed.configureTestingModule({
imports: [StorageModule],
providers: [SettingsProvider, StorageProvider],
});
settingsProvider = TestBed.get(SettingsProvider);
storageModule = TestBed.get(StorageProvider);
const storageProviderMethodSpy = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']);
const configProviderMethodSpy = jasmine.createSpyObj('ConfigProvider', ['getValue']);
settingsProvider.clear();
TestBed.configureTestingModule({
imports: [],
providers: [
SettingsProvider,
{
provide: StorageProvider, useValue: storageProviderMethodSpy,
},
{
provide: ConfigProvider, useValue: configProviderMethodSpy,
},
Geolocation,
],
});
configProviderSpy = TestBed.get(ConfigProvider);
// set settings returned from config
configProviderSpy.getValue.and.returnValue(Promise.resolve(CONFIG_SETTINGS_MOCK));
settingsProvider = TestBed.get(SettingsProvider);
storageProviderSpy = TestBed.get(StorageProvider);
storageProviderMethodSpy.has.and.returnValue(false);
});
it('should provide and get setting', async () => {
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
const setting = await settingsProvider.getSetting(SETTING_MOCKS[0].categories[0], SETTING_MOCKS[0].name);
await expect(setting).toBeDefined();
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
const setting: SCSetting = await settingsProvider
.getSetting(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name);
await expect(setting.input.value).toBeDefined();
});
it('should provide and get settings value', async () => {
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
const value = await settingsProvider.getSettingValue(SETTING_MOCKS[0].categories[0], SETTING_MOCKS[0].name);
await expect(value).toBeDefined();
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
const value = await settingsProvider
.getValue(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name);
await expect(value).toEqual(CONFIG_SETTINGS_MOCK[0].input.defaultValue);
});
it('should get persisted setting value', async () => {
// set return values of storage
storageProviderSpy.has.and.returnValue(Promise.resolve(true));
storageProviderSpy.get.and.returnValue(Promise.resolve(SETTING_VALUES_MOCK));
const value = await settingsProvider
.getValue(CONFIG_SETTINGS_MOCK[3].categories[0], CONFIG_SETTINGS_MOCK[3].name);
await expect(value).toEqual(SETTING_VALUES_MOCK.profile.group);
});
it('should set default setting value if no persisted value exist', async () => {
// set return values of spy objects
storageProviderSpy.has.and.returnValue(Promise.resolve(true));
storageProviderSpy.get.and.returnValue(Promise.resolve([]));
const value = await settingsProvider
.getValue(CONFIG_SETTINGS_MOCK[3].categories[0], CONFIG_SETTINGS_MOCK[3].name);
await expect(value).toEqual(CONFIG_SETTINGS_MOCK[3].input.defaultValue);
});
it('should keep persisted setting values from settings that are not contained in loaded config', async () => {
const settings = [
CONFIG_SETTINGS_MOCK[4],
CONFIG_SETTINGS_MOCK[5],
];
configProviderSpy.getValue.and.returnValue(Promise.resolve(settings));
storageProviderSpy.has.and.returnValue(Promise.resolve(true));
storageProviderSpy.get.and.returnValue(Promise.resolve(SETTING_VALUES_MOCK));
await settingsProvider.init();
await expect(storageProviderSpy.put).toHaveBeenCalledWith(STORAGE_KEY_SETTING_VALUES, SETTING_VALUES_MOCK);
});
it('should set value of a provided setting', async () => {
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
await settingsProvider.setSettingValue(SETTING_MOCKS[0].categories[0], SETTING_MOCKS[0].name, 'updated');
const value = await settingsProvider.getSettingValue(SETTING_MOCKS[0].categories[0], SETTING_MOCKS[0].name);
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[1])));
await settingsProvider
.setSettingValue(CONFIG_SETTINGS_MOCK[1].categories[0], CONFIG_SETTINGS_MOCK[1].name, 'updated');
const value = await settingsProvider
.getValue(CONFIG_SETTINGS_MOCK[1].categories[0], CONFIG_SETTINGS_MOCK[1].name);
await expect(value).toEqual('updated');
});
it('should return copy of settingsCache', async () => {
const category = SETTING_MOCKS[0].categories[0];
const name = SETTING_MOCKS[0].name;
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
const settings = await settingsProvider.getSettingsCache();
const category = CONFIG_SETTINGS_MOCK[0].categories[0];
const name = CONFIG_SETTINGS_MOCK[0].name;
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
const settings = await settingsProvider.getCache();
settings[category].settings[name].input.value = 'testValue';
// cached setting value should still be defaultValue
await expect((await settingsProvider.getSettingValue(category, name)))
.toEqual(SETTING_MOCKS[0].input.defaultValue);
});
it('should call storage put on provideSetting', async () => {
spyOn(storageModule, 'put');
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
await expect(storageModule.put).toHaveBeenCalled();
await expect((await settingsProvider.getValue(category, name)))
.toEqual(CONFIG_SETTINGS_MOCK[0].input.defaultValue);
});
it('should call storage put on setSettingValue', async () => {
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
spyOn(storageModule, 'put');
await settingsProvider.setSettingValue(SETTING_MOCKS[0].categories[0], SETTING_MOCKS[0].name, '');
await expect(storageModule.put).toHaveBeenCalled();
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
await settingsProvider
.setSettingValue(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name, '');
await expect(storageProviderSpy.put).toHaveBeenCalled();
});
it('should clear settings', async () => {
const category = SETTING_MOCKS[0].categories[0];
const name = SETTING_MOCKS[0].name;
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
await settingsProvider.clear();
const exists = await settingsProvider.settingExists(category, name);
await expect(exists).toEqual(false);
await settingsProvider.reset();
await expect(storageProviderSpy.put).toHaveBeenCalledWith(STORAGE_KEY_SETTING_VALUES, {});
});
it('should reset settings', async () => {
const category = SETTING_MOCKS[0].categories[0];
const name = SETTING_MOCKS[0].name;
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(SETTING_MOCKS[0])));
const category = CONFIG_SETTINGS_MOCK[0].categories[0];
const name = CONFIG_SETTINGS_MOCK[0].name;
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
await settingsProvider.setSettingValue(category, name, 'guest');
await settingsProvider.resetDefault();
const value = await settingsProvider.getSettingValue(SETTING_MOCKS[0].categories[0], SETTING_MOCKS[0].name);
await expect(value).toEqual(SETTING_MOCKS[0].input.defaultValue);
const value = await settingsProvider
.getValue(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name);
await expect(value).toEqual(CONFIG_SETTINGS_MOCK[0].input.defaultValue);
});
it('should validate wrong values for inputType text', async () => {
await testValue(SETTING_MOCKS[0], 123456789);
await testValue(SETTING_MOCKS[0], false);
await testValue(SETTING_MOCKS[0], []);
await testValue(CONFIG_SETTINGS_MOCK[0], 123456789);
await testValue(CONFIG_SETTINGS_MOCK[0], false);
await testValue(CONFIG_SETTINGS_MOCK[0], []);
});
it('should validate wrong values for inputType password', async () => {
await testValue(SETTING_MOCKS[0], 123456789);
await testValue(SETTING_MOCKS[0], false);
await testValue(SETTING_MOCKS[0], []);
await testValue(CONFIG_SETTINGS_MOCK[0], 123456789);
await testValue(CONFIG_SETTINGS_MOCK[0], false);
await testValue(CONFIG_SETTINGS_MOCK[0], []);
});
it('should validate wrong values for inputType number', async () => {
await testValue(SETTING_MOCKS[2], '');
await testValue(SETTING_MOCKS[2], false);
await testValue(SETTING_MOCKS[2], []);
await testValue(CONFIG_SETTINGS_MOCK[2], '');
await testValue(CONFIG_SETTINGS_MOCK[2], false);
await testValue(CONFIG_SETTINGS_MOCK[2], []);
});
it('should validate wrong values for inputType singleChoice text', async () => {
await testValue(SETTING_MOCKS[3], '');
await testValue(SETTING_MOCKS[3], 123456);
await testValue(SETTING_MOCKS[3], false);
await testValue(SETTING_MOCKS[3], []);
await testValue(CONFIG_SETTINGS_MOCK[3], '');
await testValue(CONFIG_SETTINGS_MOCK[3], 123456);
await testValue(CONFIG_SETTINGS_MOCK[3], false);
await testValue(CONFIG_SETTINGS_MOCK[3], []);
});
it('should validate wrong values for inputType singleChoice boolean', async () => {
await testValue(SETTING_MOCKS[5], '');
await testValue(SETTING_MOCKS[5], 123456);
await testValue(SETTING_MOCKS[5], []);
await testValue(CONFIG_SETTINGS_MOCK[5], '');
await testValue(CONFIG_SETTINGS_MOCK[5], 123456);
await testValue(CONFIG_SETTINGS_MOCK[5], []);
});
it('should validate wrong values for inputType multipleChoice', async () => {
await testValue(SETTING_MOCKS[6], '');
await testValue(SETTING_MOCKS[6], 123456);
await testValue(SETTING_MOCKS[6], false);
await testValue(SETTING_MOCKS[6], [1, 2, 3, 4]);
await testValue(CONFIG_SETTINGS_MOCK[6], '');
await testValue(CONFIG_SETTINGS_MOCK[6], 123456);
await testValue(CONFIG_SETTINGS_MOCK[6], false);
await testValue(CONFIG_SETTINGS_MOCK[6], [1, 2, 3, 4]);
});
async function testValue(setting: SCSetting, value: any) {
@@ -144,10 +186,10 @@ describe('SettingsProvider', () => {
// @ts-ignore
await expect(error).toBeDefined();
// @ts-ignore
await expect(error.message).toMatch(/Value.*not valid/);
await expect(error.message).toMatch(/is not valid/);
}
const SETTING_MOCKS: SCSetting[] = [
const CONFIG_SETTINGS_MOCK: SCSetting[] = [
{
categories: ['credentials'],
input: {
@@ -354,3 +396,16 @@ describe('SettingsProvider', () => {
},
];
});
const SETTING_VALUES_MOCK: SettingValuesContainer = {
foo: {
bar: 'foo-bar',
},
privacy: {
geoLocation: 'true',
},
profile: {
group: 'employee',
language: 'de',
},
};