webvalve 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +195 -0
- data/Rakefile +22 -0
- data/lib/generators/webvalve/fake_service_generator.rb +70 -0
- data/lib/generators/webvalve/install_generator.rb +33 -0
- data/lib/tasks/webvalve_tasks.rake +0 -0
- data/lib/webvalve.rb +40 -0
- data/lib/webvalve/engine.rb +26 -0
- data/lib/webvalve/fake_service.rb +22 -0
- data/lib/webvalve/fake_service_config.rb +53 -0
- data/lib/webvalve/fake_service_wrapper.rb +18 -0
- data/lib/webvalve/instrumentation.rb +4 -0
- data/lib/webvalve/instrumentation/log_subscriber.rb +16 -0
- data/lib/webvalve/instrumentation/middleware.rb +24 -0
- data/lib/webvalve/manager.rb +76 -0
- data/lib/webvalve/rspec.rb +8 -0
- data/lib/webvalve/version.rb +3 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +13 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/bin/setup +29 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +31 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +41 -0
- data/spec/dummy/config/environments/production.rb +79 -0
- data/spec/dummy/config/environments/test.rb +42 -0
- data/spec/dummy/config/initializers/assets.rb +11 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +3938 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/examples.txt +30 -0
- data/spec/rails_helper.rb +14 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/helpers.rb +24 -0
- data/spec/webvalve/fake_service_config_spec.rb +133 -0
- data/spec/webvalve/fake_service_spec.rb +47 -0
- data/spec/webvalve/manager_spec.rb +132 -0
- data/spec/webvalve_spec.rb +19 -0
- metadata +268 -0
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
body {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body>
|
58
|
+
<!-- This file lives in public/404.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
62
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
63
|
+
</div>
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
65
|
+
</div>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,67 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
body {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body>
|
58
|
+
<!-- This file lives in public/422.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>The change you wanted was rejected.</h1>
|
62
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
63
|
+
</div>
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
65
|
+
</div>
|
66
|
+
</body>
|
67
|
+
</html>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
6
|
+
<style>
|
7
|
+
body {
|
8
|
+
background-color: #EFEFEF;
|
9
|
+
color: #2E2F30;
|
10
|
+
text-align: center;
|
11
|
+
font-family: arial, sans-serif;
|
12
|
+
margin: 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
div.dialog {
|
16
|
+
width: 95%;
|
17
|
+
max-width: 33em;
|
18
|
+
margin: 4em auto 0;
|
19
|
+
}
|
20
|
+
|
21
|
+
div.dialog > div {
|
22
|
+
border: 1px solid #CCC;
|
23
|
+
border-right-color: #999;
|
24
|
+
border-left-color: #999;
|
25
|
+
border-bottom-color: #BBB;
|
26
|
+
border-top: #B00100 solid 4px;
|
27
|
+
border-top-left-radius: 9px;
|
28
|
+
border-top-right-radius: 9px;
|
29
|
+
background-color: white;
|
30
|
+
padding: 7px 12% 0;
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
32
|
+
}
|
33
|
+
|
34
|
+
h1 {
|
35
|
+
font-size: 100%;
|
36
|
+
color: #730E15;
|
37
|
+
line-height: 1.5em;
|
38
|
+
}
|
39
|
+
|
40
|
+
div.dialog > p {
|
41
|
+
margin: 0 0 1em;
|
42
|
+
padding: 1em;
|
43
|
+
background-color: #F7F7F7;
|
44
|
+
border: 1px solid #CCC;
|
45
|
+
border-right-color: #999;
|
46
|
+
border-left-color: #999;
|
47
|
+
border-bottom-color: #999;
|
48
|
+
border-bottom-left-radius: 4px;
|
49
|
+
border-bottom-right-radius: 4px;
|
50
|
+
border-top-color: #DADADA;
|
51
|
+
color: #666;
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
53
|
+
}
|
54
|
+
</style>
|
55
|
+
</head>
|
56
|
+
|
57
|
+
<body>
|
58
|
+
<!-- This file lives in public/500.html -->
|
59
|
+
<div class="dialog">
|
60
|
+
<div>
|
61
|
+
<h1>We're sorry, but something went wrong.</h1>
|
62
|
+
</div>
|
63
|
+
<p>If you are the application owner check the logs for more information.</p>
|
64
|
+
</div>
|
65
|
+
</body>
|
66
|
+
</html>
|
File without changes
|
data/spec/examples.txt
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
example_id | status | run_time |
|
2
|
+
---------------------------------------------------- | ------ | --------------- |
|
3
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:1:1] | passed | 0.00176 seconds |
|
4
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:1:2] | passed | 0.00061 seconds |
|
5
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:2:1] | passed | 0.0005 seconds |
|
6
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:2:2] | passed | 0.00061 seconds |
|
7
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:2:3] | passed | 0.00093 seconds |
|
8
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:3:1] | passed | 0.00054 seconds |
|
9
|
+
./spec/webvalve/fake_service_config_spec.rb[1:1:3:2] | passed | 0.0024 seconds |
|
10
|
+
./spec/webvalve/fake_service_config_spec.rb[1:2:1] | passed | 0.001 seconds |
|
11
|
+
./spec/webvalve/fake_service_config_spec.rb[1:2:2] | passed | 0.00067 seconds |
|
12
|
+
./spec/webvalve/fake_service_config_spec.rb[1:2:3] | passed | 0.00061 seconds |
|
13
|
+
./spec/webvalve/fake_service_spec.rb[1:1] | passed | 0.00162 seconds |
|
14
|
+
./spec/webvalve/fake_service_spec.rb[1:2:1] | passed | 0.01159 seconds |
|
15
|
+
./spec/webvalve/fake_service_spec.rb[1:2:2] | passed | 0.00863 seconds |
|
16
|
+
./spec/webvalve/manager_spec.rb[1:1] | passed | 0.00048 seconds |
|
17
|
+
./spec/webvalve/manager_spec.rb[1:2:1] | passed | 0.0009 seconds |
|
18
|
+
./spec/webvalve/manager_spec.rb[1:3:1] | passed | 0.00063 seconds |
|
19
|
+
./spec/webvalve/manager_spec.rb[1:4:1] | passed | 0.00057 seconds |
|
20
|
+
./spec/webvalve/manager_spec.rb[1:5:1] | passed | 0.00155 seconds |
|
21
|
+
./spec/webvalve/manager_spec.rb[1:5:2] | passed | 0.00286 seconds |
|
22
|
+
./spec/webvalve/manager_spec.rb[1:5:3] | passed | 0.01329 seconds |
|
23
|
+
./spec/webvalve/manager_spec.rb[1:5:4:1] | passed | 0.00184 seconds |
|
24
|
+
./spec/webvalve/manager_spec.rb[1:5:5:1] | passed | 0.00182 seconds |
|
25
|
+
./spec/webvalve/manager_spec.rb[1:5:5:2] | passed | 0.00243 seconds |
|
26
|
+
./spec/webvalve/manager_spec.rb[1:5:5:3] | passed | 0.00334 seconds |
|
27
|
+
./spec/webvalve_spec.rb[1:1] | passed | 0.00046 seconds |
|
28
|
+
./spec/webvalve_spec.rb[1:2] | passed | 0.00048 seconds |
|
29
|
+
./spec/webvalve_spec.rb[1:3] | passed | 0.00398 seconds |
|
30
|
+
./spec/webvalve_spec.rb[1:4] | passed | 0.00047 seconds |
|
@@ -0,0 +1,14 @@
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
require File.expand_path('../dummy/config/environment', __FILE__)
|
3
|
+
abort("The Rails environment is running in production mode!") if Rails.env.production?
|
4
|
+
require 'spec_helper'
|
5
|
+
require 'rspec/rails'
|
6
|
+
require 'pry'
|
7
|
+
Dir[Rails.root.join("#{WebValve::Engine.root}/spec/support/**/*.rb")].each { |f| require f }
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.use_transactional_fixtures = true
|
11
|
+
config.infer_spec_type_from_file_location!
|
12
|
+
config.filter_rails_from_backtrace!
|
13
|
+
config.include Helpers
|
14
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
RSpec.configure do |config|
|
2
|
+
config.expect_with :rspec do |expectations|
|
3
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
4
|
+
end
|
5
|
+
|
6
|
+
config.mock_with :rspec do |mocks|
|
7
|
+
mocks.verify_partial_doubles = true
|
8
|
+
end
|
9
|
+
|
10
|
+
config.filter_run :focus
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
config.example_status_persistence_file_path = "spec/examples.txt"
|
13
|
+
|
14
|
+
if config.files_to_run.one?
|
15
|
+
config.default_formatter = 'doc'
|
16
|
+
end
|
17
|
+
|
18
|
+
config.order = :random
|
19
|
+
Kernel.srand config.seed
|
20
|
+
|
21
|
+
# config.profile_examples = 10
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Helpers
|
2
|
+
def with_env(opts = {})
|
3
|
+
old = {}
|
4
|
+
opts.each do |k, v|
|
5
|
+
k = k.to_s
|
6
|
+
v = v.to_s unless v.nil?
|
7
|
+
old[k] = ENV[k]
|
8
|
+
ENV[k] = v
|
9
|
+
end
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
old.each do |k, v|
|
13
|
+
ENV[k] = v
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_rails_env(env)
|
18
|
+
initial_env = Rails.env
|
19
|
+
Rails.env = env
|
20
|
+
yield
|
21
|
+
ensure
|
22
|
+
Rails.env = initial_env
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe WebValve::FakeServiceConfig do
|
4
|
+
let(:fake_service) do
|
5
|
+
Class.new(described_class) do
|
6
|
+
def self.service_name
|
7
|
+
'dummy'
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.name
|
11
|
+
'FakeDummy'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
stub_const('FakeDummy', fake_service)
|
18
|
+
end
|
19
|
+
|
20
|
+
subject { described_class.new service: fake_service }
|
21
|
+
|
22
|
+
describe '.should_intercept?' do
|
23
|
+
context 'in test env' do
|
24
|
+
around do |ex|
|
25
|
+
with_rails_env 'test' do
|
26
|
+
ex.run
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns true when DUMMY_ENABLED is unset' do
|
31
|
+
expect(subject.should_intercept?).to eq true
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns true regardless of DUMMY_ENABLED value' do
|
35
|
+
with_env 'DUMMY_ENABLED' => '1' do
|
36
|
+
expect(subject.should_intercept?).to eq true
|
37
|
+
end
|
38
|
+
|
39
|
+
with_env 'DUMMY_ENABLED' => '0' do
|
40
|
+
expect(subject.should_intercept?).to eq true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'in development env' do
|
46
|
+
around do |ex|
|
47
|
+
with_rails_env 'development' do
|
48
|
+
ex.run
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns true when DUMMY_ENABLED is unset' do
|
53
|
+
expect(subject.should_intercept?).to eq true
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns false when DUMMY_ENABLED is truthy' do
|
57
|
+
with_env 'DUMMY_ENABLED' => '1' do
|
58
|
+
expect(subject.should_intercept?).to eq false
|
59
|
+
end
|
60
|
+
|
61
|
+
with_env 'DUMMY_ENABLED' => 't' do
|
62
|
+
expect(subject.should_intercept?).to eq false
|
63
|
+
end
|
64
|
+
|
65
|
+
with_env 'DUMMY_ENABLED' => 'true' do
|
66
|
+
expect(subject.should_intercept?).to eq false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns true when DUMMY_ENABLED is not truthy' do
|
71
|
+
with_env 'DUMMY_ENABLED' => '0' do
|
72
|
+
expect(subject.should_intercept?).to eq true
|
73
|
+
end
|
74
|
+
|
75
|
+
with_env 'DUMMY_ENABLED' => 'f' do
|
76
|
+
expect(subject.should_intercept?).to eq true
|
77
|
+
end
|
78
|
+
|
79
|
+
with_env 'DUMMY_ENABLED' => 'false' do
|
80
|
+
expect(subject.should_intercept?).to eq true
|
81
|
+
end
|
82
|
+
|
83
|
+
with_env 'DUMMY_ENABLED' => 'not true or false' do
|
84
|
+
expect(subject.should_intercept?).to eq true
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'in production enviroment' do
|
90
|
+
around do |ex|
|
91
|
+
with_rails_env 'production' do
|
92
|
+
ex.run
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'returns false' do
|
97
|
+
expect(subject.should_intercept?).to eq false
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'returns false regardless of DUMMY_ENABLED value' do
|
101
|
+
with_env 'DUMMY_ENABLED' => '1' do
|
102
|
+
expect(subject.should_intercept?).to eq false
|
103
|
+
end
|
104
|
+
|
105
|
+
with_env 'DUMMY_ENABLED' => '0' do
|
106
|
+
expect(subject.should_intercept?).to eq false
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe '.service_url' do
|
113
|
+
it 'raises if the url is not present' do
|
114
|
+
expect { subject.service_url }.to raise_error <<~MESSAGE
|
115
|
+
There is no URL defined for FakeDummy.
|
116
|
+
Configure one by setting the ENV variable "DUMMY_API_URL"
|
117
|
+
or by using WebValve.register FakeDummy, url: "http://something.dev"
|
118
|
+
MESSAGE
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'discovers url via ENV based on fake service name' do
|
122
|
+
with_env 'DUMMY_API_URL' => 'http://thingy.dev' do
|
123
|
+
expect(subject.service_url).to eq 'http://thingy.dev'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'removes embedded basic auth credentials' do
|
128
|
+
with_env 'DUMMY_API_URL' => 'http://foo:bar@thingy.dev' do
|
129
|
+
expect(subject.service_url).to eq 'http://thingy.dev'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe WebValve::FakeService do
|
4
|
+
subject do
|
5
|
+
Class.new(described_class) do
|
6
|
+
def self.name
|
7
|
+
'FakeDummy'
|
8
|
+
end
|
9
|
+
|
10
|
+
get '/widgets' do
|
11
|
+
json({ result: 'it works!' })
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
before do
|
17
|
+
stub_const('FakeDummy', subject)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'is a Sinatra::Base' do
|
21
|
+
expect(subject).to be < Sinatra::Base
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'integrated behavior' do
|
25
|
+
after do
|
26
|
+
WebValve.reset
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'raise a useful error when an unmapped route is requested' do
|
30
|
+
with_env 'DUMMY_API_URL' => 'http://dummy.dev' do
|
31
|
+
WebValve.register subject
|
32
|
+
WebValve.setup
|
33
|
+
|
34
|
+
expect { Net::HTTP.get(URI('http://dummy.dev/foos')) }.to raise_error(RuntimeError, /route not defined for GET/)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'returns the result from the fake when a mapped route is requested' do
|
39
|
+
with_env 'DUMMY_API_URL' => 'http://dummy.dev' do
|
40
|
+
WebValve.register subject
|
41
|
+
WebValve.setup
|
42
|
+
|
43
|
+
expect(Net::HTTP.get(URI('http://dummy.dev/widgets'))).to eq({ result: 'it works!' }.to_json)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|