hoodoo 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/hoodoo +5 -0
- data/lib/hoodoo.rb +27 -0
- data/lib/hoodoo/active.rb +32 -0
- data/lib/hoodoo/active/active_model/uuid_validator.rb +45 -0
- data/lib/hoodoo/active/active_record/base.rb +81 -0
- data/lib/hoodoo/active/active_record/creator.rb +134 -0
- data/lib/hoodoo/active/active_record/dated.rb +343 -0
- data/lib/hoodoo/active/active_record/error_mapping.rb +351 -0
- data/lib/hoodoo/active/active_record/finder.rb +606 -0
- data/lib/hoodoo/active/active_record/search_helper.rb +189 -0
- data/lib/hoodoo/active/active_record/secure.rb +431 -0
- data/lib/hoodoo/active/active_record/support.rb +106 -0
- data/lib/hoodoo/active/active_record/translated.rb +87 -0
- data/lib/hoodoo/active/active_record/uuid.rb +80 -0
- data/lib/hoodoo/active/active_record/writer.rb +321 -0
- data/lib/hoodoo/client.rb +23 -0
- data/lib/hoodoo/client/augmented_array.rb +29 -0
- data/lib/hoodoo/client/augmented_base.rb +168 -0
- data/lib/hoodoo/client/augmented_hash.rb +23 -0
- data/lib/hoodoo/client/client.rb +354 -0
- data/lib/hoodoo/client/endpoint/endpoint.rb +427 -0
- data/lib/hoodoo/client/endpoint/endpoints/amqp.rb +180 -0
- data/lib/hoodoo/client/endpoint/endpoints/auto_session.rb +194 -0
- data/lib/hoodoo/client/endpoint/endpoints/http.rb +203 -0
- data/lib/hoodoo/client/endpoint/endpoints/http_based.rb +367 -0
- data/lib/hoodoo/client/endpoint/endpoints/not_found.rb +59 -0
- data/lib/hoodoo/client/headers.rb +269 -0
- data/lib/hoodoo/communicators.rb +23 -0
- data/lib/hoodoo/communicators/fast.rb +44 -0
- data/lib/hoodoo/communicators/pool.rb +601 -0
- data/lib/hoodoo/communicators/slow.rb +84 -0
- data/lib/hoodoo/data.rb +51 -0
- data/lib/hoodoo/data/resources/caller.rb +39 -0
- data/lib/hoodoo/data/resources/errors.rb +28 -0
- data/lib/hoodoo/data/resources/log.rb +31 -0
- data/lib/hoodoo/data/resources/session.rb +26 -0
- data/lib/hoodoo/data/types/error_primitive.rb +27 -0
- data/lib/hoodoo/data/types/permissions.rb +40 -0
- data/lib/hoodoo/data/types/permissions_defaults.rb +32 -0
- data/lib/hoodoo/data/types/permissions_full.rb +28 -0
- data/lib/hoodoo/data/types/permissions_resources.rb +31 -0
- data/lib/hoodoo/discovery.rb +20 -0
- data/lib/hoodoo/errors.rb +19 -0
- data/lib/hoodoo/errors/error_descriptions.rb +229 -0
- data/lib/hoodoo/errors/errors.rb +322 -0
- data/lib/hoodoo/generator.rb +139 -0
- data/lib/hoodoo/logger.rb +23 -0
- data/lib/hoodoo/logger/fast_writer.rb +27 -0
- data/lib/hoodoo/logger/flattener_mixin.rb +36 -0
- data/lib/hoodoo/logger/logger.rb +387 -0
- data/lib/hoodoo/logger/slow_writer.rb +49 -0
- data/lib/hoodoo/logger/writer_mixin.rb +52 -0
- data/lib/hoodoo/logger/writers/file_writer.rb +45 -0
- data/lib/hoodoo/logger/writers/log_entries_dot_com_writer.rb +64 -0
- data/lib/hoodoo/logger/writers/stream_writer.rb +43 -0
- data/lib/hoodoo/middleware.rb +33 -0
- data/lib/hoodoo/presenters.rb +45 -0
- data/lib/hoodoo/presenters/base.rb +281 -0
- data/lib/hoodoo/presenters/base_dsl.rb +519 -0
- data/lib/hoodoo/presenters/common_resource_fields.rb +31 -0
- data/lib/hoodoo/presenters/embedding.rb +232 -0
- data/lib/hoodoo/presenters/types/array.rb +118 -0
- data/lib/hoodoo/presenters/types/boolean.rb +26 -0
- data/lib/hoodoo/presenters/types/date.rb +26 -0
- data/lib/hoodoo/presenters/types/date_time.rb +26 -0
- data/lib/hoodoo/presenters/types/decimal.rb +47 -0
- data/lib/hoodoo/presenters/types/enum.rb +55 -0
- data/lib/hoodoo/presenters/types/field.rb +158 -0
- data/lib/hoodoo/presenters/types/float.rb +26 -0
- data/lib/hoodoo/presenters/types/hash.rb +361 -0
- data/lib/hoodoo/presenters/types/integer.rb +26 -0
- data/lib/hoodoo/presenters/types/object.rb +117 -0
- data/lib/hoodoo/presenters/types/string.rb +53 -0
- data/lib/hoodoo/presenters/types/tags.rb +24 -0
- data/lib/hoodoo/presenters/types/text.rb +26 -0
- data/lib/hoodoo/presenters/types/uuid.rb +54 -0
- data/lib/hoodoo/services.rb +34 -0
- data/lib/hoodoo/services/discovery/discoverers/by_consul.rb +66 -0
- data/lib/hoodoo/services/discovery/discoverers/by_convention.rb +173 -0
- data/lib/hoodoo/services/discovery/discoverers/by_drb/by_drb.rb +195 -0
- data/lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb +166 -0
- data/lib/hoodoo/services/discovery/discoverers/by_drb/drb_server_start.rb +37 -0
- data/lib/hoodoo/services/discovery/discovery.rb +186 -0
- data/lib/hoodoo/services/discovery/results/for_amqp.rb +58 -0
- data/lib/hoodoo/services/discovery/results/for_http.rb +85 -0
- data/lib/hoodoo/services/discovery/results/for_local.rb +85 -0
- data/lib/hoodoo/services/discovery/results/for_remote.rb +57 -0
- data/lib/hoodoo/services/middleware/amqp_log_message.rb +186 -0
- data/lib/hoodoo/services/middleware/amqp_log_writer.rb +119 -0
- data/lib/hoodoo/services/middleware/endpoints/inter_resource_local.rb +130 -0
- data/lib/hoodoo/services/middleware/endpoints/inter_resource_remote.rb +202 -0
- data/lib/hoodoo/services/middleware/exception_reporting/base_reporter.rb +105 -0
- data/lib/hoodoo/services/middleware/exception_reporting/exception_reporting.rb +115 -0
- data/lib/hoodoo/services/middleware/exception_reporting/reporters/airbrake_reporter.rb +64 -0
- data/lib/hoodoo/services/middleware/exception_reporting/reporters/raygun_reporter.rb +63 -0
- data/lib/hoodoo/services/middleware/interaction.rb +127 -0
- data/lib/hoodoo/services/middleware/middleware.rb +2705 -0
- data/lib/hoodoo/services/middleware/rack_monkey_patch.rb +73 -0
- data/lib/hoodoo/services/services/context.rb +153 -0
- data/lib/hoodoo/services/services/implementation.rb +132 -0
- data/lib/hoodoo/services/services/interface.rb +934 -0
- data/lib/hoodoo/services/services/permissions.rb +250 -0
- data/lib/hoodoo/services/services/request.rb +189 -0
- data/lib/hoodoo/services/services/response.rb +316 -0
- data/lib/hoodoo/services/services/service.rb +141 -0
- data/lib/hoodoo/services/services/session.rb +729 -0
- data/lib/hoodoo/utilities.rb +12 -0
- data/lib/hoodoo/utilities/string_inquirer.rb +54 -0
- data/lib/hoodoo/utilities/utilities.rb +380 -0
- data/lib/hoodoo/utilities/uuid.rb +44 -0
- data/lib/hoodoo/version.rb +17 -0
- data/spec/active/active_record/base_spec.rb +57 -0
- data/spec/active/active_record/creator_spec.rb +88 -0
- data/spec/active/active_record/dated_spec.rb +248 -0
- data/spec/active/active_record/error_mapping_spec.rb +360 -0
- data/spec/active/active_record/finder_spec.rb +744 -0
- data/spec/active/active_record/search_helper_spec.rb +384 -0
- data/spec/active/active_record/secure_spec.rb +435 -0
- data/spec/active/active_record/support_spec.rb +225 -0
- data/spec/active/active_record/translated_spec.rb +19 -0
- data/spec/active/active_record/uuid_spec.rb +72 -0
- data/spec/active/active_record/writer_spec.rb +272 -0
- data/spec/alchemy/alchemy-amq.rb +33 -0
- data/spec/client/augmented_array_spec.rb +15 -0
- data/spec/client/augmented_base_spec.rb +50 -0
- data/spec/client/augmented_hash_spec.rb +15 -0
- data/spec/client/client_spec.rb +955 -0
- data/spec/client/endpoint/endpoint_spec.rb +70 -0
- data/spec/client/endpoint/endpoints/amqp_spec.rb +16 -0
- data/spec/client/endpoint/endpoints/auto_session_spec.rb +9 -0
- data/spec/client/endpoint/endpoints/http_based_spec.rb +9 -0
- data/spec/client/endpoint/endpoints/http_spec.rb +103 -0
- data/spec/client/endpoint/endpoints/not_found_spec.rb +35 -0
- data/spec/client/headers_spec.rb +172 -0
- data/spec/communicators/fast_spec.rb +9 -0
- data/spec/communicators/pool_spec.rb +339 -0
- data/spec/communicators/slow_spec.rb +15 -0
- data/spec/data/resources/caller_spec.rb +156 -0
- data/spec/data/resources/errors_spec.rb +22 -0
- data/spec/data/resources/log_spec.rb +20 -0
- data/spec/data/resources/session_spec.rb +15 -0
- data/spec/data/types/error_primitive_spec.rb +15 -0
- data/spec/data/types/permissions_defaults_spec.rb +25 -0
- data/spec/data/types/permissions_full_spec.rb +44 -0
- data/spec/data/types/permissions_resources_spec.rb +34 -0
- data/spec/data/types/permissions_spec.rb +37 -0
- data/spec/errors/error_descriptions_spec.rb +98 -0
- data/spec/errors/errors_spec.rb +346 -0
- data/spec/integration/service_actions_spec.rb +112 -0
- data/spec/logger/fast_writer_spec.rb +18 -0
- data/spec/logger/logger_spec.rb +259 -0
- data/spec/logger/slow_writer_spec.rb +144 -0
- data/spec/logger/writers/file_writer_spec.rb +37 -0
- data/spec/logger/writers/log_entries_dot_com_writer_spec.rb +29 -0
- data/spec/logger/writers/stream_writer_spec.rb +38 -0
- data/spec/presenters/base_dsl_spec.rb +111 -0
- data/spec/presenters/base_spec.rb +871 -0
- data/spec/presenters/common_resource_fields_spec.rb +30 -0
- data/spec/presenters/embedding_spec.rb +87 -0
- data/spec/presenters/types/array_spec.rb +249 -0
- data/spec/presenters/types/boolean_spec.rb +51 -0
- data/spec/presenters/types/date_spec.rb +57 -0
- data/spec/presenters/types/date_time_spec.rb +59 -0
- data/spec/presenters/types/decimal_spec.rb +58 -0
- data/spec/presenters/types/enum_spec.rb +71 -0
- data/spec/presenters/types/field_spec.rb +77 -0
- data/spec/presenters/types/float_spec.rb +50 -0
- data/spec/presenters/types/hash_spec.rb +1069 -0
- data/spec/presenters/types/integer_spec.rb +50 -0
- data/spec/presenters/types/object_spec.rb +177 -0
- data/spec/presenters/types/string_spec.rb +65 -0
- data/spec/presenters/types/tags_spec.rb +56 -0
- data/spec/presenters/types/text_spec.rb +50 -0
- data/spec/presenters/types/uuid_spec.rb +46 -0
- data/spec/presenters/walk_spec.rb +198 -0
- data/spec/services/discovery/discoverers/by_consul_spec.rb +29 -0
- data/spec/services/discovery/discoverers/by_convention_spec.rb +67 -0
- data/spec/services/discovery/discoverers/by_drb/by_drb_spec.rb +80 -0
- data/spec/services/discovery/discoverers/by_drb/drb_server_spec.rb +205 -0
- data/spec/services/discovery/discovery_spec.rb +73 -0
- data/spec/services/discovery/results/for_amqp_spec.rb +17 -0
- data/spec/services/discovery/results/for_http_spec.rb +37 -0
- data/spec/services/discovery/results/for_local_spec.rb +21 -0
- data/spec/services/discovery/results/for_remote_spec.rb +15 -0
- data/spec/services/middleware/amqp_log_message_spec.rb +60 -0
- data/spec/services/middleware/amqp_log_writer_spec.rb +95 -0
- data/spec/services/middleware/endpoints/inter_resource_local_spec.rb +9 -0
- data/spec/services/middleware/endpoints/inter_resource_remote_spec.rb +9 -0
- data/spec/services/middleware/exception_reporting/base_reporter_spec.rb +16 -0
- data/spec/services/middleware/exception_reporting/exception_reporting_spec.rb +92 -0
- data/spec/services/middleware/exception_reporting/reporters/airbrake_reporter_spec.rb +24 -0
- data/spec/services/middleware/exception_reporting/reporters/raygun_reporter_spec.rb +23 -0
- data/spec/services/middleware/middleware_cors_spec.rb +93 -0
- data/spec/services/middleware/middleware_create_update_spec.rb +489 -0
- data/spec/services/middleware/middleware_dated_at_spec.rb +186 -0
- data/spec/services/middleware/middleware_exotic_communication_spec.rb +560 -0
- data/spec/services/middleware/middleware_logging_spec.rb +356 -0
- data/spec/services/middleware/middleware_multi_local_spec.rb +1094 -0
- data/spec/services/middleware/middleware_multi_remote_spec.rb +1440 -0
- data/spec/services/middleware/middleware_permissions_spec.rb +1014 -0
- data/spec/services/middleware/middleware_public_spec.rb +238 -0
- data/spec/services/middleware/middleware_spec.rb +1569 -0
- data/spec/services/middleware/string_inquirer_spec.rb +30 -0
- data/spec/services/services/application_spec.rb +74 -0
- data/spec/services/services/context_spec.rb +48 -0
- data/spec/services/services/implementation_spec.rb +45 -0
- data/spec/services/services/interface_spec.rb +262 -0
- data/spec/services/services/permissions_spec.rb +249 -0
- data/spec/services/services/request_spec.rb +95 -0
- data/spec/services/services/response_spec.rb +250 -0
- data/spec/services/services/session_spec.rb +432 -0
- data/spec/spec_helper.rb +298 -0
- data/spec/utilities/utilities_spec.rb +537 -0
- data/spec/utilities/uuid_spec.rb +20 -0
- metadata +615 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hoodoo::Presenters::CommonResourceFields do
|
4
|
+
it 'meets schema expectations' do
|
5
|
+
schema = described_class.get_schema()
|
6
|
+
|
7
|
+
expect(schema.is_internationalised?()).to eq(false)
|
8
|
+
|
9
|
+
expect(schema.properties.count).to eq(7)
|
10
|
+
|
11
|
+
expect(schema.properties['id']).to be_a(Hoodoo::Presenters::UUID)
|
12
|
+
expect(schema.properties['id'].required).to eq(true)
|
13
|
+
expect(schema.properties['id'].resource).to be_nil
|
14
|
+
expect(schema.properties['created_at']).to be_a(Hoodoo::Presenters::DateTime)
|
15
|
+
expect(schema.properties['created_at'].required).to eq(true)
|
16
|
+
expect(schema.properties['kind']).to be_a(Hoodoo::Presenters::Text)
|
17
|
+
expect(schema.properties['kind'].required).to eq(true)
|
18
|
+
expect(schema.properties['language']).to be_a(Hoodoo::Presenters::Text)
|
19
|
+
expect(schema.properties['language'].required).to eq(false)
|
20
|
+
|
21
|
+
expect(schema.properties['secured_with']).to be_a(Hoodoo::Presenters::Hash)
|
22
|
+
expect(schema.properties['secured_with'].required).to eq(false)
|
23
|
+
|
24
|
+
expect(schema.properties['_embed']).to be_a(Hoodoo::Presenters::Hash)
|
25
|
+
expect(schema.properties['_embed'].required).to eq(false)
|
26
|
+
expect(schema.properties['_reference']).to be_a(Hoodoo::Presenters::Hash)
|
27
|
+
expect(schema.properties['_reference'].required).to eq(false)
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Hoodoo::Presenters::Embedding::Embeds do
|
4
|
+
before :each do
|
5
|
+
@instance = described_class.new
|
6
|
+
end
|
7
|
+
|
8
|
+
it '#resource_key' do
|
9
|
+
expect( @instance.resource_key ).to eq( '_embed' )
|
10
|
+
end
|
11
|
+
|
12
|
+
it '#add_one' do
|
13
|
+
member = { 'first_name' => 'Anna' }
|
14
|
+
@instance.add_one( 'member', member )
|
15
|
+
expect( @instance.retrieve ).to eq( { 'member' => member } )
|
16
|
+
|
17
|
+
expect {
|
18
|
+
@instance.add_one( 'foo', 'not a Hash' )
|
19
|
+
}.to raise_exception( RuntimeError, 'Hoodoo::Presenters::Embedding::Embeds#add_one requires a rendered resource Hash, but was given an instance of String' )
|
20
|
+
end
|
21
|
+
|
22
|
+
it '#add_many' do
|
23
|
+
members = [ { 'first_name' => 'Anna' }, { 'first_name' => 'Bailey' } ]
|
24
|
+
@instance.add_many( 'members', members )
|
25
|
+
expect( @instance.retrieve ).to eq( { 'members' => members } )
|
26
|
+
|
27
|
+
expect {
|
28
|
+
@instance.add_many( 'foo', 'not an Array' )
|
29
|
+
}.to raise_exception( RuntimeError, 'Hoodoo::Presenters::Embedding::Embeds#add_many requires an Array, but was given an instance of String' )
|
30
|
+
|
31
|
+
expect {
|
32
|
+
@instance.add_many( 'foo', [ 'not a Hash' ] )
|
33
|
+
}.to raise_exception( RuntimeError, 'Hoodoo::Presenters::Embedding::Embeds#add_many requires an Array of rendered resource Hashes, but the first Array entry is an instance of String' )
|
34
|
+
end
|
35
|
+
|
36
|
+
it '#remove' do
|
37
|
+
member = { 'first_name' => 'Anna' }
|
38
|
+
voucher = { 'description' => '$5 off your next purchase' }
|
39
|
+
@instance.add_one( 'member', member )
|
40
|
+
@instance.add_one( 'voucher', voucher )
|
41
|
+
@instance.remove( 'member' )
|
42
|
+
expect( @instance.retrieve ).to eq( { 'voucher' => voucher } )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe Hoodoo::Presenters::Embedding::References do
|
47
|
+
before :each do
|
48
|
+
@instance = described_class.new
|
49
|
+
end
|
50
|
+
|
51
|
+
it '#resource_key' do
|
52
|
+
expect( @instance.resource_key ).to eq( '_reference' )
|
53
|
+
end
|
54
|
+
|
55
|
+
it '#add_one' do
|
56
|
+
member = Hoodoo::UUID.generate
|
57
|
+
@instance.add_one( 'member', member )
|
58
|
+
expect( @instance.retrieve ).to eq( { 'member' => member } )
|
59
|
+
|
60
|
+
expect {
|
61
|
+
@instance.add_one( 'foo', 'not a UUID' )
|
62
|
+
}.to raise_exception( RuntimeError, 'Hoodoo::Presenters::Embedding::References#add_one requires a valid UUID String, but the given value is invalid' )
|
63
|
+
end
|
64
|
+
|
65
|
+
it '#add_many' do
|
66
|
+
members = [ Hoodoo::UUID.generate, Hoodoo::UUID.generate ]
|
67
|
+
@instance.add_many( 'members', members )
|
68
|
+
expect( @instance.retrieve ).to eq( { 'members' => members } )
|
69
|
+
|
70
|
+
expect {
|
71
|
+
@instance.add_many( 'foo', 'not an Array' )
|
72
|
+
}.to raise_exception( RuntimeError, 'Hoodoo::Presenters::Embedding::References#add_many requires an Array, but was given an instance of String' )
|
73
|
+
|
74
|
+
expect {
|
75
|
+
@instance.add_many( 'foo', [ 'not a UUID' ] )
|
76
|
+
}.to raise_exception( RuntimeError, 'Hoodoo::Presenters::Embedding::References#add_many requires an Array of valid UUID strings, but the first Array entry is invalid' )
|
77
|
+
end
|
78
|
+
|
79
|
+
it '#remove' do
|
80
|
+
member = Hoodoo::UUID.generate
|
81
|
+
voucher = Hoodoo::UUID.generate
|
82
|
+
@instance.add_one( 'member', member )
|
83
|
+
@instance.add_one( 'voucher', voucher )
|
84
|
+
@instance.remove( 'member' )
|
85
|
+
expect( @instance.retrieve ).to eq( { 'voucher' => voucher } )
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,249 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hoodoo::Presenters::Array do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@inst = Hoodoo::Presenters::Array.new('one',:required => false)
|
7
|
+
|
8
|
+
class TestPresenterArray < Hoodoo::Presenters::Base
|
9
|
+
|
10
|
+
schema do
|
11
|
+
array :an_array, :required => true do
|
12
|
+
integer :an_integer
|
13
|
+
datetime :a_datetime
|
14
|
+
end
|
15
|
+
# Intentional mix of strings and symbols in default array
|
16
|
+
array :a_default_array, :default => [ { :an_integer => 42 }, { 'some_array_text' => 'hello' } ] do
|
17
|
+
integer :an_integer
|
18
|
+
text :some_array_text
|
19
|
+
end
|
20
|
+
array :an_array_with_entry_defaults do
|
21
|
+
integer :an_integer, :default => 42
|
22
|
+
datetime :a_datetime
|
23
|
+
end
|
24
|
+
array :an_array_of_anything
|
25
|
+
enum :an_enum, :from => [ :one, 'two', 3 ]
|
26
|
+
text :some_text
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#validate' do
|
33
|
+
it 'should return [] when valid array' do
|
34
|
+
expect(@inst.validate([]).errors).to eq([])
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return correct error when data is not a array' do
|
38
|
+
errors = @inst.validate('asckn')
|
39
|
+
|
40
|
+
err = [ {'code'=>"generic.invalid_array", 'message'=>"Field `one` is an invalid array", 'reference'=>"one"}]
|
41
|
+
expect(errors.errors).to eq(err)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should return correct error with non array types' do
|
45
|
+
err = [ {'code'=>"generic.invalid_array", 'message'=>"Field `one` is an invalid array", 'reference'=>"one"}]
|
46
|
+
|
47
|
+
expect(@inst.validate('asckn').errors).to eq(err)
|
48
|
+
expect(@inst.validate(34534).errors).to eq(err)
|
49
|
+
expect(@inst.validate(2123.23).errors).to eq(err)
|
50
|
+
expect(@inst.validate(true).errors).to eq(err)
|
51
|
+
expect(@inst.validate({}).errors).to eq(err)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should not return error when not required and absent' do
|
55
|
+
expect(@inst.validate(nil).errors).to eq([])
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should return error when required and absent' do
|
59
|
+
@inst.required = true
|
60
|
+
expect(@inst.validate(nil).errors).to eq([
|
61
|
+
{'code'=>"generic.required_field_missing", 'message'=>"Field `one` is required", 'reference'=>"one"}
|
62
|
+
])
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'should return correct error with path' do
|
66
|
+
errors = @inst.validate('scdacs','ordinary')
|
67
|
+
expect(errors.errors).to eq([
|
68
|
+
{'code'=>"generic.invalid_array", 'message'=>"Field `ordinary.one` is an invalid array", 'reference'=>"ordinary.one"}
|
69
|
+
])
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should raise error if required but omitted' do
|
73
|
+
data = {
|
74
|
+
}
|
75
|
+
|
76
|
+
errors = TestPresenterArray.validate(data)
|
77
|
+
expect(errors.errors).to eq([
|
78
|
+
{'code'=>"generic.required_field_missing", 'message'=>"Field `an_array` is required", 'reference'=>"an_array"},
|
79
|
+
])
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should not insist on non-required entry fields in a required array' do
|
84
|
+
data = {
|
85
|
+
'an_array' => [
|
86
|
+
{},
|
87
|
+
{ 'an_integer' => 2 },
|
88
|
+
{ 'a_datetime' => Time.now.iso8601 }
|
89
|
+
]
|
90
|
+
}
|
91
|
+
|
92
|
+
errors = TestPresenterArray.validate(data)
|
93
|
+
expect(errors.errors).to eq([])
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should validate all entry fields' do
|
97
|
+
data = {
|
98
|
+
'an_array' => [
|
99
|
+
{},
|
100
|
+
{ 'an_integer' => 'invalid' },
|
101
|
+
{ 'a_datetime' => 'invalid' }
|
102
|
+
]
|
103
|
+
}
|
104
|
+
|
105
|
+
errors = TestPresenterArray.validate(data)
|
106
|
+
expect(errors.errors).to eq([
|
107
|
+
{'code'=>"generic.invalid_integer", 'message'=>"Field `an_array[1].an_integer` is an invalid integer", 'reference'=>"an_array[1].an_integer"},
|
108
|
+
{'code'=>"generic.invalid_datetime", 'message'=>"Field `an_array[2].a_datetime` is an invalid ISO8601 datetime", 'reference'=>"an_array[2].a_datetime"},
|
109
|
+
])
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'should let anything be placed in an array with no schema properties' do
|
113
|
+
data = {
|
114
|
+
'an_array' => [],
|
115
|
+
'an_array_of_anything' => [
|
116
|
+
'one',
|
117
|
+
2,
|
118
|
+
true,
|
119
|
+
{ :hello => :world }
|
120
|
+
]
|
121
|
+
}
|
122
|
+
|
123
|
+
errors = TestPresenterArray.validate(data)
|
124
|
+
expect(errors.errors).to eq([])
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe '#render' do
|
129
|
+
it 'renders correctly with whole-array default (1)' do
|
130
|
+
data = nil
|
131
|
+
expect(TestPresenterArray.render(data)).to eq({
|
132
|
+
'a_default_array' => [ { 'an_integer' => 42 }, { 'some_array_text' => 'hello' } ]
|
133
|
+
})
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'renders correctly with whole-array default (2)' do
|
137
|
+
data = {}
|
138
|
+
expect(TestPresenterArray.render(data)).to eq({
|
139
|
+
'a_default_array' => [ { 'an_integer' => 42 }, { 'some_array_text' => 'hello' } ]
|
140
|
+
})
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'does not overwrite explicit nil for array with default' do
|
144
|
+
data = {
|
145
|
+
'a_default_array' => nil
|
146
|
+
}
|
147
|
+
expect(TestPresenterArray.render(data)).to eq(data)
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'does not overwrite explicit empty array for array with default' do
|
151
|
+
data = {
|
152
|
+
'a_default_array' => []
|
153
|
+
}
|
154
|
+
expect(TestPresenterArray.render(data)).to eq(data)
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'treats invalid types as nil' do
|
158
|
+
data = {
|
159
|
+
'a_default_array' => 'not an array'
|
160
|
+
}
|
161
|
+
expect(TestPresenterArray.render(data)).to eq({
|
162
|
+
'a_default_array' => nil
|
163
|
+
})
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should render correctly with whole-array default' do
|
167
|
+
time = Time.now.iso8601
|
168
|
+
data = {
|
169
|
+
'an_enum' => 'one',
|
170
|
+
'an_array' => [
|
171
|
+
{},
|
172
|
+
{ 'an_integer' => 2 },
|
173
|
+
{ 'a_datetime' => time }
|
174
|
+
]
|
175
|
+
}
|
176
|
+
|
177
|
+
expect(TestPresenterArray.render(data)).to eq({
|
178
|
+
'an_array' => [
|
179
|
+
{
|
180
|
+
},
|
181
|
+
{
|
182
|
+
'an_integer' => 2,
|
183
|
+
},
|
184
|
+
{
|
185
|
+
'a_datetime' => time
|
186
|
+
}
|
187
|
+
],
|
188
|
+
'a_default_array' => [ { 'an_integer' => 42 }, { 'some_array_text' => 'hello' } ],
|
189
|
+
'an_enum' => "one"
|
190
|
+
})
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should render correctly with per-entry defaults' do
|
194
|
+
time = Time.now.iso8601
|
195
|
+
data = {
|
196
|
+
'an_enum' => 'one',
|
197
|
+
'an_array' => [
|
198
|
+
{ 'an_integer' => 2 }
|
199
|
+
],
|
200
|
+
'an_array_with_entry_defaults' => [
|
201
|
+
nil,
|
202
|
+
{},
|
203
|
+
{ 'an_integer' => 0 },
|
204
|
+
{ 'an_integer' => 23 },
|
205
|
+
{ 'a_datetime' => time }
|
206
|
+
]
|
207
|
+
}
|
208
|
+
|
209
|
+
expect(TestPresenterArray.render(data)).to eq({
|
210
|
+
'an_array' => [
|
211
|
+
{ 'an_integer' => 2 }
|
212
|
+
],
|
213
|
+
'a_default_array' => [ { 'an_integer' => 42 }, { 'some_array_text' => 'hello' } ],
|
214
|
+
'an_array_with_entry_defaults' => [
|
215
|
+
nil, # Because explict-input-nil-means-nil-outputm always
|
216
|
+
{ 'an_integer' => 42 }, # Because empty objects always get field defaults, just as at the root level
|
217
|
+
{ 'an_integer' => 0 },
|
218
|
+
{ 'an_integer' => 23 },
|
219
|
+
{ 'an_integer' => 42, 'a_datetime' => time },
|
220
|
+
],
|
221
|
+
'an_enum' => "one"
|
222
|
+
})
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'should render any entries in an array with no schema properties' do
|
226
|
+
data = {
|
227
|
+
'an_array' => [],
|
228
|
+
'an_array_of_anything' => [
|
229
|
+
'one',
|
230
|
+
2,
|
231
|
+
true,
|
232
|
+
{ :hello => :world }
|
233
|
+
]
|
234
|
+
}
|
235
|
+
|
236
|
+
expect(TestPresenterArray.render(data)).to eq({
|
237
|
+
'an_array' => [],
|
238
|
+
'a_default_array' => [ { 'an_integer' => 42 }, { 'some_array_text' => 'hello' } ],
|
239
|
+
'an_array_of_anything' => [
|
240
|
+
'one',
|
241
|
+
2,
|
242
|
+
true,
|
243
|
+
{ :hello => :world }
|
244
|
+
]
|
245
|
+
})
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hoodoo::Presenters::Boolean do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@inst = Hoodoo::Presenters::Boolean.new('one',:required => false)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#validate' do
|
10
|
+
it 'should return [] when valid boolean' do
|
11
|
+
expect(@inst.validate(true).errors).to eq([])
|
12
|
+
expect(@inst.validate(false).errors).to eq([])
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return correct error when data is not a boolean' do
|
16
|
+
errors = @inst.validate('adskncasc')
|
17
|
+
|
18
|
+
err = [ {'code'=>"generic.invalid_boolean", 'message'=>"Field `one` is an invalid boolean", 'reference'=>"one"}]
|
19
|
+
expect(errors.errors).to eq(err)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return correct error with non boolean types' do
|
23
|
+
err = [ {'code'=>"generic.invalid_boolean", 'message'=>"Field `one` is an invalid boolean", 'reference'=>"one"}]
|
24
|
+
|
25
|
+
expect(@inst.validate('asckn').errors).to eq(err)
|
26
|
+
expect(@inst.validate(34534.234).errors).to eq(err)
|
27
|
+
expect(@inst.validate(38247).errors).to eq(err)
|
28
|
+
expect(@inst.validate({}).errors).to eq(err)
|
29
|
+
expect(@inst.validate([]).errors).to eq(err)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should not return error when not required and absent' do
|
33
|
+
expect(@inst.validate(nil).errors).to eq([])
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should return error when required and absent' do
|
37
|
+
@inst.required = true
|
38
|
+
expect(@inst.validate(nil).errors).to eq([
|
39
|
+
{'code'=>"generic.required_field_missing", 'message'=>"Field `one` is required", 'reference'=>"one"}
|
40
|
+
])
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should return correct error with path' do
|
44
|
+
errors = @inst.validate('scdacs','ordinary')
|
45
|
+
expect(errors.errors).to eq([
|
46
|
+
{'code'=>"generic.invalid_boolean", 'message'=>"Field `ordinary.one` is an invalid boolean", 'reference'=>"ordinary.one"}
|
47
|
+
])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hoodoo::Presenters::Date do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@inst = Hoodoo::Presenters::Date.new('one',:required => false)
|
7
|
+
end
|
8
|
+
|
9
|
+
# At the time of writing, the Date type code calls through
|
10
|
+
# to Utility for the back-end validation. In case that ever
|
11
|
+
# changes, though, many of these tests are replicated in
|
12
|
+
# utility_spec.rb.
|
13
|
+
#
|
14
|
+
describe '#validate' do
|
15
|
+
it 'should return [] when valid date' do
|
16
|
+
expect(@inst.validate('2014-12-11').errors).to eq([])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should not return error when not required and absent' do
|
20
|
+
expect(@inst.validate(nil).errors).to eq([])
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should return error when required and absent' do
|
24
|
+
@inst.required = true
|
25
|
+
expect(@inst.validate(nil).errors).to eq([
|
26
|
+
{'code'=>"generic.required_field_missing", 'message'=>"Field `one` is required", 'reference'=>"one"}
|
27
|
+
])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should return correct error when date is invalid' do
|
31
|
+
errors = @inst.validate('2014-99-99')
|
32
|
+
|
33
|
+
err = [ {'code'=>"generic.invalid_date", 'message'=>"Field `one` is an invalid ISO8601 date", 'reference'=>"one"}]
|
34
|
+
expect(errors.errors).to eq(err)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should return correct error with non date types' do
|
38
|
+
err = [ {'code'=>"generic.invalid_date", 'message'=>"Field `one` is an invalid ISO8601 date", 'reference'=>"one"}]
|
39
|
+
|
40
|
+
expect(@inst.validate('asckn').errors).to eq(err)
|
41
|
+
expect(@inst.validate('2014-12-11T00:00:00Z').errors).to eq(err)
|
42
|
+
expect(@inst.validate(34534.234).errors).to eq(err)
|
43
|
+
expect(@inst.validate(38247).errors).to eq(err)
|
44
|
+
expect(@inst.validate(true).errors).to eq(err)
|
45
|
+
expect(@inst.validate({}).errors).to eq(err)
|
46
|
+
expect(@inst.validate([]).errors).to eq(err)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should return correct error with path' do
|
50
|
+
errors = @inst.validate('scdacs','ordinary')
|
51
|
+
expect(errors.errors).to eq([
|
52
|
+
{'code'=>"generic.invalid_date", 'message'=>"Field `ordinary.one` is an invalid ISO8601 date", 'reference'=>"ordinary.one"}
|
53
|
+
])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|