axel 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +21 -0
- data/.octopolo.yml +2 -0
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +23 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +271 -0
- data/Rakefile +13 -0
- data/app/models/axel/api_proxy.rb +86 -0
- data/app/models/axel/associations/base.rb +64 -0
- data/app/models/axel/associations/belongs_to.rb +43 -0
- data/app/models/axel/associations/has_many.rb +29 -0
- data/app/models/axel/associations/has_one.rb +30 -0
- data/app/models/axel/payload.rb +4 -0
- data/app/models/axel/payload/base.rb +107 -0
- data/app/models/axel/payload/errors.rb +62 -0
- data/app/models/axel/payload/metadata.rb +57 -0
- data/app/models/axel/querier.rb +166 -0
- data/app/models/axel/router.rb +119 -0
- data/app/models/axel/service_resource.rb +4 -0
- data/app/models/axel/service_resource/associations.rb +80 -0
- data/app/models/axel/service_resource/attributes.rb +23 -0
- data/app/models/axel/service_resource/automatic_resource.rb +23 -0
- data/app/models/axel/service_resource/base.rb +47 -0
- data/app/models/axel/service_resource/builder.rb +40 -0
- data/app/models/axel/service_resource/inspects.rb +17 -0
- data/app/models/axel/service_resource/payload_parser.rb +46 -0
- data/app/models/axel/service_resource/queries.rb +25 -0
- data/app/models/axel/service_resource/requesters.rb +49 -0
- data/app/models/axel/service_resource/routes.rb +19 -0
- data/app/models/axel/service_resource/typhoid_extensions.rb +134 -0
- data/app/views/axel/base/empty.json.erb +0 -0
- data/app/views/axel/base/empty.xml.builder +0 -0
- data/app/views/layouts/axel.json.jbuilder +7 -0
- data/app/views/layouts/axel.xml.builder +12 -0
- data/axel.gemspec +42 -0
- data/lib/axel.rb +56 -0
- data/lib/axel/application_extensions.rb +13 -0
- data/lib/axel/application_helper.rb +27 -0
- data/lib/axel/base_controller.rb +6 -0
- data/lib/axel/cascadable_attribute.rb +33 -0
- data/lib/axel/configurations/resource.rb +29 -0
- data/lib/axel/configurations/service.rb +28 -0
- data/lib/axel/configurator.rb +54 -0
- data/lib/axel/configurators/services.rb +29 -0
- data/lib/axel/controller_base.rb +27 -0
- data/lib/axel/controller_helpers.rb +209 -0
- data/lib/axel/controller_parameters.rb +32 -0
- data/lib/axel/engine.rb +14 -0
- data/lib/axel/inspector.rb +91 -0
- data/lib/axel/payload/remote_error.rb +14 -0
- data/lib/axel/request_options.rb +26 -0
- data/lib/axel/uri.rb +47 -0
- data/lib/axel/version.rb +3 -0
- data/lib/generators/axel/install_generator.rb +16 -0
- data/lib/generators/templates/README.md +22 -0
- data/lib/generators/templates/axel.rb +81 -0
- data/script/rails +5 -0
- data/spec/controllers/pages_controller_spec.rb +217 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/pages_controller.rb +6 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +62 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitignore +1 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/envelope_integration_check.rb +96 -0
- data/spec/helpers/axel/application_helper_spec.rb +31 -0
- data/spec/lib/axel/associations/base_spec.rb +28 -0
- data/spec/lib/axel/associations/belongs_to_spec.rb +62 -0
- data/spec/lib/axel/associations/has_many_spec.rb +23 -0
- data/spec/lib/axel/associations/has_one_spec.rb +23 -0
- data/spec/lib/axel/configurations/resource_spec.rb +15 -0
- data/spec/lib/axel/configurations/service_spec.rb +31 -0
- data/spec/lib/axel/configurator_spec.rb +26 -0
- data/spec/lib/axel/configurators/services_spec.rb +37 -0
- data/spec/lib/axel/controller_base_spec.rb +16 -0
- data/spec/lib/axel/controller_parameters_spec.rb +31 -0
- data/spec/lib/axel/inspector_spec.rb +45 -0
- data/spec/lib/axel/request_options_spec.rb +50 -0
- data/spec/lib/axel/uri_spec.rb +42 -0
- data/spec/lib/axel_spec.rb +64 -0
- data/spec/models/axel/api_proxy_spec.rb +66 -0
- data/spec/models/axel/payload/errors_spec.rb +165 -0
- data/spec/models/axel/payload/metadata_spec.rb +141 -0
- data/spec/models/axel/querier_spec.rb +158 -0
- data/spec/models/axel/router_spec.rb +115 -0
- data/spec/models/axel/service_resource/base_spec.rb +244 -0
- data/spec/models/axel/service_resource/builder_spec.rb +64 -0
- data/spec/models/axel/service_resource/payload_parser_spec.rb +60 -0
- data/spec/spec_helper.rb +39 -0
- data/spec/support/address.rb +5 -0
- data/spec/support/persona.rb +15 -0
- data/spec/support/user.rb +6 -0
- data/spec/views/axel/base/empty_spec.rb +34 -0
- metadata +508 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# So we don't have to add rails-api as a dependency
|
4
|
+
ActionController::API = ActionController::Base
|
5
|
+
module Axel
|
6
|
+
describe ControllerBase do
|
7
|
+
its(:configured) { should == ::ActionController::Base }
|
8
|
+
context "configured to use rails api" do
|
9
|
+
before do
|
10
|
+
subject.send(:config).stub uses_rails_api?: true
|
11
|
+
end
|
12
|
+
|
13
|
+
its(:configured) { should == ActionController::API }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Axel
|
4
|
+
describe ControllerParameters do
|
5
|
+
subject { ControllerParameters.new original_params }
|
6
|
+
let(:original_params) { {} }
|
7
|
+
let(:params_class) { double }
|
8
|
+
it { should respond_to :params_object }
|
9
|
+
|
10
|
+
describe "with strong params defined" do
|
11
|
+
before do
|
12
|
+
subject.stub strong_params?: true, params_class: params_class
|
13
|
+
end
|
14
|
+
|
15
|
+
it "creates strong params" do
|
16
|
+
params_class.should_receive(:new).with(original_params).once
|
17
|
+
subject.params_object
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "without strong params defined" do
|
22
|
+
before do
|
23
|
+
subject.stub strong_params?: false
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns the original object" do
|
27
|
+
subject.params_object.should be original_params
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Axel
|
3
|
+
describe Inspector do
|
4
|
+
subject { Inspector.new object, parens, attributes }
|
5
|
+
let(:object) { double(id: 1, name: "Jon", request_uri: "http://some-url/users/1") }
|
6
|
+
let(:parens) { [:request_uri] }
|
7
|
+
let(:attributes) { { id: 1, name: "Jon" } }
|
8
|
+
|
9
|
+
its(:object) { should == object }
|
10
|
+
it "retrieves parens_params keys" do
|
11
|
+
subject.parens_params.keys.should == parens
|
12
|
+
end
|
13
|
+
its(:attributes) { should == attributes }
|
14
|
+
|
15
|
+
describe "with parens and attributes set" do
|
16
|
+
its(:inspect) { should == "#<RSpec::Mocks::Double(\"http://some-url/users/1\") id: 1, name: \"Jon\">" }
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "with an erroring parens attribute" do
|
20
|
+
before { object.stub(:request_uri) { raise "No good" } }
|
21
|
+
its(:inspect) { should == "#<RSpec::Mocks::Double(nil) id: 1, name: \"Jon\">" }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "without parens" do
|
25
|
+
let(:parens) { nil }
|
26
|
+
its(:inspect) { should == "#<RSpec::Mocks::Double id: 1, name: \"Jon\">" }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "without attributes" do
|
30
|
+
let(:attributes) { nil }
|
31
|
+
its(:inspect) { should == "#<RSpec::Mocks::Double(\"http://some-url/users/1\")>" }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "with a class" do
|
35
|
+
before do
|
36
|
+
subject.stub class?: true
|
37
|
+
end
|
38
|
+
|
39
|
+
let(:object) { double request_uri: "http://example_uri/users", name: "MyClass" }
|
40
|
+
let(:parens) { [:request_uri] }
|
41
|
+
let(:attributes) { nil }
|
42
|
+
its(:inspect) { should == "MyClass(\"http://example_uri/users\")" }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'axel/request_options'
|
2
|
+
module Axel
|
3
|
+
describe RequestOptions do
|
4
|
+
subject { RequestOptions.new nil, example_options }
|
5
|
+
let(:example_options) { {} }
|
6
|
+
|
7
|
+
it "compiles with the default headers" do
|
8
|
+
subject.compiled.should == {
|
9
|
+
'headers' => {
|
10
|
+
'Content-Type' => 'application/json'
|
11
|
+
},
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "non-conflicting params" do
|
16
|
+
let(:example_options) { { params: { id: 1 } } }
|
17
|
+
it "compiles with the non-conflicting params" do
|
18
|
+
subject.compiled.should == {
|
19
|
+
'params' => { 'id' => 1 },
|
20
|
+
'headers' => {
|
21
|
+
'Content-Type' => 'application/json'
|
22
|
+
},
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "slightly-conflicting params" do
|
28
|
+
let(:example_options) { { headers: { id: 1 } } }
|
29
|
+
it "compiles with the non-conflicting params" do
|
30
|
+
subject.compiled.should == {
|
31
|
+
'headers' => {
|
32
|
+
'id' => 1,
|
33
|
+
'Content-Type' => 'application/json'
|
34
|
+
},
|
35
|
+
}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "truly-conflicting params" do
|
40
|
+
let(:example_options) { { headers: { "Content-Type" => 1 } } }
|
41
|
+
it "compiles with the non-conflicting params" do
|
42
|
+
subject.compiled.should == {
|
43
|
+
'headers' => {
|
44
|
+
'Content-Type' => 1
|
45
|
+
},
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Axel
|
3
|
+
describe "Uri" do
|
4
|
+
subject { Uri.new base_url }
|
5
|
+
let(:base_url) { "http://user-service.stage.com/users" }
|
6
|
+
|
7
|
+
before do
|
8
|
+
subject.stub config: {
|
9
|
+
dev: {
|
10
|
+
host: ".dev",
|
11
|
+
scheme: "http"
|
12
|
+
},
|
13
|
+
stage: {
|
14
|
+
host: ->(base, n) { "#{base}.stage#{n}.com" },
|
15
|
+
scheme: "https"
|
16
|
+
},
|
17
|
+
prod: {
|
18
|
+
host: ".your-platform.com",
|
19
|
+
scheme: "https"
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end
|
23
|
+
it "to dev switches out the stage URI for .dev" do
|
24
|
+
subject.to(:dev).to_s.should == "http://user-service.dev/users"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "for stage" do
|
28
|
+
subject.to(:stage).to_s.should == "https://user-service.stage.com/users"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "for stage n" do
|
32
|
+
subject.to(:stage, 2).to_s.should == "https://user-service.stage2.com/users"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "for prod" do
|
36
|
+
subject.to(:prod).to_s.should == "https://user-service.your-platform.com/users"
|
37
|
+
end
|
38
|
+
|
39
|
+
its(:dashed_app_name) { should == "user-service" }
|
40
|
+
its(:app_name) { should == "User Service" }
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
describe Axel do
|
3
|
+
subject { Axel }
|
4
|
+
|
5
|
+
context "services" do
|
6
|
+
it { subject.service_configurator.should be_a Axel::Configurators::Services }
|
7
|
+
end
|
8
|
+
|
9
|
+
context "config" do
|
10
|
+
context "with stubs" do
|
11
|
+
context "block checks" do
|
12
|
+
context "with block" do
|
13
|
+
specify do
|
14
|
+
expect { |b| subject.config &b }.to yield_with_args
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "once" do
|
21
|
+
before do
|
22
|
+
subject.config do |config|
|
23
|
+
config.add_resource :user_service, :user, service: { url: "http://user-service.dev" }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "sets a user service with a configuration" do
|
28
|
+
subject.services[:user_service].should be_a Axel::Configurations::Service
|
29
|
+
end
|
30
|
+
|
31
|
+
it "sets a resource configuration" do
|
32
|
+
subject.resources[:user].should be_a Axel::Configurations::Resource
|
33
|
+
end
|
34
|
+
|
35
|
+
context "twice" do
|
36
|
+
before do
|
37
|
+
subject.config do |config|
|
38
|
+
config.add_resource :api_proxy, :registry, service: { url: "http://api-proxy.dev" }
|
39
|
+
config.add_resource :user_service, :persona
|
40
|
+
end
|
41
|
+
end
|
42
|
+
it "sets a user service with a configuration" do
|
43
|
+
subject.services[:user_service].should be_a Axel::Configurations::Service
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sets a user resource configuration" do
|
47
|
+
subject.resources[:user].should be_a Axel::Configurations::Resource
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets a persona resource configuration" do
|
51
|
+
subject.resources[:persona].should be_a Axel::Configurations::Resource
|
52
|
+
end
|
53
|
+
|
54
|
+
it "sets a api proxy service with a configuration" do
|
55
|
+
subject.services[:api_proxy].should be_a Axel::Configurations::Service
|
56
|
+
end
|
57
|
+
|
58
|
+
it "sets a pers resource configuration" do
|
59
|
+
subject.resources[:registry].should be_a Axel::Configurations::Resource
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Axel
|
4
|
+
describe ApiProxy do
|
5
|
+
context "the class" do
|
6
|
+
subject { ApiProxy }
|
7
|
+
|
8
|
+
its(:cache_file) { should be_a Pathname }
|
9
|
+
its(:cache_dir) { should be_a Pathname }
|
10
|
+
|
11
|
+
context "invalid json" do
|
12
|
+
let(:json) { "not_json" }
|
13
|
+
it "can't parse, toss back hash as we expect" do
|
14
|
+
subject.build(nil, double(success?: true, body: json)).should == {}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "the instance" do
|
20
|
+
subject { ApiProxy.new endpoint }
|
21
|
+
let(:endpoint) { "http://api.not-existant" }
|
22
|
+
|
23
|
+
context "get new data" do
|
24
|
+
let(:new_data) { "{\"routes\":[{\"service\":\"https://user-service.stage.com\",\"path\":\"/personas\",\"matcher\":\"^/personas(\\\\/[\\\\w]+)*\\\\/?(\\\\.\\\\w+)?(\\\\?.*)?$\"},{\"service\":\"https://cms-service.stage.com\",\"path\":\"/mobile_products\",\"matcher\":\"^/mobile_products(\\\\/[\\\\w]+)*\\\\/?(\\\\.\\\\w+)?(\\\\?.*)?$\"}]}" }
|
25
|
+
|
26
|
+
before do
|
27
|
+
loaded = MultiJson.load new_data
|
28
|
+
subject.class.stub request: loaded
|
29
|
+
subject.stub write_cache: loaded["routes"]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "configs the resources" do
|
33
|
+
Axel.send(:_config).should_receive(:add_resource).with(
|
34
|
+
"user_service",
|
35
|
+
"personas",
|
36
|
+
service: { url: "https://user-service.stage.com" }).once
|
37
|
+
Axel.send(:_config).should_receive(:add_resource).with(
|
38
|
+
"cms_service",
|
39
|
+
"mobile_products",
|
40
|
+
service: { url: "https://cms-service.stage.com" }).once
|
41
|
+
subject.register!
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "get old data" do
|
46
|
+
let(:cached_data) { [{"service"=>"https://user-service.stage.com", "path"=>"/personas", "matcher"=>"^/personas(\\/[\\w]+)*\\/?(\\.\\w+)?(\\?.*)?$"}, {"service"=>"https://cms-service.stage.com", "path"=>"/mobile_products", "matcher"=>"^/mobile_products(\\/[\\w]+)*\\/?(\\.\\w+)?(\\?.*)?$"}] }
|
47
|
+
|
48
|
+
before do
|
49
|
+
subject.stub read_cache: cached_data
|
50
|
+
end
|
51
|
+
|
52
|
+
it "configs the resources" do
|
53
|
+
Axel.send(:_config).should_receive(:add_resource).with(
|
54
|
+
"user_service",
|
55
|
+
"personas",
|
56
|
+
service: { url: "https://user-service.stage.com" }).once
|
57
|
+
Axel.send(:_config).should_receive(:add_resource).with(
|
58
|
+
"cms_service",
|
59
|
+
"mobile_products",
|
60
|
+
service: { url: "https://cms-service.stage.com" }).once
|
61
|
+
subject.register!
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Axel
|
3
|
+
module Payload
|
4
|
+
describe Errors do
|
5
|
+
subject { Errors.new params }
|
6
|
+
let(:params) { {} }
|
7
|
+
|
8
|
+
its(:messages) { should == [] }
|
9
|
+
its(:status) { should == 200 }
|
10
|
+
|
11
|
+
context "http created code" do
|
12
|
+
let(:params) { { status: 201 } }
|
13
|
+
it "should be success" do
|
14
|
+
subject.success?.should be_truthy
|
15
|
+
subject.display?.should be_falsey
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "http accepted code" do
|
20
|
+
let(:params) { { status: 202 } }
|
21
|
+
it "should be success" do
|
22
|
+
subject.success?.should be_truthy
|
23
|
+
subject.display?.should be_falsey
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "http no content code" do
|
28
|
+
let(:params) { { status: 204 } }
|
29
|
+
it "should be success" do
|
30
|
+
subject.success?.should be_truthy
|
31
|
+
subject.display?.should be_falsey
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "exception" do
|
36
|
+
let(:params) { { status: 404, messages: ["Fail!"] } }
|
37
|
+
it "sets exception" do
|
38
|
+
subject.exception.should be_a RemoteError
|
39
|
+
subject.exception.to_s.should == "Failed. HTTP Status: 404, Messages: Fail!"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "reset!" do
|
44
|
+
let(:params) { { status: 404, messages: ["Fail!"] } }
|
45
|
+
|
46
|
+
it "sets params, resets, clear object" do
|
47
|
+
subject.status_code.should == 404
|
48
|
+
subject.messages.should == ["Fail!"]
|
49
|
+
subject.reset!
|
50
|
+
subject.status_code.should == 200
|
51
|
+
subject.messages.should == []
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "header status" do
|
56
|
+
its(:header_status) { should == 200 }
|
57
|
+
context "non-200 status" do
|
58
|
+
before do
|
59
|
+
subject.status = :unprocessable_entity
|
60
|
+
end
|
61
|
+
|
62
|
+
its(:header_status) { should == 422 }
|
63
|
+
|
64
|
+
context "suppressed" do
|
65
|
+
let(:params) { { suppress_response_codes: 1 } }
|
66
|
+
its(:header_status) { should == 200 }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "drops" do
|
72
|
+
let(:params) { { messages: ["no good"], status: 404 } }
|
73
|
+
|
74
|
+
context "with a drop" do
|
75
|
+
it "changes the boolean and drops the message" do
|
76
|
+
subject.drop?.should be_falsey
|
77
|
+
subject.drop!
|
78
|
+
subject.drop?.should be_truthy
|
79
|
+
subject.display.should == {}
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "without a drop" do
|
84
|
+
its(:display) { should == { status: 404, messages: ["no good"] } }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "<<" do
|
89
|
+
it "adds to the error list" do
|
90
|
+
expect { subject << "There was an error" }.to change { subject.messages }.from([]).to(["There was an error"])
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "display" do
|
95
|
+
its(:display) { should == { status: 200, messages: [] } }
|
96
|
+
|
97
|
+
context "with some errors and status" do
|
98
|
+
before do
|
99
|
+
subject << "ERROR"
|
100
|
+
subject.status = :unprocessable_entity
|
101
|
+
end
|
102
|
+
|
103
|
+
its(:display) { should == { status: 422, messages: ["ERROR"] } }
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "display?" do
|
108
|
+
its(:display?) { should == false }
|
109
|
+
|
110
|
+
context "with a non 200 status" do
|
111
|
+
before do
|
112
|
+
subject.status = 403
|
113
|
+
end
|
114
|
+
its(:display?) { should == true }
|
115
|
+
end
|
116
|
+
|
117
|
+
context "with an error message" do
|
118
|
+
before do
|
119
|
+
subject << "ERROR"
|
120
|
+
end
|
121
|
+
its(:display?) { should == true }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe "new_error" do
|
126
|
+
context "non-200 status, one message" do
|
127
|
+
before do
|
128
|
+
subject.new_error 404, "ERROR"
|
129
|
+
end
|
130
|
+
its(:display) { should == { status: 404, messages: ["ERROR"] } }
|
131
|
+
end
|
132
|
+
|
133
|
+
context "non-200 status, multiple messages" do
|
134
|
+
before do
|
135
|
+
subject.new_error :not_found, "ERROR", "ERROR 2"
|
136
|
+
end
|
137
|
+
its(:display) { should == { status: 404, messages: ["ERROR", "ERROR 2"] } }
|
138
|
+
end
|
139
|
+
|
140
|
+
context "200 status, multiple messages" do
|
141
|
+
before do
|
142
|
+
subject.new_error nil, "ERROR"
|
143
|
+
end
|
144
|
+
its(:display) { should == { status: 200, messages: ["ERROR"] } }
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "formats" do
|
149
|
+
context "no display" do
|
150
|
+
its(:to_json) { should == "" }
|
151
|
+
its(:to_xml) { should == "" }
|
152
|
+
end
|
153
|
+
|
154
|
+
context "with errors and status" do
|
155
|
+
before do
|
156
|
+
subject.new_error :not_found, "Not found"
|
157
|
+
end
|
158
|
+
|
159
|
+
its(:to_json) { should == { status: 404, messages: ["Not found"] }.to_json }
|
160
|
+
its(:to_xml) { should == { status: 404, messages: ["Not found"] }.to_xml(skip_instruct: true, root: :error) }
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|