Module: Operandi::RSpec::Matchers

Defined in:
lib/operandi/rspec/matchers/define_step.rb,
lib/operandi/rspec/matchers/execute_step.rb,
lib/operandi/rspec/matchers/define_output.rb,
lib/operandi/rspec/matchers/have_error_on.rb,
lib/operandi/rspec/matchers/define_argument.rb,
lib/operandi/rspec/matchers/have_warning_on.rb,
lib/operandi/rspec/matchers/trigger_callback.rb

Defined Under Namespace

Classes: DefineArgumentMatcher, DefineOutputMatcher, DefineStepMatcher, DefineStepsMatcher, ExecuteStepMatcher, ExecuteStepsMatcher, HaveErrorOnMatcher, HaveErrorsOnMatcher, HaveWarningOnMatcher, HaveWarningsOnMatcher, SkipStepMatcher, TriggerCallbackMatcher

Instance Method Summary collapse

Instance Method Details

#define_argument(name) ⇒ Object

Matcher for testing argument definitions on a service class

Examples:

Basic usage

expect(MyService).to define_argument(:name)

With type constraint

expect(MyService).to define_argument(:name).with_type(String)

With optional flag

expect(MyService).to define_argument(:email).optional

With default value

expect(MyService).to define_argument(:status).with_default("pending")

With context flag

expect(MyService).to define_argument(:current_user).with_context

Combined

expect(MyService).to define_argument(:count).with_type(Integer).optional.with_default(0)


25
26
27
# File 'lib/operandi/rspec/matchers/define_argument.rb', line 25

def define_argument(name)
  DefineArgumentMatcher.new(name)
end

#define_output(name) ⇒ Object

Matcher for testing output definitions on a service class

Examples:

Basic usage

expect(MyService).to define_output(:result)

With type constraint

expect(MyService).to define_output(:product).with_type(Product)

With optional flag

expect(MyService).to define_output(:message).optional

With default value

expect(MyService).to define_output(:count).with_default(0)

Combined

expect(MyService).to define_output(:data).with_type(Hash).optional.with_default({})


22
23
24
# File 'lib/operandi/rspec/matchers/define_output.rb', line 22

def define_output(name)
  DefineOutputMatcher.new(name)
end

#define_step(name) ⇒ Object

Matcher for testing step definitions on a service class

Examples:

Basic usage

expect(MyService).to define_step(:validate)

With always flag

expect(MyService).to define_step(:cleanup).with_always(true)

With if condition

expect(MyService).to define_step(:notify).with_if(:should_notify?)

With unless condition

expect(MyService).to define_step(:skip_validation).with_unless(:production?)

Check multiple steps

expect(MyService).to define_steps(:validate, :process, :save)

Check step order

expect(MyService).to define_steps_in_order(:validate, :process, :save)


25
26
27
# File 'lib/operandi/rspec/matchers/define_step.rb', line 25

def define_step(name)
  DefineStepMatcher.new(name)
end

#define_steps(*names) ⇒ Object



29
30
31
# File 'lib/operandi/rspec/matchers/define_step.rb', line 29

def define_steps(*names)
  DefineStepsMatcher.new(names, ordered: false)
end

#define_steps_in_order(*names) ⇒ Object



33
34
35
# File 'lib/operandi/rspec/matchers/define_step.rb', line 33

def define_steps_in_order(*names)
  DefineStepsMatcher.new(names, ordered: true)
end

#execute_step(name) ⇒ Object

Matcher for testing step execution on a service instance NOTE: This matcher requires the service to track executed steps. Add a callback in your service to track execution:

after_step_run do |service, step_name|
service.executed_steps << step_name
end

Examples:

Basic usage (requires executed_steps tracking)

expect(service).to execute_step(:validate)

Check step was skipped

expect(service).to skip_step(:notify)

Check multiple steps executed

expect(service).to execute_steps(:validate, :process, :save)

Check execution order

expect(service).to execute_steps_in_order(:validate, :process, :save)


25
26
27
# File 'lib/operandi/rspec/matchers/execute_step.rb', line 25

def execute_step(name)
  ExecuteStepMatcher.new(name)
end

#execute_steps(*names) ⇒ Object



33
34
35
# File 'lib/operandi/rspec/matchers/execute_step.rb', line 33

def execute_steps(*names)
  ExecuteStepsMatcher.new(names, ordered: false)
end

#execute_steps_in_order(*names) ⇒ Object



37
38
39
# File 'lib/operandi/rspec/matchers/execute_step.rb', line 37

def execute_steps_in_order(*names)
  ExecuteStepsMatcher.new(names, ordered: true)
end

#have_error_on(key) ⇒ Object

Matcher for testing errors on a service instance

Examples:

Basic usage

expect(service).to have_error_on(:name)

With specific message

expect(service).to have_error_on(:name).with_message("can't be blank")

With message matching regex

expect(service).to have_error_on(:base).with_message(/invalid/)

Check multiple error keys

expect(service).to have_errors_on(:name, :email)


19
20
21
# File 'lib/operandi/rspec/matchers/have_error_on.rb', line 19

def have_error_on(key)
  HaveErrorOnMatcher.new(key)
end

#have_errors_on(*keys) ⇒ Object



23
24
25
# File 'lib/operandi/rspec/matchers/have_error_on.rb', line 23

def have_errors_on(*keys)
  HaveErrorsOnMatcher.new(keys)
end

#have_warning_on(key) ⇒ Object

Matcher for testing warnings on a service instance

Examples:

Basic usage

expect(service).to have_warning_on(:name)

With specific message

expect(service).to have_warning_on(:name).with_message("was replaced")

With message matching regex

expect(service).to have_warning_on(:base).with_message(/deprecated/)

Check multiple warning keys

expect(service).to have_warnings_on(:name, :email)


19
20
21
# File 'lib/operandi/rspec/matchers/have_warning_on.rb', line 19

def have_warning_on(key)
  HaveWarningOnMatcher.new(key)
end

#have_warnings_on(*keys) ⇒ Object



23
24
25
# File 'lib/operandi/rspec/matchers/have_warning_on.rb', line 23

def have_warnings_on(*keys)
  HaveWarningsOnMatcher.new(keys)
end

#skip_step(name) ⇒ Object



29
30
31
# File 'lib/operandi/rspec/matchers/execute_step.rb', line 29

def skip_step(name)
  SkipStepMatcher.new(name)
end

#trigger_callback(callback_name) ⇒ Object

Matcher for testing callback execution on a service instance NOTE: This matcher requires the service to track callback execution. Add tracking in your callbacks:

before_service_run do |service|
service.callback_log << :before_service_run
end

after_step_run do |service, step_name|
service.callback_log << [:after_step_run, step_name]
end

Examples:

Basic callback check (requires callback_log tracking)

expect(service).to trigger_callback(:before_service_run)

Step-specific callback

expect(service).to trigger_callback(:after_step_run).for_step(:validate)

Check callback was not triggered

expect(service).not_to trigger_callback(:on_service_failure)


26
27
28
# File 'lib/operandi/rspec/matchers/trigger_callback.rb', line 26

def trigger_callback(callback_name)
  TriggerCallbackMatcher.new(callback_name)
end