minifast/dumbwaiter

View on GitHub
lib/dumbwaiter/mock.rb

Summary

Maintainability
A
35 mins
Test Coverage
require "ostruct"
require "faker"

class Dumbwaiter::Mock
  attr_reader :stacks, :deployments, :apps, :layers, :instances, :user_profiles

  class HashWithIndifferentAccess < Hash
    include Hashie::Extensions::MergeInitializer
    include Hashie::Extensions::IndifferentAccess
  end

  def opsworks; self; end
  def describe_stacks(*_); OpenStruct.new(stacks: stacks); end
  def describe_deployments(*_); OpenStruct.new(deployments: deployments); end
  def describe_apps(*_); OpenStruct.new(apps: apps); end
  def describe_layers(*_); OpenStruct.new(layers: layers); end
  def describe_instances(*_); OpenStruct.new(instances: instances); end
  def describe_user_profiles(*_); OpenStruct.new(user_profiles: user_profiles); end

  def clear
    @stacks = []
    @deployments = []
    @apps = []
    @layers = []
    @instances = []
    @user_profiles = []
  end

  def initialize
    clear
  end

  def create_stack(params = {})
    params[:name] ||= Faker::Name.first_name
    params[:attributes] ||= {}
    params[:attributes]["Color"] ||= make_color
    stack = OpenStruct.new(params.merge(stack_id: make_id))
    stacks << stack
    stack
  end

  def create_app(params = {})
    params[:stack_id] ||= create_stack.stack_id
    params[:name] ||= Faker::Name.last_name
    params[:shortname] ||= Faker::Name.first_name.downcase
    params[:app_source] = Hashie::Mash.new(params.fetch(:app_source, {}))
    params[:app_source][:url] ||= Faker::Internet.url
    params[:app_source][:revision] = params[:app_source].fetch(:revision, make_revision)
    app = OpenStruct.new(params.merge(app_id: make_id))
    apps << app
    app
  end

  def create_layer(params = {})
    params[:stack_id] ||= create_stack.stack_id
    params[:name] ||= Faker::Name.last_name
    params[:shortname] ||= Faker::Name.first_name.downcase
    params[:custom_recipes] = params[:custom_recipes] || {}
    params[:custom_recipes] = {setup: [], configure: [], deploy: [], undeploy: [], shutdown:[]}.merge(params[:custom_recipes])
    params[:type] ||= %w[lb web php-app rails-app nodejs-app memcached db-master monitoring-master custom].sample
    layer = OpenStruct.new(params.merge(layer_id: make_id))
    layers << layer
    layer
  end

  def create_deployment(params = {})
    params[:stack_id] ||= create_stack.stack_id
    params[:app_id] ||= create_app.app_id
    params[:command] = Hashie::Mash.new(params.fetch(:command, {}))
    params[:command][:name] ||= %w[install_dependencies update_dependencies update_custom_cookbooks execute_recipes deploy rollback start stop restart undeploy].sample
    params[:custom_json] ||= "{}"
    params[:comment] ||= Faker::Company.bs
    params[:iam_user_arn] = params.fetch(:iam_user_arn, create_user_profile.iam_user_arn)
    params[:created_at] ||= Time.now.to_s
    params[:status] ||= %w[running failed successful].sample
    deployment = OpenStruct.new(params.merge(deployment_id: make_id))
    deployments << deployment
    deployment
  end

  def create_instance(params = {})
    params[:stack_id] ||= create_stack.stack_id
    params[:layer_id] ||= create_layer.layer_id
    instance = OpenStruct.new(params.merge(instance_id: make_id))
    instances << instance
    instance
  end

  def create_user_profile(params = {})
    params[:iam_user_arn] ||= Faker::Name.first_name.downcase
    params[:ssh_username] ||= Faker::Name.first_name.downcase
    params[:name] ||= Faker::Name.first_name.downcase
    user_profile = OpenStruct.new(params)
    user_profiles << user_profile
    user_profile
  end

  protected

  def make_revision
    "%06x" % (rand * 0xffffff)
  end

  def make_color
    "rgb(#{rand(255)},#{rand(255)},#{rand(255)})"
  end

  def make_id
    @id ||= 0
    @id += 1
    "taco-#{@id}"
  end
end