require File.expand_path("../../test_helper", __FILE__)

module Stripe
  class FileUploadTest < Test::Unit::TestCase
    # Note that these tests are written different from others because we
    # don't have anything on the uploads service in our OpenAPI spec. This is
    # something that should be looked into at some point. We may need to ship
    # a separate spec for it though, so it's high effort with low reward for
    # the time being.
    FIXTURE = {
      id: "file_123",
      object: "file_upload",
    }.freeze

    should "be listable" do
      stub_request(:get, "#{Stripe.uploads_base}/v1/files")
        .to_return(body: JSON.generate(data: [FIXTURE],
                                       object: "list",
                                       resource_url: "/v1/files"))

      files = Stripe::FileUpload.list
      assert files.data.is_a?(Array)
      assert files.data[0].is_a?(Stripe::FileUpload)
    end

    should "be retrievable" do
      stub_request(:get, "#{Stripe.uploads_base}/v1/files/file_123")
        .to_return(body: JSON.generate(FIXTURE))

      file = Stripe::FileUpload.retrieve("file_123")
      assert file.is_a?(Stripe::FileUpload)
    end

    should "be creatable" do
      stub_request(:post, "#{Stripe.uploads_base}/v1/files")
        .with(headers: {
          "Content-Type" => /\A#{Faraday::Request::Multipart.mime_type}/,
        }) do |request|
        request.body =~ /FileUploadTest/
      end.to_return(body: JSON.generate(FIXTURE))

      file = Stripe::FileUpload.create(
        purpose: "dispute_evidence",
        file: File.new(__FILE__)
      )
      assert file.is_a?(Stripe::FileUpload)
    end

    should "be creatable with Faraday::UploadIO" do
      stub_request(:post, "#{Stripe.uploads_base}/v1/files")
        .with(headers: {
          "Content-Type" => /\A#{Faraday::Request::Multipart.mime_type}/,
        }) do |request|
        request.body =~ /FileUploadTest/
      end.to_return(body: JSON.generate(FIXTURE))

      file = Stripe::FileUpload.create(
        purpose: "dispute_evidence",
        file: Faraday::UploadIO.new(File.new(__FILE__), nil)
      )
      assert file.is_a?(Stripe::FileUpload)
    end
  end
end