orizens/echoes-player

View on GitHub
src/app/core/store/app-core/app-core.spec.ts

Summary

Maintainability
B
6 hrs
Test Coverage
import { Themes, DEFAULT_THEME } from '../../../app.themes';

import * as AppCore from './index';

describe('The App Core Reducer', () => {
  const appLayout = AppCore.appCore;
  const createState = (props = {}) => {
    const defaultState: AppCore.IAppCore = {
      sidebarExpanded: false,
      requestInProcess: false,
      version: {
        semver: '',
        isNewAvailable: false,
        checkingForVersion: false
      },
      theme: DEFAULT_THEME,
      themes: Themes.sort(),
      error: {
        message: '',
        action: null,
        show: false
      },
      show: {
        addToPlaylist: false,
        media: undefined,
        status: 'none'
      }
    };
    return { ...defaultState, ...props };
  };

  it('should return current state when no valid actions have been made', () => {
    const state = createState();
    const actual = appLayout(state, {
      type: 'INVALID_ACTION',
      payload: {}
    } as any);
    const expected = state;
    expect(actual).toEqual(expected);
  });

  it('should should check for version', () => {
    const state = createState();
    const newState = appLayout(state, new AppCore.CheckVersion());
    const actual = newState.version.checkingForVersion;
    expect(actual).toBeTruthy();
  });

  describe('Version Update - When Version is empty:', () => {
    let state;
    const mockedAppPackageJson = {
      version: '3.2.0'
    };

    beforeEach(() => {
      state = createState();
    });

    it('should update the version when version is an empty string', () => {
      const newState = appLayout(
        state,
        new AppCore.RecievedAppVersion(mockedAppPackageJson)
      );
      const actual = newState.version.semver;
      const expected = mockedAppPackageJson.version;
      expect(actual).toBe(expected);
    });

    it('should NOT notify of new version when version is an empty string', () => {
      const newState = appLayout(
        state,
        new AppCore.RecievedAppVersion(mockedAppPackageJson)
      );
      const actual = newState.version.isNewAvailable;
      expect(actual).toBeFalsy();
    });
  });

  describe('Version Update - When Version is available:', () => {
    let state;
    const mockedAppPackageJson = {
      version: '3.3.0'
    };

    beforeEach(() => {
      state = createState();
    });

    it('should notify of new update when a newer version is available', () => {
      state.version.semver = '3.2.0';
      const newState = appLayout(
        state,
        new AppCore.RecievedAppVersion(mockedAppPackageJson)
      );
      const actual = newState.version.isNewAvailable;
      expect(actual).toBeTruthy();
    });

    it('should NOT update semver when a newer version is available', () => {
      state.version.semver = '3.2.0';
      const newState = appLayout(
        state,
        new AppCore.RecievedAppVersion(mockedAppPackageJson)
      );
      const actual = newState.version.semver;
      const expected = state.version.semver;
      expect(actual).toMatch(expected);
    });
  });

  describe('Version Update - after approving update:', () => {
    let state;
    const mockedAppPackageJson = {
      version: '3.3.0'
    };

    beforeEach(() => {
      state = createState();
      state.version.semver = '3.2.0';
      state.version.isNewAvailable = true;
    });

    it('should update semver when a newer version is already available', () => {
      const newState = appLayout(
        state,
        new AppCore.RecievedAppVersion(mockedAppPackageJson)
      );
      const actual = newState.version.semver;
      const expected = mockedAppPackageJson.version;
      expect(actual).toMatch(expected);
    });

    it('should restore status of new version availability to false', () => {
      const newState = appLayout(
        state,
        new AppCore.RecievedAppVersion(mockedAppPackageJson)
      );
      const actual = newState.version.isNewAvailable;
      expect(actual).toBeFalsy();
    });
  });
});