# frozen_string_literal: true
require "test_helper"
require "command"
require "command_list"
CommandList::Customer = Minitest::Mock.new
CommandList::REDIS = Minitest::Mock.new
CustomerRepo::REDIS = Minitest::Mock.new
CustomerRepo::DB = Minitest::Mock.new
CustomerRepo::BRAINTREE = Minitest::Mock.new
class CommandListTest < Minitest::Test
SETUP = begin
[
Command.new("no_customer", "", list_for: ->(**) { true }),
Command.new("registered", "", list_for: ->(tel:, **) { !!tel }),
Command.new("fwd", "", list_for: ->(fwd: nil, **) { !!fwd }),
Command.new(
"currency", "",
list_for: ->(customer: nil, **) { !!customer&.currency }
),
Command.new(
"cc", "",
list_for: ->(payment_methods: [], **) { !payment_methods.empty? }
)
].each do |c|
CommandList.register(c)
end
end
def test_for_no_customer
assert_equal(
["no_customer"],
CommandList.for(nil).sync.map { |c| c[:node] }
)
end
em :test_for_no_customer
def test_for_unregistered
customer = OpenStruct.new(registered?: false)
assert_equal(
["no_customer"],
CommandList.for(customer).sync.map { |c| c[:node] }
)
end
em :test_for_unregistered
def test_for_registered
customer = OpenStruct.new(
registered?: OpenStruct.new(phone: "1"),
payment_methods: EMPromise.resolve([])
)
assert_equal(
["no_customer", "registered"],
CommandList.for(customer).sync.map { |c| c[:node] }
)
end
em :test_for_registered
def test_for_registered_with_fwd
customer = OpenStruct.new(
registered?: OpenStruct.new(phone: "1"),
payment_methods: EMPromise.resolve([]),
fwd: OpenStruct.new
)
assert_equal(
["no_customer", "registered", "fwd"],
CommandList.for(customer).sync.map { |c| c[:node] }
)
end
em :test_for_registered_with_fwd
def test_for_registered_with_credit_card
customer = OpenStruct.new(
registered?: OpenStruct.new(phone: "1"),
plan_name: "test",
payment_methods: EMPromise.resolve([:boop])
)
assert_equal(
["no_customer", "registered", "cc"],
CommandList.for(customer).sync.map { |c| c[:node] }
)
end
em :test_for_registered_with_credit_card
def test_for_registered_with_currency
customer = OpenStruct.new(
registered?: OpenStruct.new(phone: "1"),
currency: :USD
)
assert_equal(
["no_customer", "registered", "currency"],
CommandList.for(customer).sync.map { |c| c[:node] }
)
end
em :test_for_registered_with_currency
end