# src/lib/utils/helpers.test.js

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

    import { ExitCodes } from './constants';
    import {
      getFolderNameFromPath,
      getObjectWithSelectedKeys,
      validateSeedersFolderName,
      validateSeederTemplatePath,
      validateUserConfig,
      exit,
      __RewireAPI__ as moduleRewireAPI,
    } from './helpers';

    test('should get folder name from path', t => {
      t.is(getFolderNameFromPath('some/path/with/folder'), 'folder');
    });

    test('should get similar object with the selected keys', t => {
      const testObj = {
        key1: '',
        key2: '',
        key3: '',
      };

      const results = getObjectWithSelectedKeys(testObj, ['key1', 'key3']);
      const expectedResults = { key1: testObj.key1, key3: testObj.key3 };

      t.deepEqual(results, expectedResults);
    });

    test('should validate seeders folder name', t => {
      t.true(validateSeedersFolderName('folder-name'));
      t.true(validateSeedersFolderName('sed'));
      t.false(validateSeedersFolderName('se'));
      t.false(validateSeedersFolderName('   se  '));
      t.false(validateSeedersFolderName());
    });

    test('should validate seeder template path', t => {
      t.true(validateSeederTemplatePath('file-name.js'));
      t.true(validateSeederTemplatePath('sedsed'));
      t.false(validateSeederTemplatePath('abcde'));
      t.false(validateSeederTemplatePath('   abcde  '));
      t.false(validateSeederTemplatePath());
    });

    test('should not throw error if user config exists', async t => {
      moduleRewireAPI.__Rewire__('config', { userConfigExists: true });

      await t.notThrows(validateUserConfig);

      moduleRewireAPI.__ResetDependency__('config');
    });

    test('should throw error if user config not exists', async t => {
      moduleRewireAPI.__Rewire__('config', { userConfigExists: false });

      await t.throws(validateUserConfig);

      moduleRewireAPI.__ResetDependency__('config');
    });

    test('should exit with success code', async t => {
      sinon.stub(process, 'exit');
      sinon.stub(console, 'error');

      exit();

      t.true(process.exit.calledWith(ExitCodes.Success));
      t.false(console.error.called);

      process.exit.restore();
      console.error.restore();
    });

    test('should exit with error code when passing error', async t => {
      sinon.stub(process, 'exit');
      sinon.stub(console, 'error');

      const error = new Error('some error');

      exit(error);

      t.true(process.exit.calledWith(ExitCodes.Error));
      t.true(console.error.calledWith(error));

      process.exit.restore();
      console.error.restore();
    });