Back to Repositories

Testing Self-Package Import Prevention in Parcel Bundler

This test suite validates the ESLint rule that prevents self-package imports within the Parcel bundler ecosystem. It ensures proper module import practices by detecting and correcting cases where a package attempts to import itself using its own package name rather than relative paths.

Test Coverage Overview

The test suite provides comprehensive coverage of the no-self-package-imports rule implementation.

Key areas tested include:
  • Valid external package imports
  • Different import syntaxes (require, import, require.resolve)
  • Various self-reference scenarios
  • Path resolution and correction

Implementation Analysis

The testing approach utilizes ESLint’s RuleTester framework to validate both valid and invalid import scenarios. The tests specifically verify the rule’s ability to detect self-package imports and automatically fix them by converting package references to relative paths.

Technical patterns include:
  • Parser configuration for modern JavaScript
  • Error message validation
  • Output transformation verification

Technical Details

Testing infrastructure includes:
  • ESLint RuleTester framework
  • @babel/eslint-parser for ECMAScript 2018 support
  • Module-based import testing
  • Filename context preservation

Best Practices Demonstrated

The test suite exemplifies high-quality testing practices through thorough validation of both positive and negative cases. It demonstrates proper error handling, transformation validation, and comprehensive coverage of import variations.

Notable practices include:
  • Explicit test case organization
  • Clear error message definition
  • Automated fix validation
  • Context-aware testing

parcel-bundler/parcel

packages/dev/eslint-plugin/test/rules/no-self-package-imports.test.js

            
'use strict';

const {RuleTester} = require('eslint');
const rule = require('../../src/rules/no-self-package-imports');

const message =
  'Do not require a module by package name within the same package.';

const filename = __filename;

new RuleTester({
  parser: require.resolve('@babel/eslint-parser'),
  parserOptions: {ecmaVersion: 2018, sourceType: 'module'},
}).run('no-self-package-imports', rule, {
  valid: [
    {code: "require('path');", filename},
    {code: "require('@parcel/logger');", filename},
    {code: "require.resolve('@parcel/logger');", filename},
    {code: "import logger from '@parcel/logger';", filename},
  ],
  invalid: [
    {
      code: "require('@parcel/eslint-plugin/lib/rules/no-self-package-imports');",
      errors: [{message}],
      filename,
      output: "require('../../lib/rules/no-self-package-imports');",
    },
    {
      code: "require('@parcel/eslint-plugin');",
      filename,
      errors: [{message}],
      output: "require('../../');",
    },
    {
      code: "require.resolve('@parcel/eslint-plugin/lib/rules/no-self-package-imports');",
      filename,
      errors: [{message}],
      output: "require.resolve('../../lib/rules/no-self-package-imports');",
    },
    {
      code: "import rule from '@parcel/eslint-plugin';",
      filename,
      errors: [{message}],
      output: "import rule from '../../';",
    },
    {
      code: "import rule from '@parcel/eslint-plugin/lib/rules/no-self-package-imports';",
      filename,
      errors: [{message}],
      output: "import rule from '../../lib/rules/no-self-package-imports';",
    },
  ],
});