# NOTE: This rule flags eslint/oxlint disable directives that suppress max-lines
# (or all rules) inside test files. Test files must stay within their line limit;
# split the test or extract reusable helpers instead.

id: no-test-max-lines-disable
language: Tsx
severity: error
message: 'Test files must not disable max-lines or all lint rules; split the test or extract reusable helpers instead.'
files:
  - '**/*.test.ts'
  - '**/*.test.mts'
  - '**/*.test.cts'
  - '**/*.spec.ts'
  - '**/*.spec.mts'
  - '**/*.spec.cts'
  - '**/__tests__/**/*.ts'
  - '**/__tests__/**/*.mts'
  - '**/__tests__/**/*.cts'
  - '**/*.test.tsx'
  - '**/*.spec.tsx'
  - '**/__tests__/**/*.tsx'
rule:
  kind: comment
  any:
    - regex: '^(?://|/\*)\s*(?:eslint|oxlint)-disable(?:-next-line|-line)?\s*(?:\*/\s*$|--|\s*$)'
    - regex: '^(?://|/\*)\s*(?:eslint|oxlint)-disable(?:-next-line|-line)?(?:[^\n-]|-[^\n-])*(?:\s|,)(?:max-lines(?:[^-a-zA-Z0-9_]|$)|eslint/max-lines(?:[^-a-zA-Z0-9_]|$))'
examples:
  - code: '// oxlint-disable max-lines'
    isValid: false
    file: 'backend/services/users.test.ts'
  - code: '// eslint-disable'
    isValid: false
    file: 'backend/services/users.test.mts'
  - code: '// oxlint-disable-next-line max-lines'
    isValid: false
    file: 'backend/services/users.spec.ts'
  - code: '/* eslint-disable eslint/max-lines */'
    isValid: false
    file: 'backend/__tests__/foo.ts'
  - code: '// oxlint-disable vitest/expect-expect'
    isValid: true
    file: 'backend/services/users.test.ts'
  - code: '// oxlint-disable no-console'
    isValid: true
    file: 'backend/services/users.test.mts'
  - code: '// eslint-disable max-lines-per-function'
    isValid: true
    file: 'backend/services/users.test.ts'
  - code: '// eslint-disable eslint/max-lines-per-function'
    isValid: true
    file: 'backend/services/users.test.ts'
  - code: '// oxlint-disable no-console -- split because of max-lines'
    isValid: true
    file: 'backend/services/users.test.ts'
  - code: // oxlint-disable max-lines
    isValid: false
    file: web/components/__tests__/foo.test.tsx
  - code: // eslint-disable
    isValid: false
    file: web/components/__tests__/foo.test.tsx
  - code: // oxlint-disable vitest/expect-expect
    isValid: true
    file: web/components/__tests__/foo.test.tsx
  - code: // oxlint-disable no-console
    isValid: true
    file: web/components/__tests__/foo.spec.tsx
  - code: // eslint-disable max-lines-per-function
    isValid: true
    file: web/components/__tests__/foo.test.tsx
  - code: // eslint-disable eslint/max-lines-per-function
    isValid: true
    file: web/components/__tests__/foo.test.tsx
  - code: // oxlint-disable no-console -- split because of max-lines
    isValid: true
    file: web/components/__tests__/foo.test.tsx
