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,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Communicators::Slow do
4
+ it 'complains if #communicate is called directly' do
5
+ expect {
6
+ Hoodoo::Communicators::Slow.new.communicate( {} )
7
+ }.to raise_error( RuntimeError )
8
+ end
9
+
10
+ it 'does not complain if #dropped is called directly' do
11
+ expect {
12
+ Hoodoo::Communicators::Slow.new.dropped( 1 )
13
+ }.to_not raise_error()
14
+ end
15
+ end
@@ -0,0 +1,156 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Resources::Caller do
4
+ it 'should match schema expectations' do
5
+ schema = described_class.get_schema()
6
+
7
+ expect(schema.is_internationalised?()).to eq(true)
8
+
9
+ expect(schema.properties.count).to eq(5)
10
+
11
+ expect(schema.properties['authentication_secret']).to be_a(Hoodoo::Presenters::Text)
12
+ expect(schema.properties['name']).to be_a(Hoodoo::Presenters::Text)
13
+ expect(schema.properties['identity']).to be_a(Hoodoo::Presenters::Hash)
14
+ expect(schema.properties['permissions']).to be_a(Hoodoo::Presenters::Object)
15
+ expect(schema.properties['permissions'].properties['resources']).to be_a(Hoodoo::Presenters::Hash)
16
+ expect(schema.properties['identity']).to be_a(Hoodoo::Presenters::Hash)
17
+ end
18
+
19
+ it 'should allow arbitrary identity values' do
20
+ result = described_class.validate(
21
+ {
22
+ "identity" => {
23
+ "array" => [],
24
+ "integer" => 1,
25
+ "string" => "thisisastring",
26
+ "object" => { "key" => "value" }
27
+ },
28
+ "permissions" => {
29
+ "resources" => {}
30
+ },
31
+ "scoping" => {}
32
+ },
33
+ false
34
+ )
35
+
36
+ expect(result.errors).to eq([])
37
+ end
38
+
39
+ it 'should allow arbitrary scoping values' do
40
+ result = described_class.validate(
41
+ {
42
+ "identity" => {},
43
+ "permissions" => {
44
+ "resources" => {}
45
+ },
46
+ "scoping" => {
47
+ "array" => [],
48
+ "integer" => 1,
49
+ "string" => "thisisastring",
50
+ "object" => { "key" => "value" }
51
+ }
52
+ },
53
+ false
54
+ )
55
+
56
+ expect(result.errors).to eq([])
57
+ end
58
+
59
+ it 'should be renderable with all data' do
60
+ id = Hoodoo::UUID.generate
61
+ created_at = Time.now
62
+ json = described_class.render(
63
+ {
64
+ "name" => "Test Caller",
65
+ "identity" => {
66
+ "array" => [],
67
+ "integer" => 1,
68
+ "string" => "thisisastring",
69
+ "object" => { "key" => "value" }
70
+ },
71
+ "permissions" => {
72
+ "resources" => {
73
+ "Caller" => {
74
+ "else" => "allow"
75
+ },
76
+ "Member" => {
77
+ "actions" => {
78
+ "list" => "allow"
79
+ },
80
+ "else" => "deny"
81
+ }
82
+ }
83
+ },
84
+ "scoping" => {
85
+ "array" => [],
86
+ "integer" => 1,
87
+ "string" => "thisisastring",
88
+ "object" => { "key" => "value" }
89
+ }
90
+ },
91
+ id,
92
+ created_at
93
+ )
94
+
95
+ expect(json).to eq(
96
+ {
97
+ 'id' => id,
98
+ 'created_at' => created_at.utc.iso8601,
99
+ 'kind' => 'Caller',
100
+ "name" => "Test Caller",
101
+ "identity" => {
102
+ "array" => [],
103
+ "integer" => 1,
104
+ "string" => "thisisastring",
105
+ "object" => { "key" => "value" }
106
+ },
107
+ "permissions" => {
108
+ "resources" => {
109
+ "Caller" => {
110
+ "else" => "allow"
111
+ },
112
+ "Member" => {
113
+ "actions" => {
114
+ "list" => "allow"
115
+ },
116
+ "else" => "deny"
117
+ }
118
+ }
119
+ },
120
+ "scoping" => {
121
+ "array" => [],
122
+ "integer" => 1,
123
+ "string" => "thisisastring",
124
+ "object" => { "key" => "value" }
125
+ },
126
+ "language" => "en-nz"
127
+ }
128
+ )
129
+ end
130
+
131
+ it 'should be renderable with minimal data' do
132
+ id = Hoodoo::UUID.generate
133
+ created_at = Time.now
134
+ json = described_class.render(
135
+ {
136
+ "identity" => {},
137
+ "permissions" => { "resources" => {} },
138
+ "scoping" => {}
139
+ },
140
+ id,
141
+ created_at
142
+ )
143
+
144
+ expect(json).to eq(
145
+ {
146
+ 'id' => id,
147
+ 'created_at' => created_at.utc.iso8601,
148
+ 'kind' => 'Caller',
149
+ "identity" => {},
150
+ "permissions" => { "resources" => {} },
151
+ "scoping" => {},
152
+ "language" => "en-nz"
153
+ }
154
+ )
155
+ end
156
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Resources::Errors do
4
+ it 'should match 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(2)
10
+
11
+ expect(schema.properties['interaction_id']).to be_a(Hoodoo::Presenters::UUID)
12
+ expect(schema.properties['interaction_id'].required).to eq(false)
13
+
14
+ expect(schema.properties['errors']).to be_a(Hoodoo::Presenters::Array)
15
+ expect(schema.properties['errors'].required).to eq(true)
16
+
17
+ expect(schema.properties['errors'].properties.count).to eq(3)
18
+ expect(schema.properties['errors'].properties['code']).to be_a(Hoodoo::Presenters::Text)
19
+ expect(schema.properties['errors'].properties['message']).to be_a(Hoodoo::Presenters::Text)
20
+ expect(schema.properties['errors'].properties['reference']).to be_a(Hoodoo::Presenters::Text)
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Resources::Log do
4
+ it 'should match schema expectations' do
5
+ schema = described_class.get_schema()
6
+
7
+ expect(schema.is_internationalised?()).to eq(false)
8
+ expect(schema.properties.count).to eq(5)
9
+
10
+ expect(schema.properties['level']).to be_a(Hoodoo::Presenters::Text)
11
+ expect(schema.properties['level'].required).to eq(true)
12
+ expect(schema.properties['component']).to be_a(Hoodoo::Presenters::Text)
13
+ expect(schema.properties['component'].required).to eq(true)
14
+ expect(schema.properties['code']).to be_a(Hoodoo::Presenters::Text)
15
+ expect(schema.properties['code'].required).to eq(true)
16
+
17
+ expect(schema.properties['interaction_id']).to be_a(Hoodoo::Presenters::UUID)
18
+ expect(schema.properties['data']).to be_a(Hoodoo::Presenters::Hash)
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Resources::Session do
4
+ it 'should match 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(2)
10
+
11
+ expect(schema.properties['caller_id']).to be_a(Hoodoo::Presenters::UUID)
12
+ expect(schema.properties['caller_id'].resource).to eq(:Caller)
13
+ expect(schema.properties['expires_at']).to be_a(Hoodoo::Presenters::DateTime)
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Types::ErrorPrimitive do
4
+ it 'should match 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(3)
10
+
11
+ expect(schema.properties['code']).to be_a(Hoodoo::Presenters::Text)
12
+ expect(schema.properties['message']).to be_a(Hoodoo::Presenters::Text)
13
+ expect(schema.properties['reference']).to be_a(Hoodoo::Presenters::Text)
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Types::PermissionsDefaults do
4
+ it 'should match schema expectations' do
5
+
6
+ # List of permitted policies
7
+ policies = ['allow', 'deny', 'ask']
8
+
9
+ schema = described_class.get_schema()
10
+
11
+ expect(schema.is_internationalised?()).to eq(false)
12
+
13
+ expect(schema.properties.count).to eq(1)
14
+
15
+ # Resources hash
16
+
17
+ expect(schema.properties['default']).to be_a(Hoodoo::Presenters::Object)
18
+ expect(schema.properties['default'].default).to eq({'else'=>'deny'})
19
+ expect(schema.properties['default'].properties.count).to eq(2)
20
+
21
+ expect(schema.properties['default'].properties['actions']).to be_a(Hoodoo::Presenters::Object)
22
+ expect(schema.properties['default'].properties['else']).to be_a(Hoodoo::Presenters::Enum)
23
+ expect(schema.properties['default'].properties['else'].from).to match_array(policies)
24
+ end
25
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Types::PermissionsFull do
4
+ it 'should match schema expectations' do
5
+
6
+ schema = described_class.get_schema()
7
+
8
+ expect(schema.is_internationalised?()).to eq(false)
9
+
10
+ expect(schema.properties.count).to eq(2)
11
+
12
+ # Resources hash
13
+ expect(schema.properties['resources']).to be_a(Hoodoo::Presenters::Hash)
14
+ expect(schema.properties['resources'].properties.count).to eq(2)
15
+
16
+ # Default hash
17
+ expect(schema.properties['default']).to be_a(Hoodoo::Presenters::Object)
18
+ expect(schema.properties['default'].properties.count).to eq(2)
19
+
20
+ end
21
+
22
+ it 'should accept a valid hash' do
23
+
24
+ errors = described_class.validate({
25
+ 'resources' => {
26
+ 'member' => {
27
+ 'actions' => {
28
+ 'list' => 'allow',
29
+ 'show' => 'ask'
30
+ },
31
+ 'else' => 'deny'
32
+ }
33
+ },
34
+ 'default' => {
35
+ 'actions' => {
36
+ 'show' => 'allow'
37
+ },
38
+ 'else' => 'deny'
39
+ }
40
+ })
41
+ expect(errors.has_errors?).to be_falsey
42
+
43
+ end
44
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Types::PermissionsResources do
4
+ it 'should match schema expectations' do
5
+
6
+ schema = described_class.get_schema()
7
+
8
+ expect(schema.is_internationalised?()).to eq(false)
9
+
10
+ expect(schema.properties.count).to eq(1)
11
+
12
+ # Resources hash
13
+ expect(schema.properties['resources']).to be_a(Hoodoo::Presenters::Hash)
14
+ expect(schema.properties['resources'].properties.count).to eq(2)
15
+
16
+ end
17
+
18
+ it 'should accept a valid hash' do
19
+
20
+ errors = described_class.validate({
21
+ 'resources' => {
22
+ 'member' => {
23
+ 'actions' => {
24
+ 'list' => 'allow',
25
+ 'show' => 'ask'
26
+ },
27
+ 'else' => 'deny'
28
+ }
29
+ }
30
+ })
31
+ expect(errors.has_errors?).to be_falsey
32
+
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::Data::Types::Permissions do
4
+ it 'should match schema expectations' do
5
+
6
+ # List of permitted policies
7
+ policies = ['allow', 'deny', 'ask']
8
+
9
+ schema = described_class.get_schema()
10
+
11
+ expect(schema.is_internationalised?()).to eq(false)
12
+
13
+ expect(schema.properties.count).to eq(2)
14
+
15
+ # Resources hash
16
+
17
+ expect(schema.properties['actions']).to be_a(Hoodoo::Presenters::Object)
18
+ expect(schema.properties['actions'].properties.count).to eq(5)
19
+
20
+ expect(schema.properties['actions'].properties['show']).to be_a(Hoodoo::Presenters::Enum)
21
+ expect(schema.properties['actions'].properties['list']).to be_a(Hoodoo::Presenters::Enum)
22
+ expect(schema.properties['actions'].properties['create']).to be_a(Hoodoo::Presenters::Enum)
23
+ expect(schema.properties['actions'].properties['update']).to be_a(Hoodoo::Presenters::Enum)
24
+ expect(schema.properties['actions'].properties['delete']).to be_a(Hoodoo::Presenters::Enum)
25
+
26
+
27
+ expect(schema.properties['actions'].properties['show'].from).to match_array(policies)
28
+ expect(schema.properties['actions'].properties['list'].from).to match_array(policies)
29
+ expect(schema.properties['actions'].properties['create'].from).to match_array(policies)
30
+ expect(schema.properties['actions'].properties['update'].from).to match_array(policies)
31
+ expect(schema.properties['actions'].properties['delete'].from).to match_array(policies)
32
+
33
+ # Else enum
34
+ expect(schema.properties['else']).to be_a(Hoodoo::Presenters::Enum)
35
+ expect(schema.properties['else'].from).to match_array(policies)
36
+ end
37
+ end
@@ -0,0 +1,98 @@
1
+ require 'spec_helper'
2
+
3
+ describe Hoodoo::ErrorDescriptions do
4
+
5
+ # Test that DSL exceptions are raised as expected
6
+
7
+ context 'incorrect definitions' do
8
+ it 'should complain about missing message' do
9
+ expect {
10
+ Hoodoo::ErrorDescriptions.new( :test_domain ) do
11
+ error 'http_123', 'status' => 123
12
+ end
13
+ }.to raise_error(RuntimeError, "Error description options hash missing required key 'message'")
14
+ end
15
+
16
+ it 'should complain about missing status' do
17
+ expect {
18
+ Hoodoo::ErrorDescriptions.new( :test_domain ) do
19
+ error 'http_123', 'message' => 'hello world'
20
+ end
21
+ }.to raise_error(RuntimeError, "Error description options hash missing required key 'status'")
22
+ end
23
+ end
24
+
25
+ # Test that a correctly called DSL leads to the Right Things happening when
26
+ # called from the constructor.
27
+
28
+ context 'correct definitions' do
29
+ describe '#describe' do
30
+ it 'should report correct custom definitions' do
31
+ desc = Hoodoo::ErrorDescriptions.new( :test_domain ) do
32
+ error 'http_234_no_references', 'status' => 234, :message => '234 message'
33
+ error 'http_345_has_reference', :status => 345, 'message' => '345 message', 'reference' => [ :ref1 ]
34
+ error 'http_456_has_references', 'status' => 456, 'message' => '456 message', :reference => [ :ref2, :ref3, :ref4 ]
35
+ end
36
+
37
+ expect(desc.describe('test_domain.http_234_no_references')).to eq('status' => 234, 'message' => '234 message')
38
+ expect(desc.describe('test_domain.http_345_has_reference')).to eq('status' => 345, 'message' => '345 message', 'reference' => [ 'ref1' ])
39
+ expect(desc.describe('test_domain.http_456_has_references')).to eq('status' => 456, 'message' => '456 message', 'reference' => [ 'ref2', 'ref3', 'ref4' ])
40
+ end
41
+ end
42
+ end
43
+
44
+ # Test that a correctly called DSL leads to the Right Things happening when
45
+ # called from outside the constructor.
46
+
47
+ context 'correct definitions' do
48
+ before do
49
+ @desc = Hoodoo::ErrorDescriptions.new
50
+ @desc.errors_for( :test_domain ) do
51
+ error 'http_345_no_references', 'status' => 345, 'message' => '345 message'
52
+ error 'http_456_has_reference', 'status' => 456, 'message' => '456 message', 'reference' => [ :ref1 ]
53
+ error 'http_567_has_references', 'status' => 567, 'message' => '567 message', 'reference' => [ :ref2, :ref3, :ref4 ]
54
+ end
55
+ end
56
+
57
+ # * Check errors are defined as expected by examining schema
58
+ # * Check HTTP code & default messages
59
+ # * Check HTTP code & custom messages
60
+ # * Test exceptions for missing reference and references
61
+ # * Test adding a reference, or many references, with commans
62
+ # * Test adding extra reference data (appears at end)
63
+
64
+ describe '#describe' do
65
+ it 'should describe some default definitions' do
66
+ expect(@desc.describe('platform.malformed')).to_not be_nil
67
+ expect(@desc.describe('generic.malformed')).to_not be_nil
68
+ end
69
+
70
+ it 'should report correct custom definitions' do
71
+ expect(@desc.describe('test_domain.http_345_no_references')).to eq('status' => 345, 'message' => '345 message')
72
+ expect(@desc.describe('test_domain.http_456_has_reference')).to eq('status' => 456, 'message' => '456 message', 'reference' => [ 'ref1' ])
73
+ expect(@desc.describe('test_domain.http_567_has_references')).to eq('status' => 567, 'message' => '567 message', 'reference' => [ 'ref2', 'ref3', 'ref4' ])
74
+ expect(@desc.describe('test_domain.invalid')).to be_nil
75
+ end
76
+ end
77
+
78
+ describe '#recognised?' do
79
+ it 'should recognise default definitions' do
80
+ expect(@desc.recognised?('platform.malformed')).to eq(true)
81
+ expect(@desc.recognised?('generic.malformed')).to eq(true)
82
+ end
83
+
84
+ it 'should recognise custom definitions' do
85
+ expect(@desc.recognised?('test_domain.http_345_no_references')).to eq(true)
86
+ expect(@desc.recognised?('test_domain.http_456_has_reference')).to eq(true)
87
+ expect(@desc.recognised?('test_domain.http_567_has_references')).to eq(true)
88
+ end
89
+
90
+ it 'should not recognise invalid definitions' do
91
+ expect(@desc.recognised?('platform.invalid')).to eq(false)
92
+ expect(@desc.recognised?('generic.invalid')).to eq(false)
93
+ expect(@desc.recognised?('test_domain.invalid')).to eq(false)
94
+ expect(@desc.recognised?('invalid.malformed')).to eq(false)
95
+ end
96
+ end
97
+ end
98
+ end