# frozen_string_literal: true require "test_helper" require "command" require "command_list" CommandList::Customer = Minitest::Mock.new CommandList::REDIS = 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 CommandList::REDIS.expect( :get, EMPromise.resolve(nil), ["catapult_fwd-1"] ) 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 CommandList::REDIS.expect( :get, EMPromise.resolve("tel:1"), ["catapult_fwd-1"] ) customer = OpenStruct.new( registered?: OpenStruct.new(phone: "1"), payment_methods: EMPromise.resolve([]) ) 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 CommandList::REDIS.expect( :get, EMPromise.resolve(nil), ["catapult_fwd-1"] ) 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 CommandList::REDIS.expect( :get, EMPromise.resolve(nil), ["catapult_fwd-1"] ) 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