mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-21 17:12:43 +00:00
refactor: initialise settings from config module and persist only the values
Closes #30, #59
This commit is contained in:
@@ -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',
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user