const { join, resolve } = require('path');

const test = require('ava');
const { rollup } = require('rollup');

const { getImports, testBundle } = require('../../../util/test');

const { nodeResolve } = require('..');

process.chdir(join(__dirname, 'fixtures'));

test('handles importing builtins', async (t) => {
  const warnings = [];
  const bundle = await rollup({
    input: 'builtins.js',
    onwarn: (warning) => warnings.push(warning),
    plugins: [
      nodeResolve({
        mainFields: ['browser', 'main'],
        preferBuiltins: true
      })
    ]
  });

  const { module } = await testBundle(t, bundle);

  t.is(warnings.length, 0);
  // eslint-disable-next-line global-require
  t.is(module.exports, require('path').sep);
});

test('warning when preferring a builtin module, no explicit configuration', async (t) => {
  let warning = null;
  await rollup({
    input: 'prefer-builtin.js',
    onwarn({ message }) {
      // eslint-disable-next-line no-bitwise
      if (~message.indexOf('preferring')) {
        warning = message;
      }
    },
    plugins: [nodeResolve()]
  });

  const localPath = resolve('node_modules/events/index.js');
  t.is(
    warning,
    `preferring built-in module 'events' over local alternative ` +
      `at '${localPath}', pass 'preferBuiltins: false' to disable this behavior ` +
      `or 'preferBuiltins: true' to disable this warning`
  );
});

test('true allows preferring a builtin to a local module of the same name', async (t) => {
  const warnings = [];
  const bundle = await rollup({
    input: 'prefer-builtin.js',
    onwarn: (warning) => warnings.push(warning),
    plugins: [
      nodeResolve({
        preferBuiltins: true
      })
    ]
  });

  const imports = await getImports(bundle);

  t.is(warnings.length, 0);
  t.deepEqual(imports, ['events']);
});

test('false allows resolving a local module with the same name as a builtin module', async (t) => {
  const warnings = [];
  const bundle = await rollup({
    input: 'prefer-builtin.js',
    onwarn: (warning) => warnings.push(warning),
    plugins: [
      nodeResolve({
        preferBuiltins: false
      })
    ]
  });

  const imports = await getImports(bundle);

  t.is(warnings.length, 1);
  t.snapshot(warnings);
  t.deepEqual(imports, []);
});

test('does not warn when using a builtin module when there is no local version, no explicit configuration', async (t) => {
  let warning = null;
  await rollup({
    input: 'prefer-builtin-no-local.js',
    onwarn({ message }) {
      // eslint-disable-next-line no-bitwise
      if (~message.indexOf('preferring')) {
        warning = message;
      }
    },
    plugins: [nodeResolve()]
  });

  t.is(warning, null);
});
