# src/lib/commands/run/run.test.js

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

    import { mockImports, resetImports } from '../../utils/test-helpers';

    import MdSeedRunner from '../../core/__mocks__/md-seed-runner';
    import RunLogger from './__mocks__/run-logger';

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

    const userConfig = {
      connect: sinon.stub().resolves(),
      dropdb: sinon.stub().resolves(),
      seedersList: 'some-seeders-list',
    };

    const config = {
      loadUserConfig: () => userConfig,
    };

    test.beforeEach('mock imports', t => {
      const mocks = {
        config,
        MdSeedRunner,
        RunLogger,
        validateUserConfig: sinon.stub(),
      };

      t.context = { mocks };

      mockImports({ moduleRewireAPI, mocks });
    });

    test.afterEach.always('unmock imports', t => {
      const imports = Object.keys(t.context.mocks);

      resetImports({ moduleRewireAPI, imports });
    });

    test.serial('Should run', async t => {
      const { validateUserConfig, MdSeedRunner, RunLogger } = t.context.mocks;

      await run();

      t.true(validateUserConfig.called);

      t.true(MdSeedRunner.calledWith(userConfig));
      t.true(
        MdSeedRunner.prototype.run.calledWith({
          selectedSeeders: [],
          dropDatabase: false,
        })
      );
      t.true(
        MdSeedRunner.stubbedOvservable.subscribe.calledWith(
          RunLogger.stubbedOvserver
        )
      );
      t.true(MdSeedRunner.stubbedOvservable.toPromise.called);

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

    test.serial('Should run with args', async t => {
      const { validateUserConfig, MdSeedRunner, RunLogger } = t.context.mocks;

      const selectedSeeders = ['some', 'seeders'];
      const dropDatabase = true;

      await run({ selectedSeeders, dropDatabase });

      t.true(validateUserConfig.called);

      t.true(MdSeedRunner.calledWith(userConfig));
      t.true(
        MdSeedRunner.prototype.run.calledWith({
          selectedSeeders,
          dropDatabase,
        })
      );
      t.true(
        MdSeedRunner.stubbedOvservable.subscribe.calledWith(
          RunLogger.stubbedOvserver
        )
      );
      t.true(MdSeedRunner.stubbedOvservable.toPromise.called);

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