# frozen_string_literal: true

require "em-hiredis"
require "test_helper"
require "btc_sell_prices"

class BCHSellPricesTest < Minitest::Test
	def setup
		@redis = Minitest::Mock.new
		@bull = Minitest::Mock.new
		@simple_swap = Minitest::Mock.new
		@subject = BCHSellPrices.new(
			@redis, "", simple_swap: @simple_swap, bull: @bull
		)
	end

	def test_cad
		@bull.expect(
			:fetch_btc_cad,
			EMPromise.resolve(BigDecimal("100"))
		)
		@simple_swap.expect(
			:fetch_rate,
			EMPromise.resolve(BigDecimal("20")),
			["btc"]
		)
		assert_equal BigDecimal("5"), @subject.cad.sync
		assert_mock @bull
		assert_mock @simple_swap
	end
	em :test_cad

	def test_cad_raises_on_zero_bch_rate
		@bull.expect(
			:fetch_btc_cad,
			EMPromise.resolve(BigDecimal("100"))
		)
		@simple_swap.expect(
			:fetch_rate,
			EMPromise.resolve(BigDecimal("0")),
			["btc"]
		)

		error = assert_raises(CryptoSellPrices::PriceError) { @subject.cad.sync }
		assert_equal "SimpleSwap BTC to BCH rate was not positive", error.message
		assert_mock @bull
		assert_mock @simple_swap
	end
	em :test_cad_raises_on_zero_bch_rate

	def test_usd
		@bull.expect(
			:fetch_btc_cad,
			EMPromise.resolve(BigDecimal("100"))
		)
		@simple_swap.expect(
			:fetch_rate,
			EMPromise.resolve(BigDecimal("20")),
			["btc"]
		)
		@redis.expect(:get, EMPromise.resolve("0.5"), ["cad_to_usd"])
		assert_equal BigDecimal("2.5"), @subject.usd.sync
		assert_mock @bull
		assert_mock @simple_swap
		assert_mock @redis
	end
	em :test_usd
end
