# src/lib/commands/generate/options.test.js

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

    import {
      getOptions,
      validateOptions,
      __RewireAPI__ as moduleRewireAPI,
    } from './options';

    const helpData = {
      argv: 'some argv',
      seederName: 'some-seeder-name',
      optionDefinitions: 'some option definitions',
    };

    test('should get user options from the cli', t => {
      const createStubs = ({ commandLineArgs, optionDefinitions }) => {
        moduleRewireAPI.__Rewire__('commandLineArgs', commandLineArgs);
        moduleRewireAPI.__Rewire__('optionDefinitions', optionDefinitions);
      };
      const restoreStubs = () => {
        moduleRewireAPI.__ResetDependency__('commandLineArgs');
        moduleRewireAPI.__ResetDependency__('optionDefinitions');
      };

      const { argv, optionDefinitions, seederName } = helpData;

      const commandLineArgs = sinon
        .stub()
        .withArgs(optionDefinitions, { argv })
        .returns({ name: seederName, help: false });

      createStubs({ commandLineArgs, optionDefinitions });

      const expectedOptions = { seederName, helpWanted: false };
      const recivedOptions = getOptions(argv);

      t.true(commandLineArgs.calledWith(optionDefinitions, { argv }));
      t.deepEqual(recivedOptions, expectedOptions);

      restoreStubs();
    });

    test('should validate given options', t => {
      const createStubs = ({ help }) => {
        moduleRewireAPI.__Rewire__('help', help);
        sinon.stub(console, 'log');
      };
      const restoreStubs = () => {
        moduleRewireAPI.__ResetDependency__('help');
        console.log.restore();
      };

      const help = sinon.stub();

      createStubs({ help });

      t.throws(() => validateOptions());
      t.true(help.called);
      t.true(console.log.called);
      t.throws(() => validateOptions({ helpWanted: false }));
      t.throws(() => validateOptions({ seederName: 'ab' }));
      t.notThrows(() => validateOptions({ seederName: 'abc' }));
      t.notThrows(() => validateOptions({ seederName: 'ab', helpWanted: true }));
      t.notThrows(() => validateOptions({ helpWanted: true }));

      restoreStubs();
    });