1# frozen_string_literal: true
2
3require "test_helper"
4require "customer_repo"
5
6class CustomerRepoTest < Minitest::Test
7 def mkrepo(
8 redis: Minitest::Mock.new,
9 db: Minitest::Mock.new,
10 braintree: Minitest::Mock.new
11 )
12 CustomerRepo.new(redis: redis, db: db, braintree: braintree)
13 end
14
15 def test_find_by_jid
16 redis = Minitest::Mock.new
17 db = Minitest::Mock.new
18 repo = mkrepo(redis: redis, db: db)
19 redis.expect(
20 :get,
21 EMPromise.resolve(1),
22 ["jmp_customer_id-test@example.com"]
23 )
24 db.expect(
25 :query_defer,
26 EMPromise.resolve([{ balance: 1234, plan_name: "test_usd" }]),
27 [String, [1]]
28 )
29 customer = repo.find_by_jid("test@example.com").sync
30 assert_kind_of Customer, customer
31 assert_equal 1234, customer.balance
32 assert_equal "merchant_usd", customer.merchant_account
33 assert_mock redis
34 assert_mock db
35 end
36 em :test_find_by_jid
37
38 def test_find_by_jid_not_found
39 redis = Minitest::Mock.new
40 repo = mkrepo(redis: redis)
41 redis.expect(
42 :get,
43 EMPromise.resolve(nil),
44 ["jmp_customer_id-test2@example.com"]
45 )
46 assert_raises do
47 repo.find_by_jid("test2@example.com").sync
48 end
49 assert_mock redis
50 end
51 em :test_find_by_jid_not_found
52
53 def test_find_db_empty
54 db = Minitest::Mock.new
55 redis = Minitest::Mock.new
56 redis.expect(
57 :get,
58 EMPromise.resolve("test@example.net"),
59 ["jmp_customer_jid-7357"]
60 )
61 repo = mkrepo(db: db, redis: redis)
62 db.expect(
63 :query_defer,
64 EMPromise.resolve([]),
65 [String, [7357]]
66 )
67 customer = repo.find(7357).sync
68 assert_equal BigDecimal.new(0), customer.balance
69 assert_mock db
70 end
71 em :test_find_db_empty
72
73 def test_create
74 redis = Minitest::Mock.new
75 braintree = Minitest::Mock.new
76 repo = mkrepo(redis: redis, braintree: braintree)
77 braintree_customer = Minitest::Mock.new
78 braintree.expect(:customer, braintree_customer)
79 braintree_customer.expect(:create, EMPromise.resolve(
80 OpenStruct.new(success?: true, customer: OpenStruct.new(id: "test"))
81 ))
82 redis.expect(
83 :msetnx,
84 EMPromise.resolve(1),
85 [
86 "jmp_customer_id-test@example.com", "test",
87 "jmp_customer_jid-test", "test@example.com"
88 ]
89 )
90 assert_kind_of Customer, repo.create("test@example.com").sync
91 assert_mock braintree
92 assert_mock braintree_customer
93 assert_mock redis
94 end
95 em :test_create
96end