Skip to content

Commit 9013263

Browse files
Made DetermineVatRate process more readable
Used the Infra::ProcessManager module - consistent with our new direction for processes. Enabled mutant for this class. Added stream_name test which I'm not happy about (testing internals). Data.define still feels a bit redundant with all the params. In processes.rb I couldn't make it to work with .subscribed_events, it failed on acceptance tests.
1 parent d6de0fe commit 9013263

File tree

3 files changed

+40
-44
lines changed

3 files changed

+40
-44
lines changed

ecommerce/processes/.mutant.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,4 @@ matcher:
1515
- Processes::OrderItemInvoicingProcess*
1616
- Processes::SyncShipmentFromPricing*
1717
- Processes::SyncInventoryFromOrdering*
18-
- Processes::NotifyPaymentsAboutOrderValue*
19-
- Processes::DetermineVatRatesOnOrderPlaced*
18+
- Processes::NotifyPaymentsAboutOrderValue*

ecommerce/processes/lib/processes/determine_vat_rates_on_order_placed.rb

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,38 @@ module Processes
22
class DetermineVatRatesOnOrderPlaced
33
include Infra::Retry
44

5-
def initialize(event_store, command_bus)
6-
@event_store = event_store
7-
@command_bus = command_bus
5+
ProcessState = Data.define(:offer_accepted, :order_placed, :order_id, :order_lines) do
6+
def initialize(offer_accepted: false, order_placed: false, order_id: nil, order_lines: [])
7+
super(offer_accepted:, order_placed:, order_id:, order_lines: order_lines)
8+
end
9+
10+
def placed? = offer_accepted && order_placed
11+
end
12+
13+
include Infra::ProcessManager.with_state(ProcessState)
14+
subscribes_to(
15+
Pricing::OfferAccepted,
16+
Fulfillment::OrderRegistered
17+
)
18+
19+
def apply(event)
20+
case event
21+
when Pricing::OfferAccepted
22+
state.with(
23+
offer_accepted: true,
24+
order_lines: event.data.fetch(:order_lines),
25+
order_id: event.data.fetch(:order_id)
26+
)
27+
when Fulfillment::OrderRegistered
28+
state.with(order_placed: true)
29+
end
830
end
931

10-
def call(event)
11-
state = build_state(event)
12-
determine_vat_rates(state) if state.placed?
32+
def act
33+
determine_vat_rates if state.placed?
1334
end
1435

15-
def determine_vat_rates(state)
36+
def determine_vat_rates
1637
state.order_lines.each do |line|
1738
product_id = line.fetch(:product_id)
1839
command = Taxes::DetermineVatRate.new(order_id: state.order_id, product_id: product_id)
@@ -22,41 +43,9 @@ def determine_vat_rates(state)
2243

2344
private
2445

25-
attr_reader :event_store, :command_bus
26-
27-
def build_state(event)
28-
with_retry do
29-
stream_name = "DetermineVatRatesOnOrderPlacedProcess#{event.data.fetch(:order_id)}"
30-
past_events = event_store.read.stream(stream_name).to_a
31-
last_stored = past_events.size - 1
32-
event_store.link(event.event_id, stream_name: stream_name, expected_version: last_stored)
33-
ProcessState.new.tap do |state|
34-
past_events.each { |ev| state.call(ev) }
35-
state.call(event)
36-
end
37-
end
46+
def fetch_id(event)
47+
event.data.fetch(:order_id)
3848
end
3949

40-
class ProcessState
41-
def initialize
42-
@offer_accepted = false
43-
@order_placed = false
44-
end
45-
46-
attr_reader :order_id, :order_lines
47-
48-
def call(event)
49-
case event
50-
when Pricing::OfferAccepted
51-
@offer_accepted = true
52-
@order_lines = event.data.fetch(:order_lines)
53-
@order_id = event.data.fetch(:order_id)
54-
when Fulfillment::OrderRegistered
55-
@order_placed = true
56-
end
57-
end
58-
59-
def placed? = @offer_accepted && @order_placed
60-
end
6150
end
62-
end
51+
end

ecommerce/processes/test/determine_vat_rate_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ def test_placed_but_not_accepted
2929
assert_no_command
3030
end
3131

32+
def test_stream_name
33+
process = DetermineVatRatesOnOrderPlaced.new(event_store, command_bus)
34+
given([order_placed]).each do |event|
35+
process.call(event)
36+
end
37+
assert_equal "Processes::DetermineVatRatesOnOrderPlaced$#{order_id}", process.send(:stream_name)
38+
end
39+
3240
private
3341

3442
def offer_accepted(order_id, product_id)

0 commit comments

Comments
 (0)