module Soaspec # Accessors specific to REST handler module RestAccessors # Defines method 'base_url_value' containing base URL used in REST requests # @param [String] url Base Url to use in REST requests. Suburl is appended to this def base_url(url) define_method('base_url_value') do url end end # Will create access_token method based on passed parameters def oauth2(params)# client_id: nil, client_secret: nil, token_url: nil, username: nil, password: nil, security_token: nil) define_method('oauth_response') do params[:username] = api_username || ERB.new(params[:username]).result(binding) if params[:username] params[:security_token] = ERB.new(params[:security_token]).result(binding) if params[:security_token] params[:token_url] = ERB.new(params[:token_url]).result(binding) if params[:token_url] params[:password] = ERB.new(params[:password]).result(binding) if params[:password] payload = if params[:password] && params[:username] { grant_type: 'password', client_id: params[:client_id], client_secret: params[:client_secret], username: params[:username], password: params[:security_token] ? (params[:password] + params[:security_token]) : params[:password], multipart: true } else { grant_type: 'client_credentials', client_id: params[:client_id], client_secret: params[:client_secret] } end retry_count = 0 begin Soaspec::SpecLogger.add_to 'request_params: ' + payload.to_s response = RestClient.post(params[:token_url], payload, cache_control: 'no_cache', verify_ssl: false) rescue RestClient::Exception => e Soaspec::SpecLogger.add_to("oauth_error: #{e.message}") Soaspec::SpecLogger.add_to("oauth_error: #{e.response}") retry_count += 1 retry if retry_count < 3 raise e end Soaspec::SpecLogger.add_to("response_headers: #{response.headers}") Soaspec::SpecLogger.add_to("response_body: #{response.body}") JSON.parse(response) end define_method('access_token') do oauth_response['access_token'] end define_method('instance_url') do oauth_response['instance_url'] end end # Pass path to YAML file containing OAuth2 parameters # @param [String] path_to_filename Will have Soaspec.credentials_folder appended to it if set def oauth2_file(path_to_filename) full_path = Soaspec.credentials_folder ? File.join(Soaspec.credentials_folder, path_to_filename + '.yml') : path_to_filename + '.yml' file_hash = YAML.load_file(full_path) raise 'File at ' + full_path + ' is not a hash ' unless file_hash.is_a? Hash oauth_hash = file_hash.transform_keys_to_symbols oauth2 **oauth_hash end # @param [Hash] headers Hash of REST headers used in RestClient def headers(headers) define_method('rest_client_headers') do headers end end # Convert each key from snake_case to PascalCase def pascal_keys(set) define_method('pascal_keys?') do set end end end end