test_monthly_data_limit.rb

 1# frozen_string_literal: true
 2
 3require "test_helper"
 4require "monthly_data_limit"
 5
 6class MonthlyDataLimitTest < Minitest::Test
 7	def parse(limit)
 8		MonthlyDataLimit.parse(limit, step: 5, max: 50)
 9	end
10
11	def test_accepts_multiple_of_five
12		assert_equal 10, parse("10")
13	end
14
15	def test_accepts_zero
16		assert_equal 0, parse("0")
17	end
18
19	def test_accepts_maximum
20		assert_equal 50, parse("50")
21	end
22
23	def test_ignores_blank_form_field
24		form = Struct.new(:value) do
25			def field(*)
26				self
27			end
28		end.new("")
29
30		assert_nil MonthlyDataLimit.from_form(form, step: 5, max: 50)
31	end
32
33	def test_rejects_non_multiple_of_five
34		error = assert_raises(RuntimeError) { parse("11") }
35
36		assert_equal "Monthly data limit must be a multiple of 5", error.message
37	end
38
39	def test_rejects_non_multiple_of_currency_step
40		error = assert_raises(RuntimeError) {
41			MonthlyDataLimit.parse("10", step: 6, max: 60)
42		}
43
44		assert_equal "Monthly data limit must be a multiple of 6", error.message
45	end
46
47	def test_rejects_negative_values
48		error = assert_raises(RuntimeError) { parse("-5") }
49
50		assert_equal "Monthly data limit must be between 0 and 50", error.message
51	end
52
53	def test_rejects_values_above_maximum
54		error = assert_raises(RuntimeError) { parse("55") }
55
56		assert_equal "Monthly data limit must be between 0 and 50", error.message
57	end
58
59	def test_uses_sim_refill_price_for_step
60		limits = MonthlyDataLimit.for_currency(:CAD, CONFIG)
61
62		assert_equal 6, limits[:step]
63		assert_equal 60, limits[:max]
64	end
65
66	def test_formats_refill_price_for_display
67		assert_equal "$1.20 / GB", SIMPricing.per_gb_label(:CAD, CONFIG)
68	end
69
70	def test_formats_plan_price_for_display
71		assert_equal(
72			"$1.20 / GB + $1.20 / year",
73			SIMPricing.plan_label(:CAD, CONFIG)
74		)
75	end
76
77	def test_does_not_need_sim_pricing_without_sims
78		assert_equal({}, MonthlyDataLimit.for_sims([], :CAD, CONFIG))
79	end
80
81	def test_uses_integer_dollars_for_fractional_refill_price
82		config = CONFIG.merge(
83			sims: CONFIG[:sims].merge(
84				per_gb: CONFIG[:sims][:per_gb].merge(CAD: 125)
85			)
86		)
87		limits = MonthlyDataLimit.for_currency(:CAD, config)
88
89		assert_equal 6, limits[:step]
90		assert_equal 60, limits[:max]
91	end
92end