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_ceil_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 7, limits[:step]
 90		assert_equal 70, limits[:max]
 91	end
 92
 93	def test_ceil_six_ninety_nine_per_gb_for_step
 94		config = CONFIG.merge(
 95			sims: CONFIG[:sims].merge(
 96				per_gb: CONFIG[:sims][:per_gb].merge(CAD: 699)
 97			)
 98		)
 99		limits = MonthlyDataLimit.for_currency(:CAD, config)
100
101		assert_equal 35, limits[:step]
102		assert_equal 350, limits[:max]
103	end
104end