Sha256: abb02d77e5c526a6dfd0636d22bd2cf0ce847fd2d245417388c02ee3acff7bdd

Contents?: true

Size: 1.69 KB

Versions: 6

Compression:

Stored size: 1.69 KB

Contents

require 'socket'
require 'net/http'

# Adapted from code by Jon Leighton
# https://github.com/jonleighton/focused_controller/blob/ec7ccf1/test/acceptance/app_test.rb

class DummyApp

  def initialize(environment)
    raise ArgumentError, "Environment must be development or production" unless ["development", "production"].include?(environment.to_s)
    @environment = environment
  end

  attr_reader :environment

  def url
    "http://#{localhost}:#{port}"
  end

  def get(path)
    Net::HTTP.get(URI(url + path))
  end

  def within_app(&block)
    Dir.chdir(root, &block)
  end

  def start_server
    within_app do
      IO.popen("bundle exec rails s -e #{@environment} -p #{port} 2>&1") do |out|
        start   = Time.now
        started = false
        output  = ""
        timeout = 60.0

        while !started && !out.eof? && Time.now - start <= timeout
          output << read_output(out)
          sleep 0.1

          begin
            TCPSocket.new(localhost, port)
          rescue Errno::ECONNREFUSED
          else
            started = true
          end
        end

        raise "Server failed to start:\n#{output}" unless started

        yield

        Process.kill('KILL', out.pid)
      end
    end
  end

  private

  def root
    File.expand_path('../../dummy', __FILE__)
  end

  def localhost
    '127.0.0.1'
  end

  def port
    @port ||= begin
      server = TCPServer.new(localhost, 0)
      server.addr[1]
    ensure
      server.close if server
    end
  end

  def read_output(stream)
    read = IO.select([stream], [], [stream], 0.1)
    output = ""
    loop { output << stream.read_nonblock(1024) } if read
    output
  rescue Errno::EAGAIN, Errno::EWOULDBLOCK, EOFError
    output
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
draper-1.0.0.beta6 spec/support/dummy_app.rb
draper-1.0.0.beta5 spec/support/dummy_app.rb
draper-1.0.0.beta4 spec/support/dummy_app.rb
draper-1.0.0.beta3 spec/support/dummy_app.rb
draper-1.0.0.beta2 spec/support/dummy_app.rb
draper-1.0.0.beta1 spec/support/dummy_app.rb