homehub/packages/homehub_app/tests/main/dataSources/StateDataSource.spec.js
2021-08-26 12:33:15 +02:00

148 lines
4.0 KiB
JavaScript

import * as HomeHubCore from '@bthlabs/homehub-core';
import * as StateDataSource from 'src/main/dataSources/StateDataSource';
describe('src/lib/main/dataSources/StateDataSource', () => {
beforeEach(() => {
spyOn(HomeHubCore.API.State, 'get');
spyOn(HomeHubCore.API.State, 'save');
spyOn(HomeHubCore.LocalStorage, 'getItem');
spyOn(HomeHubCore.LocalStorage, 'setItem');
});
afterEach(() => {
StateDataSource.setOfflineMode(false);
});
describe('loadState', () => {
it('throws an error if API call in online mode returns an error', async () => {
// Given
StateDataSource.setOfflineMode(false);
HomeHubCore.API.State.get.and.resolveTo({
error: 'FIAL',
});
// When
let result = null;
try {
await StateDataSource.loadState();
} catch (error) {
result = error;
}
// Then
expect(result).toEqual('FIAL');
});
it('returns state loaded from the API in online mode', async () => {
// Given
StateDataSource.setOfflineMode(false);
const data = {dashboards: []};
HomeHubCore.API.State.get.and.resolveTo({
data: data,
});
// When
const result = await StateDataSource.loadState();
// Then
expect(result).toEqual(data);
expect(HomeHubCore.API.State.get).toHaveBeenCalled();
expect(HomeHubCore.LocalStorage.getItem).not.toHaveBeenCalled();
});
it('returns state loaded from local storage in offline mode', async () => {
// Given
StateDataSource.setOfflineMode(true);
const data = {dashboards: []};
HomeHubCore.LocalStorage.getItem.and.returnValue(JSON.stringify(data));
// When
const result = await StateDataSource.loadState();
// Then
expect(result).toEqual(data);
expect(HomeHubCore.API.State.get).not.toHaveBeenCalled();
expect(HomeHubCore.LocalStorage.getItem).toHaveBeenCalledWith('state');
});
it('returns initial state if it is missing in local storage in offline mode', async () => {
// Given
StateDataSource.setOfflineMode(true);
HomeHubCore.LocalStorage.getItem.and.returnValue(null);
// When
const result = await StateDataSource.loadState();
// Then
expect(result.dashboards.length).toEqual(1);
});
});
describe('doSaveState', () => {
let fakeState = null;
beforeEach(() => {
fakeState = {
dashboards: [
{
id: 'testing',
name: 'Testing',
services: [],
},
],
};
});
it('throws an error if API call in online mode returns an error', async () => {
// Given
StateDataSource.setOfflineMode(false);
HomeHubCore.API.State.save.and.resolveTo({
error: 'FIAL',
});
// When
let result = null;
try {
result = await StateDataSource.doSaveState(fakeState);
} catch (error) {
result = error;
}
// Then
expect(result).toEqual('FIAL');
});
it('returns the result of the API call in online mode', async () => {
// Given
StateDataSource.setOfflineMode(false);
HomeHubCore.API.State.save.and.resolveTo({
data: true,
});
// When
const result = await StateDataSource.doSaveState(fakeState);
// Then
expect(result).toBe(true);
expect(HomeHubCore.API.State.save).toHaveBeenCalledWith(fakeState);
expect(HomeHubCore.LocalStorage.setItem).not.toHaveBeenCalled();
});
it('returns the result of local storage save operation in offline mode', async () => {
// Given
StateDataSource.setOfflineMode(true);
// When
const result = await StateDataSource.doSaveState(fakeState);
// Then
expect(result).toBe(true);
expect(HomeHubCore.API.State.save).not.toHaveBeenCalled();
expect(HomeHubCore.LocalStorage.setItem).toHaveBeenCalledWith(
'state', JSON.stringify(fakeState)
);
});
});
});