# frozen_string_literal: true

module Requests
  module ResponseBody
    def test_http_response_copy_to_file
      file = Tempfile.new(%w[cat .jpeg])
      uri = build_uri("/image")
      response = HTTPX.get(uri, headers: { "accept" => "image/jpeg" })
      verify_status(response, 200)
      verify_header(response.headers, "content-type", "image/jpeg")
      response.copy_to(file)
      verify_body_length(response)
      content_length = response.headers["content-length"].to_i
      assert file.size == content_length, "file should contain the content of response"
    ensure
      if file
        file.close
        file.unlink
      end
    end

    def test_http_response_copy_to_io
      io = StringIO.new
      uri = build_uri("/image")
      response = HTTPX.get(uri, headers: { "accept" => "image/jpeg" })
      verify_status(response, 200)
      verify_header(response.headers, "content-type", "image/jpeg")
      response.copy_to(io)
      content_length = response.headers["content-length"].to_i
      assert io.size == content_length, "file should contain the content of response"
    ensure
      io.close if io
    end

    def test_http_response_buffer_to_custom
      uri = build_uri("/")
      custom_body = Class.new(HTTPX::Response::Body) do
        attr_reader :file

        def initialize(_response, _opts)
          super
          @file = Tempfile.new("httpx-test")
        end

        def write(data)
          @file << data
        end

        def close
          return unless @file

          @file.close
          @file.unlink
        end
      end

      response = HTTPX.with(response_body_class: custom_body).get(uri)
      verify_status(response, 200)
      assert response.body.is_a?(custom_body), "body should be from custom type"
      file = response.body.file
      file.rewind
      content_length = response.headers["content-length"].to_i
      assert file.size == content_length, "didn't buffer the whole body"
    ensure
      response.close if response
    end
  end
end
