# frozen_string_literal: true

require "spec_helper"

describe Doorkeeper::OAuth::TokenResponse do
  subject { described_class.new(double.as_null_object) }

  it "includes access token response headers" do
    headers = subject.headers
    expect(headers.fetch("Cache-Control")).to eq("no-store")
    expect(headers.fetch("Pragma")).to eq("no-cache")
  end

  it "status is ok" do
    expect(subject.status).to eq(:ok)
  end

  describe ".body" do
    let(:access_token) do
      double :access_token,
             plaintext_token: "some-token",
             expires_in: "3600",
             expires_in_seconds: "300",
             scopes_string: "two scopes",
             plaintext_refresh_token: "some-refresh-token",
             token_type: "bearer",
             created_at: 0
    end

    subject { described_class.new(access_token).body }

    it "includes :access_token" do
      expect(subject["access_token"]).to eq("some-token")
    end

    it "includes :token_type" do
      expect(subject["token_type"]).to eq("bearer")
    end

    # expires_in_seconds is returned as `expires_in` in order to match
    # the OAuth spec (section 4.2.2)
    it "includes :expires_in" do
      expect(subject["expires_in"]).to eq("300")
    end

    it "includes :scope" do
      expect(subject["scope"]).to eq("two scopes")
    end

    it "includes :refresh_token" do
      expect(subject["refresh_token"]).to eq("some-refresh-token")
    end

    it "includes :created_at" do
      expect(subject["created_at"]).to eq(0)
    end
  end

  describe ".body filters out empty values" do
    let(:access_token) do
      double :access_token,
             plaintext_token: "some-token",
             expires_in_seconds: "",
             scopes_string: "",
             plaintext_refresh_token: "",
             token_type: "bearer",
             created_at: 0
    end

    subject { described_class.new(access_token).body }

    it "includes :expires_in" do
      expect(subject["expires_in"]).to be_nil
    end

    it "includes :scope" do
      expect(subject["scope"]).to be_nil
    end

    it "includes :refresh_token" do
      expect(subject["refresh_token"]).to be_nil
    end
  end
end
