test_customer_repo.rb

 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