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_does_not_need_sim_pricing_without_sims
67 assert_equal({}, MonthlyDataLimit.for_sims([], :CAD, CONFIG))
68 end
69
70 def test_uses_integer_dollars_for_fractional_refill_price
71 config = CONFIG.merge(
72 sims: CONFIG[:sims].merge(CAD: { per_gb: 125 })
73 )
74 limits = MonthlyDataLimit.for_currency(:CAD, config)
75
76 assert_equal 6, limits[:step]
77 assert_equal 60, limits[:max]
78 end
79end