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