hoodoo 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/bin/hoodoo +5 -0
  3. data/lib/hoodoo.rb +27 -0
  4. data/lib/hoodoo/active.rb +32 -0
  5. data/lib/hoodoo/active/active_model/uuid_validator.rb +45 -0
  6. data/lib/hoodoo/active/active_record/base.rb +81 -0
  7. data/lib/hoodoo/active/active_record/creator.rb +134 -0
  8. data/lib/hoodoo/active/active_record/dated.rb +343 -0
  9. data/lib/hoodoo/active/active_record/error_mapping.rb +351 -0
  10. data/lib/hoodoo/active/active_record/finder.rb +606 -0
  11. data/lib/hoodoo/active/active_record/search_helper.rb +189 -0
  12. data/lib/hoodoo/active/active_record/secure.rb +431 -0
  13. data/lib/hoodoo/active/active_record/support.rb +106 -0
  14. data/lib/hoodoo/active/active_record/translated.rb +87 -0
  15. data/lib/hoodoo/active/active_record/uuid.rb +80 -0
  16. data/lib/hoodoo/active/active_record/writer.rb +321 -0
  17. data/lib/hoodoo/client.rb +23 -0
  18. data/lib/hoodoo/client/augmented_array.rb +29 -0
  19. data/lib/hoodoo/client/augmented_base.rb +168 -0
  20. data/lib/hoodoo/client/augmented_hash.rb +23 -0
  21. data/lib/hoodoo/client/client.rb +354 -0
  22. data/lib/hoodoo/client/endpoint/endpoint.rb +427 -0
  23. data/lib/hoodoo/client/endpoint/endpoints/amqp.rb +180 -0
  24. data/lib/hoodoo/client/endpoint/endpoints/auto_session.rb +194 -0
  25. data/lib/hoodoo/client/endpoint/endpoints/http.rb +203 -0
  26. data/lib/hoodoo/client/endpoint/endpoints/http_based.rb +367 -0
  27. data/lib/hoodoo/client/endpoint/endpoints/not_found.rb +59 -0
  28. data/lib/hoodoo/client/headers.rb +269 -0
  29. data/lib/hoodoo/communicators.rb +23 -0
  30. data/lib/hoodoo/communicators/fast.rb +44 -0
  31. data/lib/hoodoo/communicators/pool.rb +601 -0
  32. data/lib/hoodoo/communicators/slow.rb +84 -0
  33. data/lib/hoodoo/data.rb +51 -0
  34. data/lib/hoodoo/data/resources/caller.rb +39 -0
  35. data/lib/hoodoo/data/resources/errors.rb +28 -0
  36. data/lib/hoodoo/data/resources/log.rb +31 -0
  37. data/lib/hoodoo/data/resources/session.rb +26 -0
  38. data/lib/hoodoo/data/types/error_primitive.rb +27 -0
  39. data/lib/hoodoo/data/types/permissions.rb +40 -0
  40. data/lib/hoodoo/data/types/permissions_defaults.rb +32 -0
  41. data/lib/hoodoo/data/types/permissions_full.rb +28 -0
  42. data/lib/hoodoo/data/types/permissions_resources.rb +31 -0
  43. data/lib/hoodoo/discovery.rb +20 -0
  44. data/lib/hoodoo/errors.rb +19 -0
  45. data/lib/hoodoo/errors/error_descriptions.rb +229 -0
  46. data/lib/hoodoo/errors/errors.rb +322 -0
  47. data/lib/hoodoo/generator.rb +139 -0
  48. data/lib/hoodoo/logger.rb +23 -0
  49. data/lib/hoodoo/logger/fast_writer.rb +27 -0
  50. data/lib/hoodoo/logger/flattener_mixin.rb +36 -0
  51. data/lib/hoodoo/logger/logger.rb +387 -0
  52. data/lib/hoodoo/logger/slow_writer.rb +49 -0
  53. data/lib/hoodoo/logger/writer_mixin.rb +52 -0
  54. data/lib/hoodoo/logger/writers/file_writer.rb +45 -0
  55. data/lib/hoodoo/logger/writers/log_entries_dot_com_writer.rb +64 -0
  56. data/lib/hoodoo/logger/writers/stream_writer.rb +43 -0
  57. data/lib/hoodoo/middleware.rb +33 -0
  58. data/lib/hoodoo/presenters.rb +45 -0
  59. data/lib/hoodoo/presenters/base.rb +281 -0
  60. data/lib/hoodoo/presenters/base_dsl.rb +519 -0
  61. data/lib/hoodoo/presenters/common_resource_fields.rb +31 -0
  62. data/lib/hoodoo/presenters/embedding.rb +232 -0
  63. data/lib/hoodoo/presenters/types/array.rb +118 -0
  64. data/lib/hoodoo/presenters/types/boolean.rb +26 -0
  65. data/lib/hoodoo/presenters/types/date.rb +26 -0
  66. data/lib/hoodoo/presenters/types/date_time.rb +26 -0
  67. data/lib/hoodoo/presenters/types/decimal.rb +47 -0
  68. data/lib/hoodoo/presenters/types/enum.rb +55 -0
  69. data/lib/hoodoo/presenters/types/field.rb +158 -0
  70. data/lib/hoodoo/presenters/types/float.rb +26 -0
  71. data/lib/hoodoo/presenters/types/hash.rb +361 -0
  72. data/lib/hoodoo/presenters/types/integer.rb +26 -0
  73. data/lib/hoodoo/presenters/types/object.rb +117 -0
  74. data/lib/hoodoo/presenters/types/string.rb +53 -0
  75. data/lib/hoodoo/presenters/types/tags.rb +24 -0
  76. data/lib/hoodoo/presenters/types/text.rb +26 -0
  77. data/lib/hoodoo/presenters/types/uuid.rb +54 -0
  78. data/lib/hoodoo/services.rb +34 -0
  79. data/lib/hoodoo/services/discovery/discoverers/by_consul.rb +66 -0
  80. data/lib/hoodoo/services/discovery/discoverers/by_convention.rb +173 -0
  81. data/lib/hoodoo/services/discovery/discoverers/by_drb/by_drb.rb +195 -0
  82. data/lib/hoodoo/services/discovery/discoverers/by_drb/drb_server.rb +166 -0
  83. data/lib/hoodoo/services/discovery/discoverers/by_drb/drb_server_start.rb +37 -0
  84. data/lib/hoodoo/services/discovery/discovery.rb +186 -0
  85. data/lib/hoodoo/services/discovery/results/for_amqp.rb +58 -0
  86. data/lib/hoodoo/services/discovery/results/for_http.rb +85 -0
  87. data/lib/hoodoo/services/discovery/results/for_local.rb +85 -0
  88. data/lib/hoodoo/services/discovery/results/for_remote.rb +57 -0
  89. data/lib/hoodoo/services/middleware/amqp_log_message.rb +186 -0
  90. data/lib/hoodoo/services/middleware/amqp_log_writer.rb +119 -0
  91. data/lib/hoodoo/services/middleware/endpoints/inter_resource_local.rb +130 -0
  92. data/lib/hoodoo/services/middleware/endpoints/inter_resource_remote.rb +202 -0
  93. data/lib/hoodoo/services/middleware/exception_reporting/base_reporter.rb +105 -0
  94. data/lib/hoodoo/services/middleware/exception_reporting/exception_reporting.rb +115 -0
  95. data/lib/hoodoo/services/middleware/exception_reporting/reporters/airbrake_reporter.rb +64 -0
  96. data/lib/hoodoo/services/middleware/exception_reporting/reporters/raygun_reporter.rb +63 -0
  97. data/lib/hoodoo/services/middleware/interaction.rb +127 -0
  98. data/lib/hoodoo/services/middleware/middleware.rb +2705 -0
  99. data/lib/hoodoo/services/middleware/rack_monkey_patch.rb +73 -0
  100. data/lib/hoodoo/services/services/context.rb +153 -0
  101. data/lib/hoodoo/services/services/implementation.rb +132 -0
  102. data/lib/hoodoo/services/services/interface.rb +934 -0
  103. data/lib/hoodoo/services/services/permissions.rb +250 -0
  104. data/lib/hoodoo/services/services/request.rb +189 -0
  105. data/lib/hoodoo/services/services/response.rb +316 -0
  106. data/lib/hoodoo/services/services/service.rb +141 -0
  107. data/lib/hoodoo/services/services/session.rb +729 -0
  108. data/lib/hoodoo/utilities.rb +12 -0
  109. data/lib/hoodoo/utilities/string_inquirer.rb +54 -0
  110. data/lib/hoodoo/utilities/utilities.rb +380 -0
  111. data/lib/hoodoo/utilities/uuid.rb +44 -0
  112. data/lib/hoodoo/version.rb +17 -0
  113. data/spec/active/active_record/base_spec.rb +57 -0
  114. data/spec/active/active_record/creator_spec.rb +88 -0
  115. data/spec/active/active_record/dated_spec.rb +248 -0
  116. data/spec/active/active_record/error_mapping_spec.rb +360 -0
  117. data/spec/active/active_record/finder_spec.rb +744 -0
  118. data/spec/active/active_record/search_helper_spec.rb +384 -0
  119. data/spec/active/active_record/secure_spec.rb +435 -0
  120. data/spec/active/active_record/support_spec.rb +225 -0
  121. data/spec/active/active_record/translated_spec.rb +19 -0
  122. data/spec/active/active_record/uuid_spec.rb +72 -0
  123. data/spec/active/active_record/writer_spec.rb +272 -0
  124. data/spec/alchemy/alchemy-amq.rb +33 -0
  125. data/spec/client/augmented_array_spec.rb +15 -0
  126. data/spec/client/augmented_base_spec.rb +50 -0
  127. data/spec/client/augmented_hash_spec.rb +15 -0
  128. data/spec/client/client_spec.rb +955 -0
  129. data/spec/client/endpoint/endpoint_spec.rb +70 -0
  130. data/spec/client/endpoint/endpoints/amqp_spec.rb +16 -0
  131. data/spec/client/endpoint/endpoints/auto_session_spec.rb +9 -0
  132. data/spec/client/endpoint/endpoints/http_based_spec.rb +9 -0
  133. data/spec/client/endpoint/endpoints/http_spec.rb +103 -0
  134. data/spec/client/endpoint/endpoints/not_found_spec.rb +35 -0
  135. data/spec/client/headers_spec.rb +172 -0
  136. data/spec/communicators/fast_spec.rb +9 -0
  137. data/spec/communicators/pool_spec.rb +339 -0
  138. data/spec/communicators/slow_spec.rb +15 -0
  139. data/spec/data/resources/caller_spec.rb +156 -0
  140. data/spec/data/resources/errors_spec.rb +22 -0
  141. data/spec/data/resources/log_spec.rb +20 -0
  142. data/spec/data/resources/session_spec.rb +15 -0
  143. data/spec/data/types/error_primitive_spec.rb +15 -0
  144. data/spec/data/types/permissions_defaults_spec.rb +25 -0
  145. data/spec/data/types/permissions_full_spec.rb +44 -0
  146. data/spec/data/types/permissions_resources_spec.rb +34 -0
  147. data/spec/data/types/permissions_spec.rb +37 -0
  148. data/spec/errors/error_descriptions_spec.rb +98 -0
  149. data/spec/errors/errors_spec.rb +346 -0
  150. data/spec/integration/service_actions_spec.rb +112 -0
  151. data/spec/logger/fast_writer_spec.rb +18 -0
  152. data/spec/logger/logger_spec.rb +259 -0
  153. data/spec/logger/slow_writer_spec.rb +144 -0
  154. data/spec/logger/writers/file_writer_spec.rb +37 -0
  155. data/spec/logger/writers/log_entries_dot_com_writer_spec.rb +29 -0
  156. data/spec/logger/writers/stream_writer_spec.rb +38 -0
  157. data/spec/presenters/base_dsl_spec.rb +111 -0
  158. data/spec/presenters/base_spec.rb +871 -0
  159. data/spec/presenters/common_resource_fields_spec.rb +30 -0
  160. data/spec/presenters/embedding_spec.rb +87 -0
  161. data/spec/presenters/types/array_spec.rb +249 -0
  162. data/spec/presenters/types/boolean_spec.rb +51 -0
  163. data/spec/presenters/types/date_spec.rb +57 -0
  164. data/spec/presenters/types/date_time_spec.rb +59 -0
  165. data/spec/presenters/types/decimal_spec.rb +58 -0
  166. data/spec/presenters/types/enum_spec.rb +71 -0
  167. data/spec/presenters/types/field_spec.rb +77 -0
  168. data/spec/presenters/types/float_spec.rb +50 -0
  169. data/spec/presenters/types/hash_spec.rb +1069 -0
  170. data/spec/presenters/types/integer_spec.rb +50 -0
  171. data/spec/presenters/types/object_spec.rb +177 -0
  172. data/spec/presenters/types/string_spec.rb +65 -0
  173. data/spec/presenters/types/tags_spec.rb +56 -0
  174. data/spec/presenters/types/text_spec.rb +50 -0
  175. data/spec/presenters/types/uuid_spec.rb +46 -0
  176. data/spec/presenters/walk_spec.rb +198 -0
  177. data/spec/services/discovery/discoverers/by_consul_spec.rb +29 -0
  178. data/spec/services/discovery/discoverers/by_convention_spec.rb +67 -0
  179. data/spec/services/discovery/discoverers/by_drb/by_drb_spec.rb +80 -0
  180. data/spec/services/discovery/discoverers/by_drb/drb_server_spec.rb +205 -0
  181. data/spec/services/discovery/discovery_spec.rb +73 -0
  182. data/spec/services/discovery/results/for_amqp_spec.rb +17 -0
  183. data/spec/services/discovery/results/for_http_spec.rb +37 -0
  184. data/spec/services/discovery/results/for_local_spec.rb +21 -0
  185. data/spec/services/discovery/results/for_remote_spec.rb +15 -0
  186. data/spec/services/middleware/amqp_log_message_spec.rb +60 -0
  187. data/spec/services/middleware/amqp_log_writer_spec.rb +95 -0
  188. data/spec/services/middleware/endpoints/inter_resource_local_spec.rb +9 -0
  189. data/spec/services/middleware/endpoints/inter_resource_remote_spec.rb +9 -0
  190. data/spec/services/middleware/exception_reporting/base_reporter_spec.rb +16 -0
  191. data/spec/services/middleware/exception_reporting/exception_reporting_spec.rb +92 -0
  192. data/spec/services/middleware/exception_reporting/reporters/airbrake_reporter_spec.rb +24 -0
  193. data/spec/services/middleware/exception_reporting/reporters/raygun_reporter_spec.rb +23 -0
  194. data/spec/services/middleware/middleware_cors_spec.rb +93 -0
  195. data/spec/services/middleware/middleware_create_update_spec.rb +489 -0
  196. data/spec/services/middleware/middleware_dated_at_spec.rb +186 -0
  197. data/spec/services/middleware/middleware_exotic_communication_spec.rb +560 -0
  198. data/spec/services/middleware/middleware_logging_spec.rb +356 -0
  199. data/spec/services/middleware/middleware_multi_local_spec.rb +1094 -0
  200. data/spec/services/middleware/middleware_multi_remote_spec.rb +1440 -0
  201. data/spec/services/middleware/middleware_permissions_spec.rb +1014 -0
  202. data/spec/services/middleware/middleware_public_spec.rb +238 -0
  203. data/spec/services/middleware/middleware_spec.rb +1569 -0
  204. data/spec/services/middleware/string_inquirer_spec.rb +30 -0
  205. data/spec/services/services/application_spec.rb +74 -0
  206. data/spec/services/services/context_spec.rb +48 -0
  207. data/spec/services/services/implementation_spec.rb +45 -0
  208. data/spec/services/services/interface_spec.rb +262 -0
  209. data/spec/services/services/permissions_spec.rb +249 -0
  210. data/spec/services/services/request_spec.rb +95 -0
  211. data/spec/services/services/response_spec.rb +250 -0
  212. data/spec/services/services/session_spec.rb +432 -0
  213. data/spec/spec_helper.rb +298 -0
  214. data/spec/utilities/utilities_spec.rb +537 -0
  215. data/spec/utilities/uuid_spec.rb +20 -0
  216. 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