File: builder.rb

package info (click to toggle)
ruby-protocol-http 0.59.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 864 kB
  • sloc: ruby: 7,612; makefile: 4
file content (211 lines) | stat: -rw-r--r-- 5,519 bytes parent folder | download
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2019-2024, by Samuel Williams.

require "protocol/http/middleware"
require "protocol/http/middleware/builder"
require "tempfile"

describe Protocol::HTTP::Middleware::Builder do
	it "can make an app" do
		app = Protocol::HTTP::Middleware.build do
			run Protocol::HTTP::Middleware::HelloWorld
		end
		
		expect(app).to be_equal(Protocol::HTTP::Middleware::HelloWorld)
	end
	
	it "defaults to not found" do
		app = Protocol::HTTP::Middleware.build do
		end
		
		expect(app).to be_equal(Protocol::HTTP::Middleware::NotFound)
	end
	
	it "can instantiate middleware" do
		app = Protocol::HTTP::Middleware.build do
			use Protocol::HTTP::Middleware
		end
		
		expect(app).to be_a(Protocol::HTTP::Middleware)
	end
	
	it "provides the builder as an argument" do
		current_self = self
		
		app = Protocol::HTTP::Middleware.build do |builder|
			builder.use Protocol::HTTP::Middleware
			
			expect(self).to be_equal(current_self)
		end
		
		expect(app).to be_a(Protocol::HTTP::Middleware)
	end
	
	it "can initialize with custom default app" do
		builder = Protocol::HTTP::Middleware::Builder.new(Protocol::HTTP::Middleware::Okay)
		
		expect(builder.to_app).to be_equal(Protocol::HTTP::Middleware::Okay)
	end
	
	it "can build without block" do
		builder = Protocol::HTTP::Middleware::Builder.new
		result = builder.build
		
		expect(result).to be_equal(builder)
		expect(builder.to_app).to be_equal(Protocol::HTTP::Middleware::NotFound)
	end
	
	it "can build with zero-arity block using instance_exec" do
		builder = Protocol::HTTP::Middleware::Builder.new
		
		builder.build do
			use Protocol::HTTP::Middleware
		end
		
		expect(builder.to_app).to be_a(Protocol::HTTP::Middleware)
	end
	
	it "can use middleware with arguments" do
		middleware_class = Class.new(Protocol::HTTP::Middleware) do
			def initialize(app, argument1, argument2)
				super(app)
				@argument1 = argument1
				@argument2 = argument2
			end
			
			attr :argument1, :argument2
		end
		
		builder = Protocol::HTTP::Middleware::Builder.new(Protocol::HTTP::Middleware::Okay)
		builder.use(middleware_class, "test1", "test2")
		
		app = builder.to_app
		expect(app).to be_a(middleware_class)
		expect(app.argument1).to be == "test1"
		expect(app.argument2).to be == "test2"
	end
	
	it "can use middleware with options" do
		middleware_class = Class.new(Protocol::HTTP::Middleware) do
			def initialize(app, option1:, option2:)
				super(app)
				@option1 = option1
				@option2 = option2
			end
			
			attr :option1, :option2
		end
		
		builder = Protocol::HTTP::Middleware::Builder.new(Protocol::HTTP::Middleware::Okay)
		builder.use(middleware_class, option1: "value1", option2: "value2")
		
		app = builder.to_app
		expect(app).to be_a(middleware_class)
		expect(app.option1).to be == "value1"
		expect(app.option2).to be == "value2"
	end
	
	it "can use middleware with block" do
		middleware_class = Class.new(Protocol::HTTP::Middleware) do
			def initialize(app, &block)
				super(app)
				@block = block
			end
			
			attr :block
		end
		
		block_called = false
		builder = Protocol::HTTP::Middleware::Builder.new(Protocol::HTTP::Middleware::Okay)
		builder.use(middleware_class) do
			block_called = true
		end
		
		app = builder.to_app
		expect(app).to be_a(middleware_class)
		expect(app.block).to be_a(Proc)
		app.block.call
		expect(block_called).to be == true
	end
	
	it "can run to set default app" do
		builder = Protocol::HTTP::Middleware::Builder.new
		builder.run(Protocol::HTTP::Middleware::Okay)
		
		expect(builder.to_app).to be_equal(Protocol::HTTP::Middleware::Okay)
	end
	
	it "can chain multiple middleware" do
		middleware1 = Class.new(Protocol::HTTP::Middleware) do
			def initialize(app)
				super(app)
				@name = "middleware1"
			end
			
			attr :name
		end
		
		middleware2 = Class.new(Protocol::HTTP::Middleware) do
			def initialize(app)
				super(app)
				@name = "middleware2"
			end
			
			attr :name
		end
		
		builder = Protocol::HTTP::Middleware::Builder.new(Protocol::HTTP::Middleware::Okay)
		builder.use(middleware1)
		builder.use(middleware2)
		
		app = builder.to_app
		# Middleware are reversed, so first added becomes outermost
		expect(app).to be_a(middleware1)
		expect(app.delegate).to be_a(middleware2)
		expect(app.delegate.delegate).to be_equal(Protocol::HTTP::Middleware::Okay)
	end
	
	it "can convert to app directly" do
		builder = Protocol::HTTP::Middleware::Builder.new(Protocol::HTTP::Middleware::HelloWorld)
		
		app = builder.to_app
		expect(app).to be_equal(Protocol::HTTP::Middleware::HelloWorld)
	end
	
	it "can load middleware from file" do
		temp_file = Tempfile.new(["middleware", ".rb"])
		temp_file.write(<<~RUBY)
			use Protocol::HTTP::Middleware
			run Protocol::HTTP::Middleware::HelloWorld
		RUBY
		temp_file.close
		
		app = Protocol::HTTP::Middleware.load(temp_file.path)
		
		expect(app).to be_a(Protocol::HTTP::Middleware)
		expect(app.delegate).to be_equal(Protocol::HTTP::Middleware::HelloWorld)
		
	ensure
		temp_file&.unlink
	end
	
	it "can load middleware from file with block" do
		temp_file = Tempfile.new(["middleware", ".rb"])
		temp_file.write(<<~RUBY)
			use Protocol::HTTP::Middleware
		RUBY
		temp_file.close
		
		app = Protocol::HTTP::Middleware.load(temp_file.path) do
			run Protocol::HTTP::Middleware::HelloWorld
		end
		
		expect(app).to be_a(Protocol::HTTP::Middleware)
		expect(app.delegate).to be_equal(Protocol::HTTP::Middleware::HelloWorld)
		
	ensure
		temp_file&.unlink
	end
end