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 repo = mkrepo(db: db)
56 db.expect(
57 :query_defer,
58 EMPromise.resolve([]),
59 [String, [7357]]
60 )
61 customer = repo.find(7357).sync
62 assert_equal BigDecimal.new(0), customer.balance
63 assert_mock db
64 end
65 em :test_find_db_empty
66
67 def test_create
68 redis = Minitest::Mock.new
69 braintree = Minitest::Mock.new
70 repo = mkrepo(redis: redis, braintree: braintree)
71 braintree_customer = Minitest::Mock.new
72 braintree.expect(:customer, braintree_customer)
73 braintree_customer.expect(:create, EMPromise.resolve(
74 OpenStruct.new(success?: true, customer: OpenStruct.new(id: "test"))
75 ))
76 redis.expect(
77 :msetnx,
78 EMPromise.resolve(1),
79 [
80 "jmp_customer_id-test@example.com", "test",
81 "jmp_customer_jid-test", "test@example.com"
82 ]
83 )
84 assert_kind_of Customer, repo.create("test@example.com").sync
85 assert_mock braintree
86 assert_mock braintree_customer
87 assert_mock redis
88 end
89 em :test_create
90end