1# frozen_string_literal: true
2
3require "test_helper"
4require "command"
5require "command_list"
6
7CommandList::Customer = Minitest::Mock.new
8CommandList::REDIS = Minitest::Mock.new
9
10class CommandListTest < Minitest::Test
11 SETUP = begin
12 [
13 Command.new("no_customer", "", list_for: ->(**) { true }),
14 Command.new("registered", "", list_for: ->(tel:, **) { !!tel }),
15 Command.new("fwd", "", list_for: ->(fwd: nil, **) { !!fwd }),
16 Command.new(
17 "currency", "",
18 list_for: ->(customer: nil, **) { !!customer&.currency }
19 ),
20 Command.new(
21 "cc", "",
22 list_for: ->(payment_methods: [], **) { !payment_methods.empty? }
23 )
24 ].each do |c|
25 CommandList.register(c)
26 end
27 end
28
29 def test_for_no_customer
30 assert_equal(
31 ["no_customer"],
32 CommandList.for(nil).sync.map { |c| c[:node] }
33 )
34 end
35 em :test_for_no_customer
36
37 def test_for_unregistered
38 customer = OpenStruct.new(registered?: false)
39 assert_equal(
40 ["no_customer"],
41 CommandList.for(customer).sync.map { |c| c[:node] }
42 )
43 end
44 em :test_for_unregistered
45
46 def test_for_registered
47 CommandList::REDIS.expect(
48 :get,
49 EMPromise.resolve(nil),
50 ["catapult_fwd-1"]
51 )
52 customer = OpenStruct.new(
53 registered?: OpenStruct.new(phone: "1"),
54 payment_methods: EMPromise.resolve([])
55 )
56 assert_equal(
57 ["no_customer", "registered"],
58 CommandList.for(customer).sync.map { |c| c[:node] }
59 )
60 end
61 em :test_for_registered
62
63 def test_for_registered_with_fwd
64 CommandList::REDIS.expect(
65 :get,
66 EMPromise.resolve("tel:1"),
67 ["catapult_fwd-1"]
68 )
69 customer = OpenStruct.new(
70 registered?: OpenStruct.new(phone: "1"),
71 payment_methods: EMPromise.resolve([])
72 )
73 assert_equal(
74 ["no_customer", "registered", "fwd"],
75 CommandList.for(customer).sync.map { |c| c[:node] }
76 )
77 end
78 em :test_for_registered_with_fwd
79
80 def test_for_registered_with_credit_card
81 CommandList::REDIS.expect(
82 :get,
83 EMPromise.resolve(nil),
84 ["catapult_fwd-1"]
85 )
86 customer = OpenStruct.new(
87 registered?: OpenStruct.new(phone: "1"),
88 plan_name: "test",
89 payment_methods: EMPromise.resolve([:boop])
90 )
91 assert_equal(
92 ["no_customer", "registered", "cc"],
93 CommandList.for(customer).sync.map { |c| c[:node] }
94 )
95 end
96 em :test_for_registered_with_credit_card
97
98 def test_for_registered_with_currency
99 CommandList::REDIS.expect(
100 :get,
101 EMPromise.resolve(nil),
102 ["catapult_fwd-1"]
103 )
104 customer = OpenStruct.new(
105 registered?: OpenStruct.new(phone: "1"),
106 currency: :USD
107 )
108 assert_equal(
109 ["no_customer", "registered", "currency"],
110 CommandList.for(customer).sync.map { |c| c[:node] }
111 )
112 end
113 em :test_for_registered_with_currency
114end