# frozen_string_literal: true
require "test_helper"
require "customer_repo"
class CustomerRepo
attr_reader :sgx_repo
end
class CustomerRepoTest < Minitest::Test
FAKE_REDIS = FakeRedis.new(
# sgx-jmp customer
"jmp_customer_jid-test" => "test@example.com",
"jmp_customer_id-test@example.com" => "test",
"catapult_jid-+13334445555" => "customer_test@component",
"catapult_cred-customer_test@component" => [
"test_bw_customer", "", "", "+13334445555"
],
# sgx-jmp customer, empty DB
"jmp_customer_jid-empty" => "empty@example.com",
"jmp_customer_id-empty@example.com" => "empty",
"catapult_jid-+16667778888" => "customer_empty@component",
"catapult_cred-customer_empty@component" => [
"test_bw_customer", "", "", "+16667778888"
],
# v2 customer
"jmp_customer_jid-test_v2" => "test_v2@example.com",
"jmp_customer_id-test_v2@example.com" => "test_v2",
"catapult_jid-+14445556666" => "test_v2@example.com",
"catapult_cred-test_v2@example.com" => [
"test_bw_customer", "", "", "+14445556666"
],
# legacy customer
"catapult_cred-legacy@example.com" => [
"catapult_user", "", "", "+12223334444"
],
"catapult_jid-+12223334444" => "legacy@example.com"
)
FAKE_DB = FakeDB.new(
["test"] => [{
"balance" => BigDecimal(1234),
"plan_name" => "test_usd",
"expires_at" => Time.now + 100
}],
["test_v2"] => [{
"balance" => BigDecimal(2345),
"plan_name" => "test_usd",
"expires_at" => Time.now + 100
}]
)
def mkrepo(
redis: FAKE_REDIS,
db: FAKE_DB,
braintree: Minitest::Mock.new
)
sgx_repo = Minitest::Mock.new(TrivialBackendSgxRepo.new)
CustomerRepo.new(
redis: redis,
db: db,
braintree: braintree,
sgx_repo: sgx_repo
)
end
def setup
@repo = mkrepo
end
def test_find_by_jid
customer = @repo.find_by_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_find_by_jid
def test_find_by_id
customer = @repo.find("test").sync
assert_kind_of Customer, customer
assert_equal 1234, customer.balance
assert_equal "merchant_usd", customer.merchant_account
end
em :test_find_by_id
def test_find_by_customer_jid
customer = @repo.find_by_jid("customer_test@component").sync
assert_kind_of Customer, customer
assert_equal 1234, customer.balance
assert_equal "merchant_usd", customer.merchant_account
end
em :test_find_by_customer_jid
def test_find_by_jid_not_found
assert_raises do
@repo.find_by_jid("test2@example.com").sync
end
end
em :test_find_by_jid_not_found
def test_find_legacy_customer
customer = @repo.find_by_jid("legacy@example.com").sync
assert_kind_of LegacyCustomer, customer
assert_equal "+12223334444", customer.tel
end
em :test_find_legacy_customer
def test_find_sgx_customer_by_phone
customer = @repo.find_by_tel("+13334445555").sync
assert_kind_of Customer, customer
assert_equal "test", customer.customer_id
end
em :test_find_sgx_customer_by_phone
def test_find_v2_customer_by_phone
customer = @repo.find_by_tel("+14445556666").sync
assert_kind_of Customer, customer
assert_equal "test_v2", customer.customer_id
end
em :test_find_v2_customer_by_phone
def test_find_legacy_customer_by_phone
customer = @repo.find_by_tel("+12223334444").sync
assert_kind_of LegacyCustomer, customer
assert_equal "legacy@example.com", customer.jid.to_s
end
em :test_find_legacy_customer_by_phone
def test_find_missing_phone
assert_raises do
@repo.find_by_tel("+15556667777").sync
end
end
em :test_find_missing_phone
def test_find_db_empty
customer = @repo.find("empty").sync
assert_equal BigDecimal(0), customer.balance
end
em :test_find_db_empty
def test_create
redis = Minitest::Mock.new
braintree = Minitest::Mock.new
repo = mkrepo(redis: redis, braintree: braintree)
braintree_customer = Minitest::Mock.new
braintree.expect(:customer, braintree_customer)
braintree_customer.expect(
:create,
EMPromise.resolve(
OpenStruct.new(success?: true, customer: OpenStruct.new(id: "test"))
)
)
redis.expect(
:msetnx,
EMPromise.resolve(1),
[
"jmp_customer_id-test@example.com", "test",
"jmp_customer_jid-test", "test@example.com"
]
)
assert_kind_of Customer, repo.create("test@example.com").sync
assert_mock braintree
assert_mock braintree_customer
assert_mock redis
end
em :test_create
def test_put_lidb_name
post = stub_request(
:post,
"https://dashboard.bandwidth.com/v1.0/accounts//lidbs"
).with(body: {
CustomerOrderId: "test",
LidbTnGroups: {
LidbTnGroup: {
TelephoneNumbers: "5556667777",
SubscriberInformation: "Hank",
UseType: "RESIDENTIAL",
Visibility: "PUBLIC"
}
}
}.to_xml(root: "LidbOrder", indent: 0)).to_return(
status: 201,
headers: { location: "/boop/123" }
)
stub_request(
:get,
"https://dashboard.bandwidth.com/v1.0/accounts//lidbs/123"
)
@repo.put_lidb_name(
Customer.new(
"test",
"test@exmple.com",
sgx: OpenStruct.new(registered?: OpenStruct.new(phone: "+15556667777"))
),
"Hank"
)
assert_requested post
end
em :test_put_lidb_name
def test_put_transcription_enabled
@repo.sgx_repo.expect(
:put_transcription_enabled,
EMPromise.resolve(nil),
["test", true]
)
@repo.put_transcription_enabled(
Customer.new("test", "test@exmple.com"),
true
)
assert_mock @repo.sgx_repo
end
em :test_put_transcription_enabled
def test_put_fwd
@repo.sgx_repo.expect(
:put_fwd,
EMPromise.resolve(nil),
["test", "+15556667777", :fwd]
)
@repo.put_fwd(
Customer.new(
"test",
"test@exmple.com",
sgx: OpenStruct.new(registered?: OpenStruct.new(phone: "+15556667777"))
),
:fwd
)
assert_mock @repo.sgx_repo
end
em :test_put_fwd
end