shared_context 'valid token', token: :valid do
  let(:token_string) { '1A2B3C4D' }

  let :token do
    double(Doorkeeper::AccessToken,
           accessible?: true, includes_scope?: true, acceptable?: true,
           previous_refresh_token: "", revoke_previous_refresh_token!: true)
  end

  before :each do
    allow(
      Doorkeeper::AccessToken
    ).to receive(:by_token).with(token_string).and_return(token)
  end
end

shared_context 'invalid token', token: :invalid do
  let(:token_string) { '1A2B3C4D' }

  let :token do
    double(Doorkeeper::AccessToken,
           accessible?: false, revoked?: false, expired?: false,
           includes_scope?: false, acceptable?: false,
           previous_refresh_token: "", revoke_previous_refresh_token!: true)
  end

  before :each do
    allow(
      Doorkeeper::AccessToken
    ).to receive(:by_token).with(token_string).and_return(token)
  end
end

shared_context 'authenticated resource owner' do
  before do
    user = double(:resource, id: 1)
    allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { user } }
  end
end

shared_context 'not authenticated resource owner' do
  before do
    allow(Doorkeeper.configuration).to receive(:authenticate_resource_owner) { proc { redirect_to '/' } }
  end
end

shared_context 'valid authorization request' do
  let :authorization do
    double(:authorization, valid?: true, authorize: true, success_redirect_uri: 'http://something.com/cb?code=token')
  end

  before do
    allow(controller).to receive(:authorization) { authorization }
  end
end

shared_context 'invalid authorization request' do
  let :authorization do
    double(:authorization, valid?: false, authorize: false, redirect_on_error?: false)
  end

  before do
    allow(controller).to receive(:authorization) { authorization }
  end
end

shared_context 'expired token', token: :expired do
  let :token_string do
    '1A2B3C4DEXP'
  end

  let :token do
    double(Doorkeeper::AccessToken,
           accessible?: false, revoked?: false, expired?: true,
           includes_scope?: false, acceptable?: false,
           previous_refresh_token: "", revoke_previous_refresh_token!: true)
  end

  before :each do
    allow(
      Doorkeeper::AccessToken
    ).to receive(:by_token).with(token_string).and_return(token)
  end
end

shared_context 'revoked token', token: :revoked do
  let :token_string do
    '1A2B3C4DREV'
  end

  let :token do
    double(Doorkeeper::AccessToken,
           accessible?: false, revoked?: true, expired?: false,
           includes_scope?: false, acceptable?: false,
           previous_refresh_token: "", revoke_previous_refresh_token!: true)
  end

  before :each do
    allow(
      Doorkeeper::AccessToken
    ).to receive(:by_token).with(token_string).and_return(token)
  end
end

shared_context 'forbidden token', token: :forbidden do
  let :token_string do
    '1A2B3C4DFORB'
  end

  let :token do
    double(Doorkeeper::AccessToken,
           accessible?: true, includes_scope?: true, acceptable?: false,
           previous_refresh_token: "", revoke_previous_refresh_token!: true)
  end

  before :each do
    allow(
      Doorkeeper::AccessToken
    ).to receive(:by_token).with(token_string).and_return(token)
  end
end