Skip to content

ESLint (JS / TS)

eslint-plugin-aaa-pattern enforces the Arrange-Act-Assert pattern in JavaScript and TypeScript test files.

Install

bash
npm install --save-dev eslint-plugin-aaa-pattern

Flat config (ESLint v9+)

js
// eslint.config.js
import aaa from 'eslint-plugin-aaa-pattern'

export default [
  {
    files: ['**/*.test.{js,ts}'],
    plugins: { aaa },
    rules: {
      'aaa/pattern': 'error'
    }
  }
]

Or use the bundled recommended config:

js
import aaa from 'eslint-plugin-aaa-pattern'

export default [aaa.configs.recommended]

Legacy config (ESLint v8)

jsonc
// .eslintrc.json
{
  "plugins": ["aaa"],
  "overrides": [
    {
      "files": ["**/*.test.js"],
      "rules": { "aaa/pattern": "error" }
    }
  ]
}

Rule: aaa/pattern

Options

jsonc
{
  "aaa/pattern": ["error", {
    "labels": {
      "arrange": ["arrange"],
      "act":     ["act"],
      "assert":  ["assert"]
    },
    "testFunctions": ["it", "test"],
    "caseSensitive": false,
    "allowEmptySection": true
  }]
}
OptionDefaultDescription
labelsEnglish defaultsAccepted comment text for each section. Each value is an array, so multiple synonyms are fine.
testFunctions["it", "test"]Test-defining calls to inspect. Add "specify", "example", etc. as needed.
caseSensitivefalseIf false, label matching ignores case (// ARRANGE matches arrange).
allowEmptySectiontrueIf false, reports when a section has no statements between its comment and the next.

Examples

Given / When / Then

jsonc
{
  "labels": {
    "arrange": ["given"],
    "act":     ["when"],
    "assert":  ["then"]
  }
}

Japanese

jsonc
{
  "labels": {
    "arrange": ["準備", "前準備"],
    "act":     ["実行"],
    "assert":  ["検証", "確認"]
  }
}

What it catches

js
// Error: missing "arrange" comment
it('bad', () => {
  // act
  const x = doThing()
  // assert
  expect(x).toBe(1)
})

// Error: wrong order
it('also bad', () => {
  // act
  const x = doThing()
  // arrange
  const y = 1
  // assert
  expect(x).toBe(y)
})

Auto-fix

When all three section comments are missing, eslint --fix inserts a // arrange / // act / // assert template at the top of the test block. You then move each comment above the code that belongs to it.

Other cases (one or two missing, wrong order, empty section) are not auto-fixed because the correct insertion point depends on the test's intent — the error message tells you exactly what to add and where.