# frozen_string_literal: true

require "test_helper"
require "monthly_data_limit"

class MonthlyDataLimitTest < Minitest::Test
	def parse(limit)
		MonthlyDataLimit.parse(limit, step: 5, max: 50)
	end

	def test_accepts_multiple_of_five
		assert_equal 10, parse("10")
	end

	def test_accepts_zero
		assert_equal 0, parse("0")
	end

	def test_accepts_maximum
		assert_equal 50, parse("50")
	end

	def test_ignores_blank_form_field
		form = Struct.new(:value) do
			def field(*)
				self
			end
		end.new("")

		assert_nil MonthlyDataLimit.from_form(form, step: 5, max: 50)
	end

	def test_rejects_non_multiple_of_five
		error = assert_raises(RuntimeError) { parse("11") }

		assert_equal "Monthly data limit must be a multiple of 5", error.message
	end

	def test_rejects_non_multiple_of_currency_step
		error = assert_raises(RuntimeError) {
			MonthlyDataLimit.parse("10", step: 6, max: 60)
		}

		assert_equal "Monthly data limit must be a multiple of 6", error.message
	end

	def test_rejects_negative_values
		error = assert_raises(RuntimeError) { parse("-5") }

		assert_equal "Monthly data limit must be between 0 and 50", error.message
	end

	def test_rejects_values_above_maximum
		error = assert_raises(RuntimeError) { parse("55") }

		assert_equal "Monthly data limit must be between 0 and 50", error.message
	end

	def test_uses_sim_refill_price_for_step
		limits = MonthlyDataLimit.for_currency(:CAD, CONFIG)

		assert_equal 6, limits[:step]
		assert_equal 60, limits[:max]
	end

	def test_formats_refill_price_for_display
		assert_equal "$1.20 / GB", SIMPricing.per_gb_label(:CAD, CONFIG)
	end

	def test_formats_plan_price_for_display
		assert_equal(
			"$1.20 / GB + $1.20 / year",
			SIMPricing.plan_label(:CAD, CONFIG)
		)
	end

	def test_does_not_need_sim_pricing_without_sims
		assert_equal({}, MonthlyDataLimit.for_sims([], :CAD, CONFIG))
	end

	def test_uses_integer_dollars_for_fractional_refill_price
		config = CONFIG.merge(
			sims: CONFIG[:sims].merge(
				per_gb: CONFIG[:sims][:per_gb].merge(CAD: 125)
			)
		)
		limits = MonthlyDataLimit.for_currency(:CAD, config)

		assert_equal 6, limits[:step]
		assert_equal 60, limits[:max]
	end
end
