Class: DevDoc::Test::Lints::DuplicateSnapshotChecker

Inherits:
Object
  • Object
show all
Defined in:
lib/dev_doc/test/lints/duplicate_snapshot.rb

Overview

Framework-agnostic check: scans a directory of controller-test snapshot result dirs (*_results/*.json) and reports groups of byte-identical snapshots within the same dir.

Wrapped by the Minitest module DuplicateSnapshot below — see that module for the rationale and inline opt-out format. Tests cover the checker directly so they don't have to mock a test framework.

Constant Summary collapse

MARKER =

Inline opt-out token. Append to the test '...' do line (or a comment line directly above) of EACH test in an intentionally duplicate group: # allow_duplicate_snapshot: <reason>.

'allow_duplicate_snapshot'.freeze
TEST_DEFINITION =

Matches a minitest test '...' do declaration; captures the quote (1), the name (2), and the trailing content after do (3).

/^\s*test\s+(["'])(.+?)\1\s+do\b(.*)$/
MissingDir =

Sentinel returned by #offenders when no *_results dirs exist, so the Minitest wrapper can skip rather than assert.

Module.new

Instance Method Summary collapse

Constructor Details

#initialize(results_root) ⇒ DuplicateSnapshotChecker

Returns a new instance of DuplicateSnapshotChecker.

Parameters:

  • results_root (String, Pathname)

    dir that contains the *_results/ snapshot dirs (e.g. test/controllers).



30
31
32
# File 'lib/dev_doc/test/lints/duplicate_snapshot.rb', line 30

def initialize(results_root)
  @results_root = Pathname(results_root)
end

Instance Method Details

#offendersObject

Returns Array of offender descriptions (one per duplicate group that has at least one un-marked member), [] if there are no unjustified duplicates, or MissingDir if there are no *_results dirs at all.



38
39
40
41
42
43
# File 'lib/dev_doc/test/lints/duplicate_snapshot.rb', line 38

def offenders
  dirs = Dir.glob(@results_root.join('*_results')).select { |d| File.directory?(d) }
  return MissingDir if dirs.empty?

  dirs.sort.flat_map { |dir| offenders_in(dir) }
end