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
9CustomerRepo::REDIS = Minitest::Mock.new
10CustomerRepo::DB = Minitest::Mock.new
11CustomerRepo::BRAINTREE = Minitest::Mock.new
12
13class CommandListTest < Minitest::Test
14 SETUP = begin
15 [
16 Command.new("no_customer", "", list_for: ->(**) { true }),
17 Command.new("registered", "", list_for: ->(tel:, **) { !!tel }),
18 Command.new("fwd", "", list_for: ->(fwd: nil, **) { !!fwd }),
19 Command.new(
20 "currency", "",
21 list_for: ->(customer: nil, **) { !!customer&.currency }
22 ),
23 Command.new(
24 "cc", "",
25 list_for: ->(payment_methods: [], **) { !payment_methods.empty? }
26 )
27 ].each do |c|
28 CommandList.register(c)
29 end
30 end
31
32 def test_for_no_customer
33 assert_equal(
34 ["no_customer"],
35 CommandList.for(nil, "bob@example.com").sync.map { |c| c[:node] }
36 )
37 end
38 em :test_for_no_customer
39
40 def test_for_unregistered
41 customer = OpenStruct.new(registered?: false)
42 assert_equal(
43 ["no_customer"],
44 CommandList.for(customer, "bob@example.com").sync.map { |c| c[:node] }
45 )
46 end
47 em :test_for_unregistered
48
49 def test_for_registered
50 customer = OpenStruct.new(
51 registered?: OpenStruct.new(phone: "1"),
52 payment_methods: EMPromise.resolve([])
53 )
54 assert_equal(
55 ["no_customer", "registered"],
56 CommandList.for(customer, "bob@example.com").sync.map { |c| c[:node] }
57 )
58 end
59 em :test_for_registered
60
61 def test_for_registered_with_fwd
62 customer = OpenStruct.new(
63 registered?: OpenStruct.new(phone: "1"),
64 payment_methods: EMPromise.resolve([]),
65 fwd: OpenStruct.new
66 )
67 assert_equal(
68 ["no_customer", "registered", "fwd"],
69 CommandList.for(customer, "bob@example.com").sync.map { |c| c[:node] }
70 )
71 end
72 em :test_for_registered_with_fwd
73
74 def test_for_registered_with_credit_card
75 customer = OpenStruct.new(
76 registered?: OpenStruct.new(phone: "1"),
77 plan_name: "test",
78 payment_methods: EMPromise.resolve([:boop])
79 )
80 assert_equal(
81 ["no_customer", "registered", "cc"],
82 CommandList.for(customer, "bob@example.com").sync.map { |c| c[:node] }
83 )
84 end
85 em :test_for_registered_with_credit_card
86
87 def test_for_registered_with_currency
88 customer = OpenStruct.new(
89 registered?: OpenStruct.new(phone: "1"),
90 currency: :USD
91 )
92 assert_equal(
93 ["no_customer", "registered", "currency"],
94 CommandList.for(customer, "bob@example.com").sync.map { |c| c[:node] }
95 )
96 end
97 em :test_for_registered_with_currency
98end