module Heroku::API::Mock

Constants

APP_NOT_FOUND
STACKS
USER_NOT_FOUND

Public Class Methods

add_mock_app_addon(mock_data, app, addon) click to toggle source
# File lib/heroku/api/mock.rb, line 43
def self.add_mock_app_addon(mock_data, app, addon)
  addon_data = get_mock_addon(mock_data, addon)
  mock_data[:addons][app] << addon_data.reject {|key, value| !['attachable', 'beta', 'configured', 'consumes_dyno_hours', 'description', 'group_description', 'name', 'plan_description', 'price', 'slug', 'state', 'terms_of_service', 'url'].include?(key)}
  add_mock_release(mock_data, app, {'descr' => "Add-on add #{addon_data['name']}"})
end
add_mock_release(mock_data, app, release_data) click to toggle source
# File lib/heroku/api/mock.rb, line 49
def self.add_mock_release(mock_data, app, release_data)
  env = if get_mock_app(mock_data, app)['stack'] == 'cedar'
    {
      'BUNDLE_WITHOUT'      => 'development:test',
      'DATABASE_URL'        => 'postgres://username:password@ec2-123-123-123-123.compute-1.amazonaws.com/username',
      'LANG'                => 'en_US.UTF-8',
      'RACK_ENV'            => 'production'
    }
  else
    {}
  end
  version = mock_data[:releases][app].map {|release| release['name'][1..-1].to_i}.max || 0
  mock_data[:releases][app] << {
    'addons'      => mock_data[:addons][app].map {|addon| addon['name']},
    'commit'      => nil,
    'created_at'  => timestamp,
    'descr'       => "",
    'env'         => env,
    'name'        => "v#{version + 1}",
    'pstable'     => { 'web' => '' },
    'user'        => 'email@example.com'
  }.merge(release_data)
end
get_mock_addon(mock_data, addon) click to toggle source
# File lib/heroku/api/mock.rb, line 73
def self.get_mock_addon(mock_data, addon)
  @addons ||= begin
    data = File.read("#{File.dirname(__FILE__)}/mock/cache/get_addons.json")
    MultiJson.load(data)
  end
  @addons.detect {|addon_data| addon_data['name'] == addon}
end
get_mock_addon_price(mock_data, addon) click to toggle source
# File lib/heroku/api/mock.rb, line 81
def self.get_mock_addon_price(mock_data, addon)
  addon_data = get_mock_addon(mock_data, addon)
  price_cents = addon_data['price_cents'] || 0
  price = format("$%d/mo", price_cents / 100)
  if price == '$0/mo'
    price = 'free'
  end
  price
end
get_mock_app(mock_data, app) click to toggle source
# File lib/heroku/api/mock.rb, line 91
def self.get_mock_app(mock_data, app)
  mock_data[:apps].detect {|app_data| app_data['name'] == app}
end
get_mock_app_addon(mock_data, app, addon) click to toggle source
# File lib/heroku/api/mock.rb, line 95
def self.get_mock_app_addon(mock_data, app, addon)
  mock_data[:addons][app].detect {|addon_data| addon_data['name'] == addon}
end
get_mock_app_domain(mock_data, app, domain) click to toggle source
# File lib/heroku/api/mock.rb, line 99
def self.get_mock_app_domain(mock_data, app, domain)
  mock_data[:domains][app].detect {|domain_data| domain_data['domain'] == domain}
end
get_mock_collaborator(mock_data, app, email) click to toggle source
# File lib/heroku/api/mock.rb, line 103
def self.get_mock_collaborator(mock_data, app, email)
  mock_data[:collaborators][app].detect {|collaborator_data| collaborator_data['email'] == email}
end
get_mock_feature(mock_data, feature) click to toggle source
# File lib/heroku/api/mock.rb, line 107
def self.get_mock_feature(mock_data, feature)
  @features ||= begin
    data = File.read("#{File.dirname(__FILE__)}/mock/cache/get_features.json")
    MultiJson.load(data)
  end
  @features.detect {|feature_data| feature_data['name'] == feature}
end
get_mock_key(mock_data, key) click to toggle source
# File lib/heroku/api/mock.rb, line 115
def self.get_mock_key(mock_data, key)
  mock_data[:keys].detect {|key_data| %r{ #{Regexp.escape(key)}$}.match(key_data['contents'])}
end
get_mock_processes(mock_data, app) click to toggle source
# File lib/heroku/api/mock.rb, line 119
def self.get_mock_processes(mock_data, app)
  mock_data[:ps][app].map do |ps|

    elapsed = Time.now.to_i - Time.parse(ps['transitioned_at']).to_i
    ps['elapsed'] = elapsed

    pretty_elapsed = if elapsed < 60
      "#{elapsed}s"
    elsif elapsed < (60 * 60)
      "#{elapsed / 60}m"
    else
      "#{elapsed / 60 / 60}h"
    end
    ps['pretty_state'] = "#{ps['state']} for #{pretty_elapsed}"

    ps
  end
end
parse_stub_params(params) click to toggle source
# File lib/heroku/api/mock.rb, line 138
def self.parse_stub_params(params)
  mock_data = nil

  if params[:headers].has_key?('Authorization')
    api_key = Base64.decode64(params[:headers]['Authorization']).split(':').last

    parsed = params.dup
    begin # try to JSON decode
      parsed[:body] &&= MultiJson.load(parsed[:body])
    rescue # else leave as is
    end
    mock_data = @mock_data[api_key]
  end

  [parsed, mock_data]
end
remove_mock_app_addon(mock_data, app, addon) click to toggle source
# File lib/heroku/api/mock.rb, line 155
def self.remove_mock_app_addon(mock_data, app, addon)
  addon_data = mock_data[:addons][app].detect {|addon_data| addon_data['name'] == addon}
  mock_data[:addons][app].delete(addon_data)
  add_mock_release(mock_data, app, {'descr' => "Add-on remove #{addon_data['name']}"})
end
timestamp() click to toggle source
# File lib/heroku/api/mock.rb, line 173
def self.timestamp
  Time.now.strftime("%G/%m/%d %H:%M:%S %z")
end
unescape(string) click to toggle source
# File lib/heroku/api/mock.rb, line 161
def self.unescape(string)
  CGI.unescape(string)
end
with_mock_app(mock_data, app) { |app_data| ... } click to toggle source
# File lib/heroku/api/mock.rb, line 165
def self.with_mock_app(mock_data, app, &block)
  if app_data = get_mock_app(mock_data, app)
    yield(app_data)
  else
    APP_NOT_FOUND
  end
end