mirage 3.0.0.alpha.11 → 3.0.0.alpha.12
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +1 -1
- data/VERSION +1 -1
- data/features/.nav +19 -0
- data/features/client/clear.feature +15 -23
- data/features/client/configure.feature +24 -28
- data/features/client/preview_responses.feature +4 -4
- data/features/client/put.feature +49 -62
- data/features/client/requests.feature +1 -1
- data/features/client/running.feature +2 -2
- data/features/client/save_and_revert.feature +5 -8
- data/features/client/start.feature +3 -3
- data/features/client/stop.feature +8 -8
- data/features/commandline_interface/help.feature +17 -0
- data/features/commandline_interface/readme.md +1 -0
- data/features/{server/commandline_interface → commandline_interface}/start.feature +4 -4
- data/features/{server/commandline_interface → commandline_interface}/stop.feature +22 -24
- data/features/{server/logging.feature → logging.feature} +2 -2
- data/features/{server/prime.feature → prime.feature} +4 -3
- data/features/readme.md +7 -0
- data/features/requests/delete.feature +48 -0
- data/features/{server/requests → requests}/get.feature +6 -5
- data/features/{server/save_and_revert.feature → save_and_revert.feature} +5 -5
- data/features/step_definitions/my_steps.rb +47 -12
- data/features/support/command_line.rb +1 -1
- data/features/templates/delete.feature +45 -0
- data/features/{server/templates → templates}/get.feature +9 -5
- data/features/templates/put.feature +77 -0
- data/features/{server/templates/put → templates}/put_with_substitutions.feature +4 -3
- data/features/templates/readme.md +7 -0
- data/features/{server/templates/put → templates}/required_content.feature +27 -35
- data/features/{server/web_user_interface.feature → web_user_interface.feature} +8 -7
- data/lib/mirage/client/cli_bridge.rb +1 -1
- data/lib/mirage/client/client.rb +16 -3
- data/lib/mirage/client/error.rb +1 -1
- data/lib/mirage/client/runner.rb +1 -1
- data/lib/mirage/client/template.rb +4 -2
- data/lib/mirage/client/template/configuration.rb +10 -0
- data/lib/mirage/client/template/model/instance_methods.rb +3 -4
- data/lib/mirage/client/templates.rb +1 -1
- data/mirage.gemspec +21 -17
- data/mirage_server.rb +1 -1
- data/server/mock_response.rb +18 -17
- data/server/server.rb +15 -15
- data/spec/client/client_spec.rb +44 -10
- data/spec/client/template/model/common_methods_spec.rb +1 -1
- data/spec/client/template/model/instance_methods_spec.rb +2 -2
- data/spec/client/template_spec.rb +11 -4
- data/spec/client/templates_spec.rb +10 -4
- data/spec/server/server_spec.rb +23 -23
- data/test.rb +2 -19
- metadata +22 -18
- data/features/server/commandline_interface/help.feature +0 -16
- data/features/server/requests/delete.feature +0 -47
- data/features/server/templates/delete.feature +0 -44
- data/features/server/templates/put/put.feature +0 -62
@@ -93,6 +93,8 @@ describe 'templates' do
|
|
93
93
|
Class.new do
|
94
94
|
extend Template::Model
|
95
95
|
endpoint endpoint
|
96
|
+
def create
|
97
|
+
end
|
96
98
|
end
|
97
99
|
end
|
98
100
|
before :each do
|
@@ -101,7 +103,14 @@ describe 'templates' do
|
|
101
103
|
end
|
102
104
|
it 'should take a model as a parameter' do
|
103
105
|
template = model_class.new
|
104
|
-
template
|
106
|
+
@templates.put template
|
107
|
+
template.endpoint.should == "#{@base_url}/templates/#{endpoint}"
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should prepend base url to the endpoint unless it is set already' do
|
111
|
+
template = model_class.new
|
112
|
+
@templates.put template
|
113
|
+
template.endpoint.should == "#{@base_url}/templates/#{endpoint}"
|
105
114
|
@templates.put template
|
106
115
|
template.endpoint.should == "#{@base_url}/templates/#{endpoint}"
|
107
116
|
end
|
@@ -126,7 +135,6 @@ describe 'templates' do
|
|
126
135
|
Template.should_receive(:new).and_return template
|
127
136
|
template.stub(:create).and_return(template)
|
128
137
|
@templates.put('endpoint', 'value') do |response|
|
129
|
-
puts response
|
130
138
|
outer_method_call
|
131
139
|
end
|
132
140
|
end
|
@@ -156,8 +164,6 @@ describe 'templates' do
|
|
156
164
|
it 'should create a template' do
|
157
165
|
@templates.put(endpoint, value)
|
158
166
|
end
|
159
|
-
|
160
|
-
|
161
167
|
end
|
162
168
|
|
163
169
|
describe 'block parameter that can be used for template customisation' do
|
data/spec/server/server_spec.rb
CHANGED
@@ -19,15 +19,15 @@ describe "Mirage Server" do
|
|
19
19
|
spec = {"somekeys" => 'some_values'}
|
20
20
|
|
21
21
|
Mirage::MockResponse.should_receive(:new).with(endpoint, spec).and_return(@mock_response)
|
22
|
-
put('/
|
22
|
+
put('/templates/greeting', spec.to_json)
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'should set the requests url against the template that is created' do
|
26
26
|
method = 'post'
|
27
27
|
response_id = 1
|
28
28
|
Mirage::MockResponse.should_receive(:new).and_return(@mock_response)
|
29
|
-
put('/
|
30
|
-
@mock_response.requests_url.should == "http://example.org/
|
29
|
+
put('/templates/greeting', {:request => {:http_method => method}}.to_json)
|
30
|
+
@mock_response.requests_url.should == "http://example.org/requests/#{response_id}"
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
@@ -43,14 +43,14 @@ describe "Mirage Server" do
|
|
43
43
|
parameters = {"key" => 'value'}
|
44
44
|
|
45
45
|
Mirage::MockResponse.should_receive(:find).with(@options.merge(:params => parameters)).and_return(Mirage::MockResponse.new(@endpoint, {:response => {:body => "hello"}}))
|
46
|
-
get("/
|
46
|
+
get("/responses/#{@endpoint}", parameters)
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'should use the request body' do
|
50
50
|
body = 'body'
|
51
51
|
|
52
52
|
Mirage::MockResponse.should_receive(:find).with(@options.merge(:body => body)).and_return(Mirage::MockResponse.new(@endpoint, {:response => {:body => "hello"}}))
|
53
|
-
post("/
|
53
|
+
post("/responses/#{@endpoint}", body)
|
54
54
|
end
|
55
55
|
|
56
56
|
it 'should use headers' do
|
@@ -61,7 +61,7 @@ describe "Mirage Server" do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
Mirage::MockResponse.should_receive(:find).with(@options.merge(:headers => headers)).and_return(Mirage::MockResponse.new(@endpoint, {:response => {:body => "hello"}}))
|
64
|
-
get("/
|
64
|
+
get("/responses/#{@endpoint}")
|
65
65
|
end
|
66
66
|
|
67
67
|
it 'should return the default response if a specific match is not found' do
|
@@ -76,8 +76,8 @@ describe "Mirage Server" do
|
|
76
76
|
:body => "hello leon"
|
77
77
|
}
|
78
78
|
}
|
79
|
-
put("/
|
80
|
-
post("/
|
79
|
+
put("/templates/#{@endpoint}", response_template.to_json)
|
80
|
+
post("/responses/#{@endpoint}")
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -86,26 +86,26 @@ describe "Mirage Server" do
|
|
86
86
|
describe "operations" do
|
87
87
|
describe 'resolving responses' do
|
88
88
|
it 'should return the default response' do
|
89
|
-
put('/
|
90
|
-
put('/
|
91
|
-
get('/
|
89
|
+
put('/templates/level1', {:response => {:body => Base64.encode64("level1")}}.to_json)
|
90
|
+
put('/templates/level1/level2', {:response => {:body => Base64.encode64("level2"), :default => true}}.to_json)
|
91
|
+
get('/responses/level1/level2/level3').body.should == "level2"
|
92
92
|
end
|
93
93
|
|
94
94
|
it 'should set any headers specified' do
|
95
95
|
headers = {header: 'value'}
|
96
|
-
put('/
|
97
|
-
get('/
|
96
|
+
put('/templates/greeting', {:response => {headers: headers, :body => ''}}.to_json)
|
97
|
+
get('/responses/greeting').headers['header'].should == 'value'
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
101
|
describe 'checking templates' do
|
102
102
|
it 'should return the descriptor for a template' do
|
103
103
|
response_body = "hello"
|
104
|
-
response_id = JSON.parse(put('/
|
105
|
-
template = JSON.parse(get("/
|
104
|
+
response_id = JSON.parse(put('/templates/greeting', {:response => {:body => Base64.encode64(response_body)}}.to_json).body)['id']
|
105
|
+
template = JSON.parse(get("/templates/#{response_id}").body)
|
106
106
|
template.should == JSON.parse({:endpoint => "greeting",
|
107
107
|
:id => response_id,
|
108
|
-
:requests_url => "http://example.org/
|
108
|
+
:requests_url => "http://example.org/requests/#{response_id}",
|
109
109
|
:request => {:parameters => {}, :http_method => "get", :body_content => [], :headers => {}},
|
110
110
|
:response => {:default => false,
|
111
111
|
:body => Base64.encode64(response_body),
|
@@ -117,25 +117,25 @@ describe "Mirage Server" do
|
|
117
117
|
end
|
118
118
|
|
119
119
|
it 'should return tracked request data' do
|
120
|
-
response_id = JSON.parse(put('/
|
120
|
+
response_id = JSON.parse(put('/templates/greeting', {:request => {:http_method => :post}, :response => {:body => Base64.encode64("hello")}}.to_json).body)['id']
|
121
121
|
|
122
122
|
|
123
123
|
header "MYHEADER", "my_header_value"
|
124
|
-
post("/
|
125
|
-
request_data = JSON.parse(get("/
|
124
|
+
post("/responses/greeting?param=value", 'body')
|
125
|
+
request_data = JSON.parse(get("/requests/#{response_id}").body)
|
126
126
|
|
127
127
|
request_data['parameters'].should == {'param' => 'value'}
|
128
128
|
request_data['headers']["MYHEADER"].should == "my_header_value"
|
129
129
|
request_data['body'].should == "body"
|
130
|
-
request_data['request_url'].should == "http://example.org/
|
130
|
+
request_data['request_url'].should == "http://example.org/requests/#{response_id}"
|
131
131
|
|
132
132
|
end
|
133
133
|
|
134
134
|
|
135
135
|
it 'should delete a template' do
|
136
|
-
response_id = JSON.parse(put('/
|
137
|
-
delete("/
|
138
|
-
expect { get("/
|
136
|
+
response_id = JSON.parse(put('/templates/greeting', {:response => {:body => Base64.encode64("hello")}}.to_json).body)['id']
|
137
|
+
delete("/templates/#{response_id}")
|
138
|
+
expect { get("/templates/#{response_id}") }.to raise_error(Mirage::ServerResponseNotFound)
|
139
139
|
end
|
140
140
|
end
|
141
141
|
end
|
data/test.rb
CHANGED
@@ -1,20 +1,3 @@
|
|
1
|
-
require '
|
1
|
+
require '/home/team/Projects/mirage/lib/mirage/client'
|
2
2
|
|
3
|
-
|
4
|
-
Mirage.stop
|
5
|
-
mirage = Mirage.start
|
6
|
-
|
7
|
-
|
8
|
-
mirage.put('FindCis.do', 'value1') do
|
9
|
-
http_method :post
|
10
|
-
content_type "text/xml"
|
11
|
-
required_body_content ['value']
|
12
|
-
status 200
|
13
|
-
end
|
14
|
-
|
15
|
-
mirage.put('FindCis.do', 'value2') do
|
16
|
-
http_method :post
|
17
|
-
content_type "text/xml"
|
18
|
-
required_body_content ['value']
|
19
|
-
status 200
|
20
|
-
end
|
3
|
+
puts "{\"id\":1,\"endpoint\":\"greeting\",\"requests_url\":\"http://localhost:7001/requests/1\",\"response\":{\"default\":false,\"body\":\"Hello\",\"delay\":0,\"content_type\":\"text/plain\",\"status\":200},\"request\":{\"parameters\":{},\"body_content\":[],\"http_method\":\"get\",\"headers\":{}}}"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mirage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.alpha.
|
4
|
+
version: 3.0.0.alpha.12
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-08-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -253,6 +253,7 @@ files:
|
|
253
253
|
- README.md
|
254
254
|
- VERSION
|
255
255
|
- bin/mirage
|
256
|
+
- features/.nav
|
256
257
|
- features/client/clear.feature
|
257
258
|
- features/client/configure.feature
|
258
259
|
- features/client/preview_responses.feature
|
@@ -262,26 +263,29 @@ files:
|
|
262
263
|
- features/client/save_and_revert.feature
|
263
264
|
- features/client/start.feature
|
264
265
|
- features/client/stop.feature
|
265
|
-
- features/
|
266
|
-
- features/
|
267
|
-
- features/
|
268
|
-
- features/
|
269
|
-
- features/
|
270
|
-
- features/
|
271
|
-
- features/
|
272
|
-
- features/
|
273
|
-
- features/
|
274
|
-
- features/
|
275
|
-
- features/server/templates/put/put.feature
|
276
|
-
- features/server/templates/put/put_with_substitutions.feature
|
277
|
-
- features/server/templates/put/required_content.feature
|
278
|
-
- features/server/web_user_interface.feature
|
266
|
+
- features/commandline_interface/help.feature
|
267
|
+
- features/commandline_interface/readme.md
|
268
|
+
- features/commandline_interface/start.feature
|
269
|
+
- features/commandline_interface/stop.feature
|
270
|
+
- features/logging.feature
|
271
|
+
- features/prime.feature
|
272
|
+
- features/readme.md
|
273
|
+
- features/requests/delete.feature
|
274
|
+
- features/requests/get.feature
|
275
|
+
- features/save_and_revert.feature
|
279
276
|
- features/step_definitions/my_steps.rb
|
280
277
|
- features/support/command_line.rb
|
281
278
|
- features/support/env.rb
|
282
279
|
- features/support/hooks.rb
|
283
280
|
- features/support/mirage.rb
|
284
281
|
- features/support/web.rb
|
282
|
+
- features/templates/delete.feature
|
283
|
+
- features/templates/get.feature
|
284
|
+
- features/templates/put.feature
|
285
|
+
- features/templates/put_with_substitutions.feature
|
286
|
+
- features/templates/readme.md
|
287
|
+
- features/templates/required_content.feature
|
288
|
+
- features/web_user_interface.feature
|
285
289
|
- full_build.sh
|
286
290
|
- lib/mirage/client.rb
|
287
291
|
- lib/mirage/client/cli_bridge.rb
|
@@ -349,7 +353,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
349
353
|
version: '0'
|
350
354
|
segments:
|
351
355
|
- 0
|
352
|
-
hash:
|
356
|
+
hash: 158416820586937306
|
353
357
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
354
358
|
none: false
|
355
359
|
requirements:
|
@@ -358,7 +362,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
358
362
|
version: 1.3.1
|
359
363
|
requirements: []
|
360
364
|
rubyforge_project:
|
361
|
-
rubygems_version: 1.8.
|
365
|
+
rubygems_version: 1.8.24
|
362
366
|
signing_key:
|
363
367
|
specification_version: 3
|
364
368
|
summary: Mirage is a easy mock server for testing your applications
|
@@ -1,16 +0,0 @@
|
|
1
|
-
@command_line
|
2
|
-
Feature: Mirage is started from the command line.
|
3
|
-
Mirage logs to mirage.log at the path where Mirage is started from
|
4
|
-
|
5
|
-
|
6
|
-
Background: Mirage usage
|
7
|
-
Given usage information:
|
8
|
-
| Tasks: |
|
9
|
-
| mirage help [TASK] # Describe available tasks or one specific task |
|
10
|
-
# | mirage start # Starts mirage |
|
11
|
-
# | mirage stop -p, --port=[port_1 port_2\|all] # stops mirage |
|
12
|
-
|
13
|
-
|
14
|
-
Scenario: Starting with help option
|
15
|
-
Given I run 'mirage help'
|
16
|
-
Then the usage information should be displayed
|
@@ -1,47 +0,0 @@
|
|
1
|
-
Feature: Tracked request data can be deleted
|
2
|
-
|
3
|
-
Background: The MockServer has already got a response for greeting and leaving on it.
|
4
|
-
Given the following template template:
|
5
|
-
"""
|
6
|
-
{
|
7
|
-
"response":{
|
8
|
-
"body":"Hello"
|
9
|
-
}
|
10
|
-
}
|
11
|
-
"""
|
12
|
-
And 'response.body' is base64 encoded
|
13
|
-
And the template is sent using PUT to 'http://localhost:7001/mirage/templates/greeting'
|
14
|
-
|
15
|
-
Given the following template template:
|
16
|
-
"""
|
17
|
-
{
|
18
|
-
"response":{
|
19
|
-
"body":"Goodbye"
|
20
|
-
}
|
21
|
-
}
|
22
|
-
"""
|
23
|
-
And 'response.body' is base64 encoded
|
24
|
-
And the template is sent using PUT to 'http://localhost:7001/mirage/templates/leaving'
|
25
|
-
|
26
|
-
|
27
|
-
And GET is sent to 'http://localhost:7001/mirage/responses/greeting'
|
28
|
-
And GET is sent to 'http://localhost:7001/mirage/responses/leaving'
|
29
|
-
|
30
|
-
|
31
|
-
Scenario: Deleting all requests
|
32
|
-
And DELETE is sent to 'http://localhost:7001/mirage/requests'
|
33
|
-
|
34
|
-
When GET is sent to 'http://localhost:7001/mirage/requests/1'
|
35
|
-
Then a 404 should be returned
|
36
|
-
When GET is sent to 'http://localhost:7001/mirage/requests/2'
|
37
|
-
Then a 404 should be returned
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
Scenario: Deleting a stored request for a particular response
|
42
|
-
And DELETE is sent to 'http://localhost:7001/mirage/requests/1'
|
43
|
-
|
44
|
-
When GET is sent to 'http://localhost:7001/mirage/requests/1'
|
45
|
-
Then a 404 should be returned
|
46
|
-
When GET is sent to 'http://localhost:7001/mirage/requests/2'
|
47
|
-
Then a 200 should be returned
|
@@ -1,44 +0,0 @@
|
|
1
|
-
Feature: When a template is deleted, any tracked request data is also removed.
|
2
|
-
|
3
|
-
Background: The MockServer has already got a response for greeting and leaving on it.
|
4
|
-
Given the following template template:
|
5
|
-
"""
|
6
|
-
{
|
7
|
-
"response":{
|
8
|
-
"body":"Hello"
|
9
|
-
}
|
10
|
-
}
|
11
|
-
"""
|
12
|
-
And 'response.body' is base64 encoded
|
13
|
-
And the template is sent using PUT to 'http://localhost:7001/mirage/templates/greeting'
|
14
|
-
|
15
|
-
Given the following template template:
|
16
|
-
"""
|
17
|
-
{
|
18
|
-
"response":{
|
19
|
-
"body":"Goodbye"
|
20
|
-
}
|
21
|
-
}
|
22
|
-
"""
|
23
|
-
And 'response.body' is base64 encoded
|
24
|
-
And the template is sent using PUT to 'http://localhost:7001/mirage/templates/leaving'
|
25
|
-
|
26
|
-
|
27
|
-
Scenario: Deleting all templates
|
28
|
-
Given DELETE is sent to 'http://localhost:7001/mirage/templates'
|
29
|
-
When GET is sent to 'http://localhost:7001/mirage/responses/greeting'
|
30
|
-
Then a 404 should be returned
|
31
|
-
When GET is sent to 'http://localhost:7001/mirage/responses/leaving'
|
32
|
-
Then a 404 should be returned
|
33
|
-
|
34
|
-
|
35
|
-
Scenario: Deleting a particular template
|
36
|
-
Given DELETE is sent to 'http://localhost:7001/mirage/templates/1'
|
37
|
-
|
38
|
-
When GET is sent to 'http://localhost:7001/mirage/responses/greeting'
|
39
|
-
Then a 404 should be returned
|
40
|
-
|
41
|
-
When GET is sent to 'http://localhost:7001/mirage/responses/leaving'
|
42
|
-
Then a 200 should be returned
|
43
|
-
|
44
|
-
|
@@ -1,62 +0,0 @@
|
|
1
|
-
Feature: Mirage can be configured with templates that are returned when addressed from ${mirage_url}/responses
|
2
|
-
On setting a template, a unique id is returned. This is a key that can be used to manage the template.
|
3
|
-
|
4
|
-
Templates can be configured to respond to either, GET, POST, PUT, or DELETE. If you put more than one template to the same resource address
|
5
|
-
but configure them to respond to different HTTP methods, then they are held as seperate resources and are assigned different ids.
|
6
|
-
|
7
|
-
The following can be configured as required in order to invoke a response:
|
8
|
-
* request parameters
|
9
|
-
* body content - defaults to text/plain
|
10
|
-
* HTTP Headers
|
11
|
-
* HTTP Method - defaults to HTTP GET
|
12
|
-
|
13
|
-
The following attributes of a response can be configured
|
14
|
-
* HTTP status code - defaults to 200
|
15
|
-
* Whether this template is to be treated as the default response if a match is not found for a sub URI
|
16
|
-
* A delay before the response is returned to the client. This is in seconds, floats are accepted
|
17
|
-
* Content-Type
|
18
|
-
|
19
|
-
Request defaults
|
20
|
-
|required request parameters | none |
|
21
|
-
|required body content | none |
|
22
|
-
|require HTTP headers | none |
|
23
|
-
|required HTTP method | GET |
|
24
|
-
|
25
|
-
Response defaults
|
26
|
-
| HTTP status code | 200 |
|
27
|
-
| treat as default | false |
|
28
|
-
| delay | 0 |
|
29
|
-
| Content-Type | text/plain |
|
30
|
-
|
31
|
-
|
32
|
-
Scenario: Setting a template on mirage
|
33
|
-
Given the following template template:
|
34
|
-
"""
|
35
|
-
{
|
36
|
-
"request":{
|
37
|
-
"parameters":{},
|
38
|
-
"http_method":"get",
|
39
|
-
"headers": {},
|
40
|
-
"body_content":[]
|
41
|
-
},
|
42
|
-
"response":{
|
43
|
-
"default":false,
|
44
|
-
"body":"Hello",
|
45
|
-
"delay":0,
|
46
|
-
"content_type":"text/plain",
|
47
|
-
"status":200
|
48
|
-
}
|
49
|
-
}
|
50
|
-
"""
|
51
|
-
And 'response.body' is base64 encoded
|
52
|
-
And the template is sent using PUT to 'http://localhost:7001/mirage/templates/greeting'
|
53
|
-
And '{"id":1}' should be returned
|
54
|
-
|
55
|
-
When GET is sent to 'http://localhost:7001/mirage/responses/greeting'
|
56
|
-
Then 'Hello' should be returned
|
57
|
-
And a 200 should be returned
|
58
|
-
|
59
|
-
Scenario: Making a request that is unmatched
|
60
|
-
When GET is sent to 'http://localhost:7001/mirage/responses/unmatched'
|
61
|
-
Then a 404 should be returned
|
62
|
-
|