# frozen_string_literal: true

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

def panic(e)
	$panic = e
end

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

	def test_disco_info_get_for_user_returns_user_caps
		property_of {
			DiscoInfoIQ
				.new(REDIS)
				.target_node { nanpa_phone }
				.generate
		}.check { |_metadata, example|
			process_stanza(example['stanza'])

			assert_equal 1, written.length
			reply = written.shift

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

			ns = 'http://jabber.org/protocol/disco#info'
			ids = reply.query.find('.//ns:identity', ns: ns)
			assert_equal 1, ids.length
			assert_equal 'client', ids.first[:category]
			assert_equal 'sms', ids.first[:type]

			feats = reply.query.find('.//ns:feature', ns: ns).map { |f| f[:var] }
			assert_includes feats, 'urn:xmpp:receipts'
		}
	end
	em :test_disco_info_get_for_user_returns_user_caps

	def test_disco_info_get_for_gateway_returns_gateway_identity
		property_of {
			DiscoInfoIQ
				.new(REDIS)
				.target_node { nil }
				.generate
		}.check { |_metadata, example|
			process_stanza(example['stanza'])

			assert_equal 1, written.length
			reply = written.shift

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

			ns = 'http://jabber.org/protocol/disco#info'
			ids = reply.query.find('.//ns:identity', ns: ns)
			gateway_id = ids.find { |i| i[:category] == 'gateway' }
			assert gateway_id, 'Should include gateway identity'
			assert_equal 'sms', gateway_id[:type]

			feats = reply.query.find('.//ns:feature', ns: ns).map { |f| f[:var] }
			assert_includes feats, 'http://jabber.org/protocol/disco#info'
			assert_includes feats, 'jabber:iq:register'
			assert_includes feats, 'http://jabber.org/protocol/commands'
		}
	end
	em :test_disco_info_get_for_gateway_returns_gateway_identity

	def test_disco_info_non_get_produces_no_output
		property_of {
			DiscoInfoIQ
				.new(REDIS)
				.stanza { |target_node, jid|
					iq = Blather::Stanza::DiscoInfo.new(choose(:set, :result))
					iq.to = target_node ? "#{target_node}@component" : "component"
					iq.from = jid
					iq
				}
				.generate
		}.check { |_metadata, example|
			process_stanza(example['stanza'])

			assert_empty written
		}
	end
	em :test_disco_info_non_get_produces_no_output
end
