# frozen_string_literal: true

require "test_helper"
require "command"

Command::COMMAND_MANAGER = Minitest::Mock.new

class CommandTest < Minitest::Test
	def test_cancel_finishes
		blather = Minitest::Mock.new
		iq1 = Blather::Stanza::Iq::Command.new
		iq1.from = "test@example.com"
		iq1.id = "test-id"
		iq1.sessionid = "session-id"

		# The library digests the sessionID I give it...
		session = iq1.sessionid

		iq2 = Blather::Stanza::Iq::Command.new
		iq2.from = "test@example.com"
		iq2.id = "cancel-id"
		iq2.sessionid = "session-id"
		iq2.action = :cancel

		Command::COMMAND_MANAGER.expect(
			:write,
			EMPromise.reject(iq2),
			[Matching.new do |iq|
				assert_equal "test-id", iq.id
				assert_equal session, iq.sessionid
			end]
		)

		blather.expect(
			:<<,
			nil,
			[Matching.new do |iq|
				assert "canceled", iq.status
				assert_equal "cancel-id", iq.id
				assert_equal session, iq.sessionid
			end]
		)

		execute_command(iq1, blather: blather) { |cmd|
			cmd.reply.then do
				raise "Should have cancelled"
			end
		}.then do
			assert_mock blather
			assert_mock Command::COMMAND_MANAGER
		end
	end
	em :test_cancel_finishes
end
