# frozen_string_literal: true

require "test_helper"
require_relative "../../sgx-bwmsgsv2"
require "rantly/minitest_extensions"
require_relative "generators/disco_items_iq"

def panic(e)
	$panic = e
end

class DiscoItemsPropertyTest < Minitest::Test
	def setup
		reset_stanzas!
		reset_redis!
	end

	def test_eligible_tn_shows_port_out_pin_command
		property_of {
			DiscoItemsIQ.new(REDIS).generate
		}.check { |_metadata, example|
			BandwidthTNOptions.stub(
				:tn_eligible_for_port_out_pin?,
				EMPromise.resolve(true)
			) do
				process_stanza(example['stanza'])
			end

			assert_equal 1, written.length
			reply = written.shift

			assert_equal example['jid'], reply.to.to_s

			ns = 'http://jabber.org/protocol/disco#items'
			items = reply.query.find('.//ns:item', ns: ns)
			assert_equal 1, items.length
			assert_equal 'set-port-out-pin', items.first[:node]
		}
	end
	em :test_eligible_tn_shows_port_out_pin_command

	def test_ineligible_tn_shows_no_commands
		property_of {
			DiscoItemsIQ.new(REDIS).generate
		}.check { |_metadata, example|
			BandwidthTNOptions.stub(
				:tn_eligible_for_port_out_pin?,
				EMPromise.resolve(false)
			) do
				process_stanza(example['stanza'])
			end

			assert_equal 1, written.length
			reply = written.shift

			ns = 'http://jabber.org/protocol/disco#items'
			items = reply.query.find('.//ns:item', ns: ns)
			assert_empty items
		}
	end
	em :test_ineligible_tn_shows_no_commands

	def test_unregistered_user_gets_error
		property_of {
			DiscoItemsIQ
				.new(REDIS)
				.redis_state { |_jid, _phone| @redis.reset! }
				.generate
		}.check { |_metadata, example|
			process_stanza(example['stanza'])

			assert_equal 1, written.length
			reply = written.shift
			assert_kind_of Blather::StanzaError, reply
			assert_equal :auth, reply.type
			assert_equal :registration_required, reply.name
		}
	end
	em :test_unregistered_user_gets_error
end
