Module: RubyLLM::Contract::MinitestHelpers

Includes:
Concerns::StubHelpers
Defined in:
lib/ruby_llm/contract/minitest.rb

Instance Method Summary collapse

Methods included from Concerns::StubHelpers

#stub_all_steps, #stub_step, #stub_steps

Instance Method Details

#assert_eval_passes(step, eval_name, minimum_score: nil, maximum_cost: nil, context: {}, msg: nil) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/ruby_llm/contract/minitest.rb', line 33

def assert_eval_passes(step, eval_name, minimum_score: nil, maximum_cost: nil, context: {}, msg: nil)
  report = step.run_eval(eval_name, context: context)

  if minimum_score
    assert report.score >= minimum_score,
           msg || "Expected #{eval_name} eval score >= #{minimum_score}, got #{report.score.round(2)} (#{report.pass_rate})"
  else
    assert report.passed?,
           msg || "Expected #{eval_name} eval to pass, got #{report.score.round(2)} (#{report.pass_rate})"
  end

  if maximum_cost
    assert report.total_cost <= maximum_cost,
           msg || "Expected #{eval_name} eval cost <= $#{format("%.4f", maximum_cost)}, got $#{format("%.4f", report.total_cost)}"
  end

  report
end

#assert_satisfies_contract(result, msg = nil) ⇒ Object



24
25
26
27
# File 'lib/ruby_llm/contract/minitest.rb', line 24

def assert_satisfies_contract(result, msg = nil)
  assert result.ok?, msg || "Expected step result to satisfy contract, " \
    "but got status: #{result.status}. Errors: #{result.validation_errors.join(", ")}"
end

#refute_satisfies_contract(result, msg = nil) ⇒ Object



29
30
31
# File 'lib/ruby_llm/contract/minitest.rb', line 29

def refute_satisfies_contract(result, msg = nil)
  refute result.ok?, msg || "Expected step result NOT to satisfy contract, but it passed"
end

#setupObject

Snapshot adapter before each test so teardown can restore it.



11
12
13
14
# File 'lib/ruby_llm/contract/minitest.rb', line 11

def setup
  super if defined?(super)
  @_contract_original_adapter = RubyLLM::Contract.configuration.default_adapter
end

#teardownObject

Auto-cleanup: clear overrides AND restore original adapter. Prevents both non-block stub_step and stub_all_steps from leaking.



18
19
20
21
22
# File 'lib/ruby_llm/contract/minitest.rb', line 18

def teardown
  RubyLLM::Contract.step_adapter_overrides.clear
  RubyLLM::Contract.configuration.default_adapter = @_contract_original_adapter
  super if defined?(super)
end