|
| 1 | +# frozen_string_literal: true |
| 2 | + |
| 3 | +require 'test' |
| 4 | +require 'updatable_timer/updatable_timer_workflow' |
| 5 | +require 'securerandom' |
| 6 | +require 'temporalio/client' |
| 7 | +require 'temporalio/testing' |
| 8 | +require 'temporalio/worker' |
| 9 | + |
| 10 | +module UpdatableTimer |
| 11 | + class UpdatableTimerWorkflowTest < Test |
| 12 | + def test_workflow |
| 13 | + Temporalio::Testing::WorkflowEnvironment.start_time_skipping do |env| |
| 14 | + # Run workflow in a worker |
| 15 | + worker = Temporalio::Worker.new( |
| 16 | + client: env.client, |
| 17 | + task_queue: "tq-#{SecureRandom.uuid}", |
| 18 | + workflows: [UpdatableTimerWorkflow] |
| 19 | + ) |
| 20 | + handle = worker.run do |
| 21 | + day_from_now = (Time.now(in: 'utc') + (24 * 60 * 60)).to_r |
| 22 | + hour_from_now = (Time.now(in: 'utc') + (60 * 60)).to_r |
| 23 | + handle = env.client.start_workflow( |
| 24 | + UpdatableTimerWorkflow, day_from_now, |
| 25 | + id: "wf-#{SecureRandom.uuid}", task_queue: worker.task_queue |
| 26 | + ) |
| 27 | + assert_equal day_from_now, Rational(handle.query(UpdatableTimerWorkflow.wake_up_time)) |
| 28 | + env.sleep(10) |
| 29 | + handle.signal(UpdatableTimerWorkflow.update_wake_up_time, hour_from_now) |
| 30 | + assert_equal hour_from_now, Rational(handle.query(UpdatableTimerWorkflow.wake_up_time)) |
| 31 | + |
| 32 | + handle.result |
| 33 | + handle |
| 34 | + end |
| 35 | + timer_events = handle.fetch_history_events.filter_map do |e| |
| 36 | + timer_id = (e.timer_started_event_attributes || |
| 37 | + e.timer_canceled_event_attributes || |
| 38 | + e.timer_fired_event_attributes)&.timer_id |
| 39 | + [e.event_type, timer_id] if timer_id |
| 40 | + end.compact |
| 41 | + assert_equal( |
| 42 | + [[:EVENT_TYPE_TIMER_STARTED, '1'], [:EVENT_TYPE_TIMER_CANCELED, '1'], [:EVENT_TYPE_TIMER_STARTED, '2'], |
| 43 | + [:EVENT_TYPE_TIMER_FIRED, '2']], |
| 44 | + timer_events |
| 45 | + ) |
| 46 | + end |
| 47 | + end |
| 48 | + end |
| 49 | +end |
0 commit comments