# frozen_string_literal: true

require "test_helper"

module MCP
  class ProgressTest < ActiveSupport::TestCase
    class MockTransport < Transport
      attr_reader :notifications

      def initialize(server)
        super
        @notifications = []
      end

      def send_notification(method, params = nil)
        @notifications << { method: method, params: params }
        true
      end

      def send_response(response); end
      def open; end
      def close; end
      def handle_request(request); end
    end

    setup do
      @server = Server.new(name: "test_server")
      @transport = MockTransport.new(@server)
      @session = ServerSession.new(server: @server, transport: @transport)
    end

    test "#report is a no-op when progress_token is nil" do
      progress = Progress.new(notification_target: @session, progress_token: nil)
      progress.report(50, total: 100, message: "halfway")

      assert_equal 0, @transport.notifications.size
    end

    test "#report is a no-op when notification_target is nil" do
      progress = Progress.new(notification_target: nil, progress_token: "token-1")
      progress.report(50, total: 100, message: "halfway")

      assert_equal 0, @transport.notifications.size
    end

    test "#report sends notification when progress_token is present" do
      progress = Progress.new(notification_target: @session, progress_token: "token-1")
      progress.report(50, total: 100, message: "halfway")

      assert_equal 1, @transport.notifications.size
      notification = @transport.notifications.first
      assert_equal Methods::NOTIFICATIONS_PROGRESS, notification[:method]
      assert_equal "token-1", notification[:params]["progressToken"]
      assert_equal 50, notification[:params]["progress"]
      assert_equal 100, notification[:params]["total"]
      assert_equal "halfway", notification[:params]["message"]
    end

    test "#report omits total and message when not provided" do
      progress = Progress.new(notification_target: @session, progress_token: "token-1")
      progress.report(50)

      assert_equal 1, @transport.notifications.size
      notification = @transport.notifications.first
      assert_equal "token-1", notification[:params]["progressToken"]
      assert_equal 50, notification[:params]["progress"]
      refute notification[:params].key?("total")
      refute notification[:params].key?("message")
    end
  end
end
