Module: Sinatra::Async::Test::Methods

Includes:
Rack::Test::Methods
Defined in:
lib/sinatra/async/test.rb

Instance Method Summary collapse

Instance Method Details

#assert_asyncObject



68
69
70
# File 'lib/sinatra/async/test.rb', line 68

def assert_async
  assert last_response.async?, "response not asynchronous. expected a status of -1 got #{last_response.status}"
end

#async_closeObject

Simulate a user closing the connection before a response is sent.

Raises:

  • (ArgumentError)


73
74
75
76
# File 'lib/sinatra/async/test.rb', line 73

def async_close
  raise ArgumentError, 'please make a request first' unless last_request
  current_session.last_request.env['async.close'].succeed
end

#async_continueObject

Executes the pending asynchronous blocks, required for the aget/apost/etc blocks to run.



80
81
82
83
84
# File 'lib/sinatra/async/test.rb', line 80

def async_continue
  while b = app.options.async_schedules.shift
    b.call
  end
end

#build_rack_mock_sessionObject

XXX move me



64
65
66
# File 'lib/sinatra/async/test.rb', line 64

def build_rack_mock_session # XXX move me
  Sinatra::Async::Test::AsyncSession.new(app)
end

#em_async_continue(timeout = 10) ⇒ Object

Crank the eventmachine loop until a response is made, or timeout after a particular period, by default 10s. If the timeout is nil, no timeout will occur.



89
90
91
92
93
94
95
96
97
# File 'lib/sinatra/async/test.rb', line 89

def em_async_continue(timeout = 10)
  timed = false
  EM.run do
    async_continue
    em_hard_loop { EM.stop unless last_response.async? }
    EM.add_timer(timeout) { timed = true; EM.stop } if timeout
  end
  assert !timed, "asynchronous timeout after #{timeout} seconds"
end

#em_hard_loopObject

Uses EM.tick_loop or a periodic timer to check for changes



100
101
102
103
104
105
106
# File 'lib/sinatra/async/test.rb', line 100

def em_hard_loop
  if EM.respond_to?(:tick_loop)
    EM.tick_loop { yield }
  else
    EM.add_periodic_timer(0.0001) { yield }
  end
end