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.
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