Module: SolidObjects::TestHelper

Defined in:
lib/solid_objects/test_helper.rb,
sig/generated/lib/solid_objects/test_helper.rbs

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.actor_owned_modelsArray[Class]

Children first, so the order is safe whether or not the cascade fires.

RBS:

  • () -> Array[Class]

Returns:

  • (Array[Class])


32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/solid_objects/test_helper.rb', line 32

def actor_owned_models
  [
    DeadLetter,
    ClaimedMessage,
    ReadyMessage,
    Broadcast,
    Effect,
    Reminder,
    Message,
    Instance
  ]
end

.included(test_case) ⇒ void

This method returns an undefined value.

RBS:

  • (Class) -> void

Parameters:

  • (Class)


9
10
11
12
13
# File 'lib/solid_objects/test_helper.rb', line 9

def included(test_case)
  test_case.use_transactional_tests = false if test_case.respond_to?(:use_transactional_tests=)
  test_case.setup { reset_actors! }
  test_case.teardown { reset_actors! }
end

.reset_actors!void

This method returns an undefined value.

Deleting instances alone left every other actor-owned row to the database cascade. That cascade is not enforced everywhere: SQLite has to be asked for foreign keys, MySQL has to be on InnoDB, and a host application may have stripped the constraints out of the copied migration. Where it does not fire, rows survive into the next test with an instance_id pointing at nothing, and a test that reads them sees another test's data. Deleting each table costs nothing and does not depend on referential integrity.

RBS:

  • () -> void



24
25
26
27
28
# File 'lib/solid_objects/test_helper.rb', line 24

def reset_actors!
  SolidObjects.reset_caller_process!
  actor_owned_models.each(&:delete_all)
  Process.delete_all
end

Instance Method Details

#build_solid_objects_runners(roles) ⇒ Array[Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor]

RBS:

  • (Array[Symbol]) -> Array[Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor]

Parameters:

  • (Array[Symbol])

Returns:



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/solid_objects/test_helper.rb', line 90

def build_solid_objects_runners(roles)
  unknown_roles = roles - [ :actors, :effects, :reminders, :broadcasts ]
  raise ArgumentError, "unknown Solid Objects test roles: #{unknown_roles.join(", ")}" if unknown_roles.any?

  runners = {}
  runners[:actors] = Worker.new if roles.include?(:actors)
  runners[:effects] = EffectExecutor.new if roles.include?(:effects)
  runners[:reminders] = ReminderScheduler.new if roles.include?(:reminders)
  runners[:broadcasts] = BroadcastExecutor.new if roles.include?(:broadcasts)

  [
    runners[:reminders],
    runners[:actors],
    runners[:effects],
    runners[:actors],
    runners[:broadcasts]
  ].compact
end

#drain_solid_objects(roles: [ :reminders, :actors, :effects, :broadcasts ], max_passes: 1_000) ⇒ Integer

RBS:

  • (?roles: Array[Symbol], ?max_passes: Integer) -> Integer

Parameters:

  • roles: (Array[Symbol]) (defaults to: [ :reminders, :actors, :effects, :broadcasts ])
  • max_passes: (Integer) (defaults to: 1_000)

Returns:

  • (Integer)


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/solid_objects/test_helper.rb', line 52

def drain_solid_objects(
  roles: [ :reminders, :actors, :effects, :broadcasts ],
  max_passes: 1_000
)
  runners = build_solid_objects_runners(roles)
  total = 0

  max_passes.times do
    processed = runners.sum { |runner| solid_objects_runner_result(runner) }
    break if processed.zero?

    total += processed
  end

  total
ensure
  runners&.uniq&.each(&:stop)
end

#reset_actors!void

This method returns an undefined value.

RBS:

  • () -> void



47
48
49
# File 'lib/solid_objects/test_helper.rb', line 47

def reset_actors!
  TestHelper.reset_actors!
end

#run_due_reminders(now:, max_reminders: 10_000) ⇒ Integer

RBS:

  • (now: Time, ?max_reminders: Integer) -> Integer

Parameters:

  • now: (Time)
  • max_reminders: (Integer) (defaults to: 10_000)

Returns:

  • (Integer)


72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/solid_objects/test_helper.rb', line 72

def run_due_reminders(now:, max_reminders: 10_000)
  unless max_reminders.is_a?(Integer) && max_reminders.positive?
    raise ArgumentError, "max_reminders must be a positive integer"
  end

  scheduler = ReminderScheduler.new
  processed = 0
  while processed < max_reminders && scheduler.run_once(now:)
    processed += 1
  end
  processed
ensure
  scheduler&.stop
end

#solid_objects_runner_result(runner) ⇒ Integer

RBS:

  • (Worker | EffectExecutor | ReminderScheduler | BroadcastExecutor) -> Integer

Parameters:

Returns:

  • (Integer)


110
111
112
113
114
115
# File 'lib/solid_objects/test_helper.rb', line 110

def solid_objects_runner_result(runner)
  result = runner.run_once
  return result if result.is_a?(Integer)

  result ? 1 : 0
end