// Copyright (c) Jupyter Development Team.
// Distributed under the terms of the Modified BSD License.

import {
  ContentsManager,
  ServiceManager,
  SessionManager,
  SettingManager,
  TerminalManager,
  WorkspaceManager
} from '../src';
import { JupyterServer } from '@jupyterlab/testutils';

const server = new JupyterServer();

beforeAll(async () => {
  await server.start();
});

afterAll(async () => {
  await server.shutdown();
});

describe('manager', () => {
  describe('ServiceManager', () => {
    let manager: ServiceManager.IManager;

    beforeEach(() => {
      manager = new ServiceManager({ standby: 'never' });
      return manager.ready;
    });

    afterEach(() => {
      manager.dispose();
    });

    describe('#constructor()', () => {
      it('should create a new service manager', () => {
        expect(manager).toBeInstanceOf(ServiceManager);
      });
    });

    describe('#sessions', () => {
      it('should be the sessions manager instance', () => {
        expect(manager.sessions).toBeInstanceOf(SessionManager);
      });
    });

    describe('#settings', () => {
      it('should be the setting manager instance', () => {
        expect(manager.settings).toBeInstanceOf(SettingManager);
      });
    });

    describe('#contents', () => {
      it('should be the content manager instance', () => {
        expect(manager.contents).toBeInstanceOf(ContentsManager);
      });
    });

    describe('#terminals', () => {
      it('should be the terminal manager instance', () => {
        expect(manager.terminals).toBeInstanceOf(TerminalManager);
      });
    });

    describe('#workspaces', () => {
      it('should be the workspace manager instance', () => {
        expect(manager.workspaces).toBeInstanceOf(WorkspaceManager);
      });
    });

    describe('#isReady', () => {
      it('should test whether the manager is ready', async () => {
        manager.dispose();
        manager = new ServiceManager({ standby: 'never' });
        expect(manager.isReady).toBe(false);
        await manager.ready;
        expect(manager.isReady).toBe(true);
      });
    });
  });
});
