# frozen_string_literal: true
require "test_helper"
require "customer"
Customer::BRAINTREE = Minitest::Mock.new
Customer::REDIS = Minitest::Mock.new
Customer::DB = Minitest::Mock.new
CustomerPlan::DB = Minitest::Mock.new
class CustomerTest < Minitest::Test
def test_for_jid
Customer::REDIS.expect(
:get,
EMPromise.resolve(1),
["jmp_customer_id-test@example.com"]
)
Customer::DB.expect(
:query_defer,
EMPromise.resolve([{ balance: 1234, plan_name: "test_usd" }]),
[String, [1]]
)
customer = Customer.for_jid("test@example.com").sync
assert_kind_of Customer, customer
assert_equal 1234, customer.balance
assert_equal "merchant_usd", customer.merchant_account
end
em :test_for_jid
def test_for_jid_not_found
Customer::REDIS.expect(
:get,
EMPromise.resolve(nil),
["jmp_customer_id-test2@example.com"]
)
assert_raises do
Customer.for_jid("test2@example.com").sync
end
end
em :test_for_jid_not_found
def test_for_customer_id_not_found
Customer::DB.expect(
:query_defer,
EMPromise.resolve([]),
[String, [7357]]
)
customer = Customer.for_customer_id(7357).sync
assert_equal BigDecimal.new(0), customer.balance
end
em :test_for_customer_id_not_found
def test_create
braintree_customer = Minitest::Mock.new
Customer::BRAINTREE.expect(:customer, braintree_customer)
braintree_customer.expect(:create, EMPromise.resolve(
OpenStruct.new(success?: true, customer: OpenStruct.new(id: "test"))
))
Customer::REDIS.expect(
:msetnx,
EMPromise.resolve(1),
[
"jmp_customer_id-test@example.com", "test",
"jmp_customer_jid-test", "test@example.com"
]
)
assert_kind_of Customer, Customer.create("test@example.com").sync
braintree_customer.verify
Customer::REDIS.verify
end
em :test_create
def test_bill_plan_activate
CustomerPlan::DB.expect(:transaction, nil) do |&block|
block.call
true
end
CustomerPlan::DB.expect(
:exec,
nil,
[
String,
Matching.new do |params|
params[0] == "test" &&
params[1].is_a?(String) &&
BigDecimal.new(-1) == params[2]
end
]
)
CustomerPlan::DB.expect(
:exec,
OpenStruct.new(cmd_tuples: 1),
[String, ["test", "test_usd"]]
)
Customer.new("test", plan_name: "test_usd").bill_plan.sync
CustomerPlan::DB.verify
end
em :test_bill_plan_activate
def test_bill_plan_update
CustomerPlan::DB.expect(:transaction, nil) do |&block|
block.call
true
end
CustomerPlan::DB.expect(
:exec,
nil,
[
String,
Matching.new do |params|
params[0] == "test" &&
params[1].is_a?(String) &&
BigDecimal.new(-1) == params[2]
end
]
)
CustomerPlan::DB.expect(
:exec,
OpenStruct.new(cmd_tuples: 0),
[String, ["test", "test_usd"]]
)
CustomerPlan::DB.expect(:exec, nil, [String, ["test"]])
Customer.new("test", plan_name: "test_usd").bill_plan.sync
CustomerPlan::DB.verify
end
em :test_bill_plan_update
end