| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | # Copyright 2015, Google Inc.# All rights reserved.## Redistribution and use in source and binary forms, with or without# modification, are permitted provided that the following conditions are# met:##     * Redistributions of source code must retain the above copyright# notice, this list of conditions and the following disclaimer.#     * Redistributions in binary form must reproduce the above# copyright notice, this list of conditions and the following disclaimer# in the documentation and/or other materials provided with the# distribution.#     * Neither the name of Google Inc. nor the names of its# contributors may be used to endorse or promote products derived from# this software without specific prior written permission.## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.spec_dir = File.expand_path(File.join(File.dirname(__FILE__)))$LOAD_PATH.unshift(spec_dir)$LOAD_PATH.uniq!require 'faraday'require 'spec_helper'def build_json_response(payload)  [200,   { 'Content-Type' => 'application/json; charset=utf-8' },   MultiJson.dump(payload)]endWANTED_AUTH_KEY = :Authorizationshared_examples 'apply/apply! are OK' do  # tests that use these examples need to define  #  # @client which should be an auth client  #  # @make_auth_stubs, which should stub out the expected http behaviour of the  # auth client  describe '#fetch_access_token' do    it 'should set access_token to the fetched value' do      token = '1/abcdef1234567890'      stubs = make_auth_stubs with_access_token: token      c = Faraday.new do |b|        b.adapter(:test, stubs)      end      @client.fetch_access_token!(connection: c)      expect(@client.access_token).to eq(token)      stubs.verify_stubbed_calls    end  end  describe '#apply!' do    it 'should update the target hash with fetched access token' do      token = '1/abcdef1234567890'      stubs = make_auth_stubs with_access_token: token      c = Faraday.new do |b|        b.adapter(:test, stubs)      end      md = { foo: 'bar' }      @client.apply!(md, connection: c)      want = { :foo => 'bar', WANTED_AUTH_KEY => "Bearer: #{token}" }      expect(md).to eq(want)      stubs.verify_stubbed_calls    end  end  describe '#apply' do    it 'should not update the original hash with the access token' do      token = '1/abcdef1234567890'      stubs = make_auth_stubs with_access_token: token      c = Faraday.new do |b|        b.adapter(:test, stubs)      end      md = { foo: 'bar' }      @client.apply(md, connection: c)      want = { foo: 'bar' }      expect(md).to eq(want)      stubs.verify_stubbed_calls    end    it 'should add the token to the returned hash' do      token = '1/abcdef1234567890'      stubs = make_auth_stubs with_access_token: token      c = Faraday.new do |b|        b.adapter(:test, stubs)      end      md = { foo: 'bar' }      got = @client.apply(md, connection: c)      want = { :foo => 'bar', WANTED_AUTH_KEY => "Bearer: #{token}" }      expect(got).to eq(want)      stubs.verify_stubbed_calls    end    it 'should not fetch a new token if the current is not expired' do      token = '1/abcdef1234567890'      stubs = make_auth_stubs with_access_token: token      c = Faraday.new do |b|        b.adapter(:test, stubs)      end      n = 5 # arbitrary      n.times do |_t|        md = { foo: 'bar' }        got = @client.apply(md, connection: c)        want = { :foo => 'bar', WANTED_AUTH_KEY => "Bearer: #{token}" }        expect(got).to eq(want)      end      stubs.verify_stubbed_calls    end    it 'should fetch a new token if the current one is expired' do      token_1 = '1/abcdef1234567890'      token_2 = '2/abcdef1234567890'      [token_1, token_2].each do |t|        stubs = make_auth_stubs with_access_token: t        c = Faraday.new do |b|          b.adapter(:test, stubs)        end        md = { foo: 'bar' }        got = @client.apply(md, connection: c)        want = { :foo => 'bar', WANTED_AUTH_KEY => "Bearer: #{t}" }        expect(got).to eq(want)        stubs.verify_stubbed_calls        @client.expires_at -= 3601 # default is to expire in 1hr      end    end  endend
 |