rack.git  about / heads / tags
a modular Ruby webserver interface
blob 8c079361cff197058f821a85556f7de23a041639 3643 bytes (raw)
$ git show no-unicorn:test/spec_events.rb	# shows this blob on the CLI

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 
# frozen_string_literal: true

require 'helper'
require 'rack/events'

module Rack
  class TestEvents < Rack::TestCase
    class EventMiddleware
      attr_reader :events

      def initialize events
        @events = events
      end

      def on_start req, res
        events << [self, __method__]
      end

      def on_commit req, res
        events << [self, __method__]
      end

      def on_send req, res
        events << [self, __method__]
      end

      def on_finish req, res
        events << [self, __method__]
      end

      def on_error req, res, e
        events << [self, __method__]
      end
    end

    def test_events_fire
      events = []
      ret = [200, {}, []]
      app = lambda { |env| events << [app, :call]; ret }
      se = EventMiddleware.new events
      e = Events.new app, [se]
      triple = e.call({})
      response_body = []
      triple[2].each { |x| response_body << x }
      triple[2].close
      triple[2] = response_body
      assert_equal ret, triple
      assert_equal [[se, :on_start],
                    [app, :call],
                    [se, :on_commit],
                    [se, :on_send],
                    [se, :on_finish],
      ], events
    end

    def test_send_and_finish_are_not_run_until_body_is_sent
      events = []
      ret = [200, {}, []]
      app = lambda { |env| events << [app, :call]; ret }
      se = EventMiddleware.new events
      e = Events.new app, [se]
      triple = e.call({})
      assert_equal [[se, :on_start],
                    [app, :call],
                    [se, :on_commit],
      ], events
    end

    def test_send_is_called_on_each
      events = []
      ret = [200, {}, []]
      app = lambda { |env| events << [app, :call]; ret }
      se = EventMiddleware.new events
      e = Events.new app, [se]
      triple = e.call({})
      triple[2].each { |x| }
      assert_equal [[se, :on_start],
                    [app, :call],
                    [se, :on_commit],
                    [se, :on_send],
      ], events
    end

    def test_finish_is_called_on_close
      events = []
      ret = [200, {}, []]
      app = lambda { |env| events << [app, :call]; ret }
      se = EventMiddleware.new events
      e = Events.new app, [se]
      triple = e.call({})
      triple[2].each { |x| }
      triple[2].close
      assert_equal [[se, :on_start],
                    [app, :call],
                    [se, :on_commit],
                    [se, :on_send],
                    [se, :on_finish],
      ], events
    end

    def test_finish_is_called_in_reverse_order
      events = []
      ret = [200, {}, []]
      app = lambda { |env| events << [app, :call]; ret }
      se1 = EventMiddleware.new events
      se2 = EventMiddleware.new events
      se3 = EventMiddleware.new events

      e = Events.new app, [se1, se2, se3]
      triple = e.call({})
      triple[2].each { |x| }
      triple[2].close

      groups = events.group_by { |x| x.last }
      assert_equal groups[:on_start].map(&:first), groups[:on_finish].map(&:first).reverse
      assert_equal groups[:on_commit].map(&:first), groups[:on_finish].map(&:first)
      assert_equal groups[:on_send].map(&:first), groups[:on_finish].map(&:first)
    end

    def test_finish_is_called_if_there_is_an_exception
      events = []
      ret = [200, {}, []]
      app = lambda { |env| raise }
      se = EventMiddleware.new events
      e = Events.new app, [se]
      assert_raises(RuntimeError) do
        e.call({})
      end
      assert_equal [[se, :on_start],
                    [se, :on_error],
                    [se, :on_finish],
      ], events
    end
  end
end

git clone https://yhbt.net/rack.git