# src/lib/commands/init/run-installer.test.js

    import test from 'ava';
    import sinon from 'sinon';

    import Installer from '../../core/__mocks__/installer';

    import runInstaller, {
      __RewireAPI__ as moduleRewireAPI,
    } from './run-installer';

    import InstallerLogger from './__mocks__/installer-logger';

    const testInstaller = async (t, options) => {
      const { Installer, promptMissingOptions } = t.context.mocks;

      const seedersFolder =
        (options && options.seedersFolder) || 'some-seeder-folder';

      const customSeederTemplate =
        (options && options.customSeederTemplate) || 'some-file-path.js';

      promptMissingOptions.resolves({ seedersFolder, customSeederTemplate });

      await runInstaller(options);

      t.true(promptMissingOptions.calledWith(options || {}));
      t.true(Installer.calledWith({ seedersFolder, customSeederTemplate }));
      t.true(Installer.prototype.install.called);
      t.true(
        Installer.stubbedOvservable.subscribe.calledWith(
          InstallerLogger.stubbedOvserver
        )
      );
      t.true(Installer.stubbedOvservable.toPromise.called);

      t.true(InstallerLogger.called);
      t.true(InstallerLogger.prototype.asObserver.called);
    };

    test.beforeEach('mock imports', t => {
      const mocks = {
        InstallerLogger,
        Installer,
        promptMissingOptions: sinon.stub(),
      };

      t.context = { mocks };

      for (const [name, mock] of Object.entries(mocks)) {
        moduleRewireAPI.__Rewire__(name, mock);
      }
    });

    test.afterEach.always('unmock imports', t => {
      for (const name of Object.keys(t.context.mocks)) {
        moduleRewireAPI.__ResetDependency__(name);
      }
    });

    test.serial('should run installer', t => testInstaller(t));

    test.serial('should run installer with options', t =>
      testInstaller(t, {
        seedersFolder: 'some-seeders-folder',
        customSeederTemplate: 'some-file-path.js',
      })
    );