# frozen_string_literal: true
require "test_helper"
require "customer"
Customer::BLATHER = Minitest::Mock.new
Customer::BRAINTREE = Minitest::Mock.new
Customer::REDIS = Minitest::Mock.new
Customer::DB = Minitest::Mock.new
CustomerPlan::DB = Minitest::Mock.new
CustomerUsage::REDIS = Minitest::Mock.new
CustomerUsage::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
def test_jid
Customer::REDIS.expect(
:get,
EMPromise.resolve("test@example.com"),
["jmp_customer_jid-test"]
)
jid = Customer.new("test").jid.sync
assert_kind_of Blather::JID, jid
assert_equal "test@example.com", jid.to_s
Customer::REDIS.verify
end
em :test_jid
def test_stanza_to
Customer::REDIS.expect(
:get,
EMPromise.resolve("test@example.com"),
["jmp_customer_jid-test"]
)
Customer::BLATHER.expect(
:<<,
nil,
[Matching.new do |stanza|
assert_equal "+15555550000@component/a", stanza.from.to_s
assert_equal "test@example.com/b", stanza.to.to_s
end]
)
m = Blather::Stanza::Message.new
m.from = "+15555550000@sgx/a"
m.to = "customer_test@component/b"
Customer.new("test").stanza_to(m).sync
Customer::BLATHER.verify
end
em :test_stanza_to
def test_stanza_from
Customer::BLATHER.expect(
:<<,
nil,
[Matching.new do |stanza|
assert_equal "customer_test@component/a", stanza.from.to_s
assert_equal "+15555550000@sgx/b", stanza.to.to_s
end]
)
m = Blather::Stanza::Message.new
m.from = "test@example.com/a"
m.to = "+15555550000@component/b"
Customer.new("test").stanza_from(m)
Customer::BLATHER.verify
end
def test_customer_usage_report
report_for = (Date.today..(Date.today - 1))
report_for.first.downto(report_for.last).each.with_index do |day, idx|
CustomerUsage::REDIS.expect(
:zscore,
EMPromise.resolve(idx),
["jmp_customer_outbound_messages-test", day.strftime("%Y%m%d")]
)
end
CustomerUsage::DB.expect(
:query_defer,
EMPromise.resolve([{ "day" => report_for.first, "minutes" => 123 }]),
[String, ["test", report_for.first, report_for.last]]
)
assert_equal(
UsageReport.new(
report_for, {
Date.today => 0,
(Date.today - 1) => 1
},
Date.today => 123
),
Customer.new("test").usage_report(report_for).sync
)
end
em :test_customer_usage_report
end