import {DashboardsProvider} from '@bthlabs/homehub-core';
import {shallow} from 'enzyme';
import React from 'react';

import {DashboardContainer, TaskbarContainer} from 'src/main/containers';
import {StateDataSource} from 'src/main/dataSources';
import * as AppView from 'src/main/views/AppView';

import {SettingsFactory} from 'tests/__fixtures__/settings';

describe('src/main/views/AppView', () => {
  describe('AppView', () => {
    let fakeActions = null;
    let fakeSetings = null;

    beforeEach(() => {
      fakeActions = {
        setDocumentTitle: jasmine.createSpy(),
      };
      fakeSetings = SettingsFactory();
    });

    describe('componentDidMount', () => {
      it('calls the setDocumentTitle action', () => {
        // Given
        const component = shallow(
          <AppView.AppView
            actions={fakeActions}
            settings={fakeSetings}
          />
        );

        // When
        component.instance().componentDidMount();

        // Then
        expect(fakeActions.setDocumentTitle).toHaveBeenCalledWith(
          jasmine.any(String)
        );
      });
    });

    describe('render', () => {
      it('configures and renders the DashboardsProvider', () => {
        // Given
        const component = shallow(
          <AppView.AppView
            actions={fakeActions}
            settings={fakeSetings}
          />
        );

        // When
        const dashboardsProvider = component.find(DashboardsProvider).at(0);

        // Then
        expect(dashboardsProvider.exists()).toBe(true);
        expect(dashboardsProvider.prop('loader')).toBeDefined();
        expect(dashboardsProvider.prop('loadDashboards')).toEqual(
          StateDataSource.loadState
        );
        expect(dashboardsProvider.prop('saveDashboards')).toEqual(
          StateDataSource.saveState
        );
        expect(dashboardsProvider.prop('settings')).toEqual(fakeSetings);
      });

      it('configures and renders the DashboardContainer', () => {
        // Given
        const component = shallow(
          <AppView.AppView
            actions={fakeActions}
            settings={fakeSetings}
          />
        );

        // When
        const dashboardContainer = component.find(DashboardContainer).at(0);

        // Then
        expect(dashboardContainer.exists()).toBe(true);
      });

      it('configures and renders the TaskbarContainer', () => {
        // Given
        const component = shallow(
          <AppView.AppView
            actions={fakeActions}
            settings={fakeSetings}
          />
        );

        // When
        const taskbarContainer = component.find(TaskbarContainer).at(0);

        // Then
        expect(taskbarContainer.exists()).toBe(true);
      });
    });
  });
});
