ember-cli / eslint-plugin-ember

An ESLint plugin that provides set of rules for Ember applications based on commonly known good practices.
MIT License
257 stars 198 forks source link

`no-pause-test` rule doesn't work for test files with `.gts` or `.gjs` extension #2146

Closed FadhlanR closed 1 month ago

FadhlanR commented 1 month ago

I identified this issue when I opened a PR and forgot to remove this.pauseTest() from the test and there was no error from lint check. After investigation, I realized no-pause-test is only applied for test files and the way eslint-plugin-ember identifies it using this function isTestFile. I think we should update conditions in that function to include test files with .gts and .gjs extension. If my understanding is correct, I'm happy to open a PR to fix it.

NullVoxPopuli commented 1 month ago

what's your eslint config look like?

FadhlanR commented 1 month ago

I tried this config but it still didn't catch this.pauseTest().

module.exports = {
  root: true,
  env: {
    browser: true,
  },
  overrides: [
    {
      files: ['**/*.{js,ts}'],
      parser: '@typescript-eslint/parser',
      parserOptions: {
        ecmaVersion: 'latest',
        sourceType: 'module',
        babelOptions: {
          plugins: [
            ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }],
          ],
        },
      },
      plugins: [
        'ember',
        '@typescript-eslint',
        'simple-import-sort',
        'typescript-sort-keys',
      ],
      extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/eslint-recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:typescript-sort-keys/recommended',
        'plugin:prettier/recommended',
        'plugin:ember/recommended',
      ],
      rules: {
        curly: 'error',
        'simple-import-sort/exports': 'error',
        'simple-import-sort/imports': 'error',
        'prefer-const': 'off',
        '@typescript-eslint/no-empty-function': 'off',
        '@typescript-eslint/no-explicit-any': 'off',
        '@typescript-eslint/no-non-null-assertion': 'off',
        '@typescript-eslint/no-unused-vars': [
          'error',
          { argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
        ],
      },
    },
    {
      files: ['**/*.gts'],
      parser: 'ember-eslint-parser',
      plugins: ['ember'],
      extends: [
        'eslint:recommended',
        'plugin:@typescript-eslint/recommended',
        'plugin:ember/recommended',
        'plugin:ember/recommended-gts',
      ],
      rules: {
        curly: 'error',
        'simple-import-sort/exports': 'error',
        'simple-import-sort/imports': 'error',
        'prefer-const': 'off',
        '@typescript-eslint/no-empty-function': 'off',
        '@typescript-eslint/no-explicit-any': 'off',
        '@typescript-eslint/no-non-null-assertion': 'off',
        '@typescript-eslint/no-unused-vars': [
          'error',
          { argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
        ],
      },
    },
    // node files
    {
      files: [
        './.eslintrc.cjs',
        './.prettierrc.cjs',
        './.template-lintrc.cjs',
        './addon-main.cjs',
      ],
      parserOptions: {
        sourceType: 'script',
      },
      env: {
        browser: false,
        node: true,
      },
      extends: ['plugin:n/recommended'],
      rules: {
        'n/no-unpublished-require': 'off',
        '@typescript-eslint/no-var-requires': 'off',
      },
    },
    {
      // typescript-eslint recommends turning off no-undef for Typescript files since
      // Typescript will better analyse that:
      // https://github.com/typescript-eslint/typescript-eslint/blob/5b0e577f2552e8b2c53a3fb22edc9d219589b937/docs/linting/Troubleshooting.mdx#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors
      files: ['**/*.ts', '**/*.gts'],
      rules: {
        'no-undef': 'off',
      },
    },
  ],
};
NullVoxPopuli commented 1 month ago

Thanks!

I've confirmed there is an issue on my polaris starter here: https://github.com/NullVoxPopuli/polaris-starter/tree/webpack

with only this repro:

import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';

module('...', function (hooks) {
  setupRenderingTest(hooks);

  test('...', async function (assert) {
    await this.pauseTest();

    assert.ok(true);
  });
});
here is the `--print-config` output ``` { "env": { "browser": true, "es2022": true, "es6": true }, "globals": {}, "parser": "/home/nvp/Development/NullVoxPopuli/polaris-starter/node_modules/.pnpm/ember-eslint-parser@0.4.2_@babel+core@7.24.5_@typescript-eslint+parser@7.9.0_eslint@8.57.0_ty_mr372rwtiyhxgjnvzwp7x7cfb4/node_modules/ember-eslint-parser/src/parser/gjs-gts-parser.js", "parserOptions": { "sourceType": "module", "ecmaVersion": 2022, "ecmaFeatures": { "legacyDecorators": true }, "babelOptions": { "configFile": "/home/nvp/Development/NullVoxPopuli/polaris-starter/node_modules/.pnpm/eslint-plugin-decorator-position@5.0.2_@babel+eslint-parser@7.24.5_@babel+core@7.24.5_eslint@8.57.0__eslint@8.57.0/node_modules/eslint-plugin-decorator-position/babel.config.cjs" } }, "plugins": [ "qunit", "@typescript-eslint", "ember", "decorator-position", "simple-import-sort" ], "rules": { "prefer-const": [ "off" ], "getter-return": [ "error", { "allowImplicit": true } ], "no-console": [ "error", { "allow": [ "debug", "warn", "error", "info", "group", "groupEnd", "groupCollapsed" ] } ], "padding-line-between-statements": [ "error", { "blankLine": "always", "prev": "*", "next": "return" }, { "blankLine": "always", "prev": "*", "next": "break" }, { "blankLine": "always", "prev": "*", "next": "block-like" }, { "blankLine": "always", "prev": "block-like", "next": "*" }, { "blankLine": "always", "prev": [ "const", "let" ], "next": "*" }, { "blankLine": "always", "prev": "*", "next": [ "const", "let" ] }, { "blankLine": "any", "prev": [ "const", "let" ], "next": [ "const", "let" ] }, { "blankLine": "any", "prev": [ "*" ], "next": [ "case" ] } ], "simple-import-sort/imports": [ "error", { "groups": [ [ "^\\u0000" ], [ "^ember$", "^@glimmer", "^@ember", "^ember-cli-htmlbars", "^qunit", "^ember-qunit", "^@embroider", "^@embroider", "^node:" ], [ "^@?\\w" ], [ "^" ], [ "^emberclear", "^pinochle", "^limber" ], [ "^@emberclear", "^@limber", "@glimdown" ], [ "/test-support" ], [ "^\\." ], [ "^.+\\u0000$" ] ] } ], "simple-import-sort/exports": [ "error" ], "@typescript-eslint/interface-name-prefix": [ "off" ], "@typescript-eslint/no-empty-interface": [ "off" ], "@typescript-eslint/consistent-type-imports": [ "error" ], "@typescript-eslint/explicit-function-return-type": [ "off" ], "@typescript-eslint/explicit-module-boundary-types": [ "off" ], "@typescript-eslint/ban-types": [ "off" ], "@typescript-eslint/prefer-optional-chain": [ "off" ], "@typescript-eslint/no-non-null-assertion": [ "error" ], "@typescript-eslint/no-unused-vars": [ "error", { "argsIgnorePattern": "^_" } ], "qunit/assert-args": [ "error" ], "qunit/literal-compare-order": [ "error" ], "qunit/no-assert-equal": [ "error" ], "qunit/no-assert-equal-boolean": [ "error" ], "qunit/no-assert-logical-expression": [ "error" ], "qunit/no-async-in-loops": [ "error" ], "qunit/no-async-module-callbacks": [ "error" ], "qunit/no-async-test": [ "error" ], "qunit/no-commented-tests": [ "error" ], "qunit/no-compare-relation-boolean": [ "error" ], "qunit/no-conditional-assertions": [ "error" ], "qunit/no-early-return": [ "error" ], "qunit/no-global-assertions": [ "error" ], "qunit/no-global-expect": [ "error" ], "qunit/no-global-module-test": [ "error" ], "qunit/no-global-stop-start": [ "error" ], "qunit/no-hooks-from-ancestor-modules": [ "error" ], "qunit/no-identical-names": [ "error" ], "qunit/no-init": [ "error" ], "qunit/no-jsdump": [ "error" ], "qunit/no-negated-ok": [ "error" ], "qunit/no-nested-tests": [ "error" ], "qunit/no-ok-equality": [ "error" ], "qunit/no-only": [ "error" ], "qunit/no-qunit-push": [ "error" ], "qunit/no-qunit-start-in-tests": [ "error" ], "qunit/no-qunit-stop": [ "error" ], "qunit/no-reassign-log-callbacks": [ "error" ], "qunit/no-reset": [ "error" ], "qunit/no-setup-teardown": [ "error" ], "qunit/no-test-expect-argument": [ "error" ], "qunit/no-throws-string": [ "error" ], "qunit/require-expect": [ "error" ], "qunit/require-object-in-propequal": [ "error" ], "qunit/resolve-async": [ "error" ], "@typescript-eslint/ban-ts-comment": [ "error" ], "no-array-constructor": [ "off" ], "@typescript-eslint/no-array-constructor": [ "error" ], "@typescript-eslint/no-duplicate-enum-values": [ "error" ], "@typescript-eslint/no-explicit-any": [ "error" ], "@typescript-eslint/no-extra-non-null-assertion": [ "error" ], "no-loss-of-precision": [ "off" ], "@typescript-eslint/no-loss-of-precision": [ "error" ], "@typescript-eslint/no-misused-new": [ "error" ], "@typescript-eslint/no-namespace": [ "error" ], "@typescript-eslint/no-non-null-asserted-optional-chain": [ "error" ], "@typescript-eslint/no-this-alias": [ "error" ], "@typescript-eslint/no-unnecessary-type-constraint": [ "error" ], "@typescript-eslint/no-unsafe-declaration-merging": [ "error" ], "no-unused-vars": [ "off" ], "@typescript-eslint/no-var-requires": [ "error" ], "@typescript-eslint/prefer-as-const": [ "error" ], "@typescript-eslint/triple-slash-reference": [ "error" ], "ember/avoid-leaking-state-in-ember-objects": [ "error" ], "ember/avoid-using-needs-in-controllers": [ "error" ], "ember/classic-decorator-hooks": [ "error" ], "ember/classic-decorator-no-classic-methods": [ "error" ], "ember/closure-actions": [ "error" ], "ember/jquery-ember-run": [ "error" ], "ember/new-module-imports": [ "error" ], "ember/no-actions-hash": [ "error" ], "ember/no-arrow-function-computed-properties": [ "error" ], "ember/no-assignment-of-untracked-properties-used-in-tracking-contexts": [ "error" ], "ember/no-at-ember-render-modifiers": [ "error" ], "ember/no-attrs-in-components": [ "error" ], "ember/no-attrs-snapshot": [ "error" ], "ember/no-capital-letters-in-routes": [ "error" ], "ember/no-classic-classes": [ "error" ], "ember/no-classic-components": [ "error" ], "ember/no-component-lifecycle-hooks": [ "error" ], "ember/no-computed-properties-in-native-classes": [ "error" ], "ember/no-controller-access-in-routes": [ "error" ], "ember/no-deeply-nested-dependent-keys-with-each": [ "error" ], "ember/no-deprecated-router-transition-methods": [ "error" ], "ember/no-duplicate-dependent-keys": [ "error" ], "ember/no-ember-super-in-es-classes": [ "error" ], "ember/no-ember-testing-in-module-scope": [ "error" ], "ember/no-empty-glimmer-component-classes": [ "error" ], "ember/no-function-prototype-extensions": [ "error" ], "ember/no-get-with-default": [ "error" ], "ember/no-get": [ "error" ], "ember/no-global-jquery": [ "error" ], "ember/no-implicit-injections": [ "error" ], "ember/no-incorrect-calls-with-inline-anonymous-functions": [ "error" ], "ember/no-incorrect-computed-macros": [ "error" ], "ember/no-invalid-debug-function-arguments": [ "error" ], "ember/no-invalid-dependent-keys": [ "error" ], "ember/no-invalid-test-waiters": [ "error" ], "ember/no-jquery": [ "error" ], "ember/no-legacy-test-waiters": [ "error" ], "ember/no-mixins": [ "error" ], "ember/no-new-mixins": [ "error" ], "ember/no-noop-setup-on-error-in-before": [ "error" ], "ember/no-observers": [ "error" ], "ember/no-old-shims": [ "error" ], "ember/no-on-calls-in-components": [ "error" ], "ember/no-pause-test": [ "error" ], "ember/no-private-routing-service": [ "error" ], "ember/no-restricted-resolver-tests": [ "error" ], "ember/no-runloop": [ "error" ], "ember/no-settled-after-test-helper": [ "error" ], "ember/no-shadow-route-definition": [ "error" ], "ember/no-side-effects": [ "error" ], "ember/no-string-prototype-extensions": [ "error" ], "ember/no-test-and-then": [ "error" ], "ember/no-test-import-export": [ "error" ], "ember/no-test-module-for": [ "error" ], "ember/no-test-support-import": [ "error" ], "ember/no-test-this-render": [ "error" ], "ember/no-tracked-properties-from-args": [ "error" ], "ember/no-try-invoke": [ "error" ], "ember/no-unnecessary-route-path-option": [ "error" ], "ember/no-volatile-computed-properties": [ "error" ], "ember/prefer-ember-test-helpers": [ "error" ], "ember/require-computed-macros": [ "error" ], "ember/require-computed-property-dependencies": [ "error" ], "ember/require-return-from-computed": [ "error" ], "ember/require-super-in-lifecycle-hooks": [ "error" ], "ember/require-tagless-components": [ "error" ], "ember/require-valid-css-selector-in-test-helpers": [ "error" ], "ember/routes-segments-snake-case": [ "error" ], "ember/use-brace-expansion": [ "error" ], "ember/use-ember-data-rfc-395-imports": [ "error" ], "decorator-position/decorator-position": [ "error", {} ], "constructor-super": [ "error" ], "for-direction": [ "error" ], "no-async-promise-executor": [ "error" ], "no-case-declarations": [ "error" ], "no-class-assign": [ "error" ], "no-compare-neg-zero": [ "error" ], "no-cond-assign": [ "error" ], "no-const-assign": [ "error" ], "no-constant-condition": [ "error" ], "no-control-regex": [ "error" ], "no-debugger": [ "error" ], "no-delete-var": [ "error" ], "no-dupe-args": [ "error" ], "no-dupe-class-members": [ "error" ], "no-dupe-else-if": [ "error" ], "no-dupe-keys": [ "error" ], "no-duplicate-case": [ "error" ], "no-empty": [ "error" ], "no-empty-character-class": [ "error" ], "no-empty-pattern": [ "error" ], "no-ex-assign": [ "error" ], "no-extra-boolean-cast": [ "error" ], "no-extra-semi": [ "error" ], "no-fallthrough": [ "error" ], "no-func-assign": [ "error" ], "no-global-assign": [ "error" ], "no-import-assign": [ "error" ], "no-inner-declarations": [ "error" ], "no-invalid-regexp": [ "error" ], "no-irregular-whitespace": [ "error" ], "no-misleading-character-class": [ "error" ], "no-mixed-spaces-and-tabs": [ "error" ], "no-new-symbol": [ "error" ], "no-nonoctal-decimal-escape": [ "error" ], "no-obj-calls": [ "error" ], "no-octal": [ "error" ], "no-prototype-builtins": [ "error" ], "no-redeclare": [ "error" ], "no-regex-spaces": [ "error" ], "no-self-assign": [ "error" ], "no-setter-return": [ "error" ], "no-shadow-restricted-names": [ "error" ], "no-sparse-arrays": [ "error" ], "no-this-before-super": [ "error" ], "no-undef": [ "error" ], "no-unexpected-multiline": [ "error" ], "no-unreachable": [ "error" ], "no-unsafe-finally": [ "error" ], "no-unsafe-negation": [ "error" ], "no-unsafe-optional-chaining": [ "error" ], "no-unused-labels": [ "error" ], "no-useless-backreference": [ "error" ], "no-useless-catch": [ "error" ], "no-useless-escape": [ "error" ], "no-with": [ "error" ], "require-yield": [ "error" ], "use-isnan": [ "error" ], "valid-typeof": [ "error" ] }, "settings": {}, "ignorePatterns": [ "/blueprints/*/files/", "/dist/", "/coverage/", "!.*", ".*/", "/.node_modules.ember-try/" ] } ```

I would but that there is a bug in isTestFile that eslint-plugin-ember uses:

    if (!emberUtils.isTestFile(context.getFilename())) {
      return {};
    }
NullVoxPopuli commented 1 month ago

I just opened: https://github.com/ember-cli/eslint-plugin-ember/pull/2147

can you try that fix locally?

FadhlanR commented 1 month ago

I just opened: #2147

can you try that fix locally?

I've tried it locally and it works. Thanks!