|  | 
|  | 1 | +require 'core/spec_helper' | 
|  | 2 | + | 
|  | 3 | +RSpec.describe ZendeskAPI::Middleware::Request::ApiTokenImpersonate do | 
|  | 4 | +  let(:app) { ->(env) { env } } | 
|  | 5 | +  let(:middleware) { described_class.new(app) } | 
|  | 6 | +  let(:username) { 'impersonated_user' } | 
|  | 7 | +  let(:token) { 'abc123' } | 
|  | 8 | +  let(:original_username) { 'original_user/token' } | 
|  | 9 | +  let(:encoded_auth) { Base64.urlsafe_encode64("#{original_username}:#{token}") } | 
|  | 10 | +  let(:env) do | 
|  | 11 | +    { | 
|  | 12 | +      request_headers: { | 
|  | 13 | +        authorization: "Basic #{encoded_auth}" | 
|  | 14 | +      } | 
|  | 15 | +    } | 
|  | 16 | +  end | 
|  | 17 | + | 
|  | 18 | +  after { Thread.current[:zendesk_thread_local_username] = nil } | 
|  | 19 | + | 
|  | 20 | +  context 'when local_username is set and authorization is a valid API token' do | 
|  | 21 | +    it 'impersonates the user by modifying the Authorization header' do | 
|  | 22 | +      Thread.current[:zendesk_thread_local_username] = username | 
|  | 23 | +      result = middleware.call(env) | 
|  | 24 | +      new_auth = result[:request_headers][:authorization] | 
|  | 25 | +      decoded = Base64.urlsafe_decode64(new_auth.split.last) | 
|  | 26 | +      expect(decoded).to eq("#{username}/token:#{token}") | 
|  | 27 | +    end | 
|  | 28 | +  end | 
|  | 29 | + | 
|  | 30 | +  context 'when local_username is not set' do | 
|  | 31 | +    it 'does not modify the Authorization header' do | 
|  | 32 | +      result = middleware.call(env) | 
|  | 33 | +      expect(result[:request_headers][:authorization]).to eq(env[:request_headers][:authorization]) | 
|  | 34 | +    end | 
|  | 35 | +  end | 
|  | 36 | + | 
|  | 37 | +  context 'when authorization header is not Basic' do | 
|  | 38 | +    it 'does not modify the Authorization header' do | 
|  | 39 | +      Thread.current[:zendesk_thread_local_username] = username | 
|  | 40 | +      env[:request_headers][:authorization] = 'Bearer something' | 
|  | 41 | +      result = middleware.call(env) | 
|  | 42 | +      expect(result[:request_headers][:authorization]).to eq('Bearer something') | 
|  | 43 | +    end | 
|  | 44 | +  end | 
|  | 45 | + | 
|  | 46 | +  context 'when authorization does not contain /token:' do | 
|  | 47 | +    it 'raises an error' do | 
|  | 48 | +      Thread.current[:zendesk_thread_local_username] = username | 
|  | 49 | +      env[:request_headers][:authorization] = "Basic #{Base64.urlsafe_encode64('user:abc123')}" | 
|  | 50 | +      result = middleware.call(env) | 
|  | 51 | +      expect(result[:request_headers][:authorization]).to eq("Basic #{Base64.urlsafe_encode64('user:abc123')}") | 
|  | 52 | +    end | 
|  | 53 | +  end | 
|  | 54 | + | 
|  | 55 | +  context 'when authorization is not in valid format' do | 
|  | 56 | +    it 'raises an error' do | 
|  | 57 | +      Thread.current[:zendesk_thread_local_username] = username | 
|  | 58 | +      env[:request_headers][:authorization] = "Basic #{Base64.urlsafe_encode64('user/token:abc123:extra')}" | 
|  | 59 | +      result = middleware.call(env) | 
|  | 60 | +      expect(result[:request_headers][:authorization]).to eq("Basic #{Base64.urlsafe_encode64('user/token:abc123:extra')}") | 
|  | 61 | +    end | 
|  | 62 | +  end | 
|  | 63 | +end | 
0 commit comments