From 21a6de404d2264f49b80cbab656bc729110ef558 Mon Sep 17 00:00:00 2001 From: Carl Markham Date: Fri, 13 Sep 2024 15:38:50 +0100 Subject: [PATCH] added no-empty-file rule (#14) --- src/rules/no-empty-file.ts | 27 ++++++++++++++++++ src/runner.ts | 3 -- .../features/no-empty-file/invalid.feature | 0 .../features/no-empty-file/valid.feature | 18 ++++++++++++ tests/acceptance/no-empty-file.ts | 28 +++++++++++++++++++ 5 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 src/rules/no-empty-file.ts create mode 100644 tests/acceptance/features/no-empty-file/invalid.feature create mode 100644 tests/acceptance/features/no-empty-file/valid.feature create mode 100644 tests/acceptance/no-empty-file.ts diff --git a/src/rules/no-empty-file.ts b/src/rules/no-empty-file.ts new file mode 100644 index 0000000..3205faa --- /dev/null +++ b/src/rules/no-empty-file.ts @@ -0,0 +1,27 @@ +import { GherkinDocument } from '@cucumber/messages' + +import { LintError } from '../error' +import { switchOrSeveritySchema } from '../schemas' +import Rule from '../rule' + +/** + * Allowed: + * off | on | error | warn + */ +export const schema = switchOrSeveritySchema + +export const run = (rule: Rule, document: GherkinDocument): Array => { + const errors: Array = [] + + if (!document) { + errors.push({ + message: 'Feature file is empty', + location: { + line: 0, + column: 0, + }, + } as LintError) + } + + return errors +} diff --git a/src/runner.ts b/src/runner.ts index dbf9ee1..7fa7054 100644 --- a/src/runner.ts +++ b/src/runner.ts @@ -77,9 +77,6 @@ export default class Runner { const document = parser.parse(content.toString()) const walk = walker.walkGherkinDocument(document) - if (!document || (document && !document.feature)) { - continue - } for (const rule of this.rules) { if (!rule.schema.enabled) { diff --git a/tests/acceptance/features/no-empty-file/invalid.feature b/tests/acceptance/features/no-empty-file/invalid.feature new file mode 100644 index 0000000..e69de29 diff --git a/tests/acceptance/features/no-empty-file/valid.feature b/tests/acceptance/features/no-empty-file/valid.feature new file mode 100644 index 0000000..2a37aad --- /dev/null +++ b/tests/acceptance/features/no-empty-file/valid.feature @@ -0,0 +1,18 @@ +Feature: No Empty File + + Scenario: This is valid + Given I do something + When I do something else + Then I should have done something + And I should have done something else + But I shouldn't have done nothing + + Scenario Outline: Valid Indentation + When I do each of these things + | | + Then I should have done something + + Examples: + | THING | + | sleep | + | eat | diff --git a/tests/acceptance/no-empty-file.ts b/tests/acceptance/no-empty-file.ts new file mode 100644 index 0000000..cf706fd --- /dev/null +++ b/tests/acceptance/no-empty-file.ts @@ -0,0 +1,28 @@ +import path from 'node:path' +import { Runner, Severity } from '../../src' +import { expect } from 'chai' + +describe('No Empty File', () => { + it('returns errors if the rule fails', async () => { + const featureDirectory = path.join(import.meta.dirname, './features/no-empty-file') + + const runner = new Runner({ + configDirectory: '.', + featureDirectory, + rules: { + 'no-empty-file': Severity.warn, + }, + }) + + await runner.init() + const result = await runner.run() + + expect(result.success).to.eq(false) + expect(result.errors.size).to.eq(1) + expect(result.errors.has(`${featureDirectory}/valid.feature`)).to.eq(false) + + const errors = result.errors.get(`${featureDirectory}/invalid.feature`) + expect(errors.length).to.eq(1) + expect(errors[0].message).to.eq('Feature file is empty') + }) +})