Class: Servactory::TestKit::Rspec::Matchers::Base::Submatcher

Inherits:
Object
  • Object
show all
Includes:
RSpec::Matchers::Composable, Concerns::AttributeDataAccess, Concerns::ErrorMessageBuilder, Concerns::ValueComparison
Defined in:
lib/servactory/test_kit/rspec/matchers/base/submatcher.rb

Overview

Abstract base class for individual validation rules in attribute matchers.

## Purpose

Submatcher provides the foundation for specific validation checks like type validation, required/optional status, default values, etc. Each submatcher validates one aspect of a service attribute definition.

## Usage

Create a subclass and implement required abstract methods:

“‘ruby class RequiredSubmatcher < Base::Submatcher

def description
  "required"
end

protected

def passes?
  fetch_option(:required) == true
end

def build_failure_message
  "expected input to be required, but it was optional"
end

end “‘

## Abstract Methods

Subclasses must implement:

  • ‘description` - human-readable description for test output

  • ‘passes?` - validation logic returning boolean

  • ‘build_failure_message` - explanation when validation fails

## Architecture

Works with:

  • SubmatcherContext - provides attribute data and metadata

  • AttributeMatcher - manages collection of submatchers

  • Concerns - provides helper methods for data access and comparison

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Concerns::ValueComparison

included

Methods included from Concerns::ErrorMessageBuilder

included

Methods included from Concerns::AttributeDataAccess

included

Constructor Details

#initialize(context) ⇒ Submatcher

Creates a new submatcher instance.

Parameters:



63
64
65
66
# File 'lib/servactory/test_kit/rspec/matchers/base/submatcher.rb', line 63

def initialize(context)
  @context = context
  @missing_option = ""
end

Instance Attribute Details

#missing_optionString (readonly)

Returns Failure message when validation does not pass.

Returns:

  • (String)

    Failure message when validation does not pass



58
59
60
# File 'lib/servactory/test_kit/rspec/matchers/base/submatcher.rb', line 58

def missing_option
  @missing_option
end

Instance Method Details

#descriptionString

This method is abstract.

Subclasses must implement this method

Returns a human-readable description of what this submatcher validates.

Returns:

  • (String)

    Description for test output

Raises:

  • (NotImplementedError)

    If not implemented by subclass



100
101
102
# File 'lib/servactory/test_kit/rspec/matchers/base/submatcher.rb', line 100

def description
  raise NotImplementedError, "#{self.class} must implement #description"
end

#failure_messageString

Returns the failure message for RSpec output.

Returns:

  • (String)

    The failure message



84
85
86
# File 'lib/servactory/test_kit/rspec/matchers/base/submatcher.rb', line 84

def failure_message
  @missing_option
end

#failure_message_when_negatedString

Returns the failure message for negated expectations.

Returns:

  • (String)

    The negated failure message



91
92
93
# File 'lib/servactory/test_kit/rspec/matchers/base/submatcher.rb', line 91

def failure_message_when_negated
  "expected not to #{description}"
end

#matches?(_subject) ⇒ Boolean

Checks if this submatcher’s validation passes.

Parameters:

  • _subject (Object)

    RSpec subject (unused, kept for interface compatibility)

Returns:

  • (Boolean)

    True if validation passes



72
73
74
75
76
77
78
79
# File 'lib/servactory/test_kit/rspec/matchers/base/submatcher.rb', line 72

def matches?(_subject)
  if passes?
    true
  else
    @missing_option = build_failure_message
    false
  end
end