ruby-livr 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +2 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +2 -0
  6. data/Gemfile.lock +45 -0
  7. data/Readme.md +119 -0
  8. data/lib/livr.rb +60 -0
  9. data/lib/livr/aliased_rule.rb +26 -0
  10. data/lib/livr/rule.rb +21 -0
  11. data/lib/livr/rules/common.rb +35 -0
  12. data/lib/livr/rules/meta.rb +200 -0
  13. data/lib/livr/rules/modifiers.rb +68 -0
  14. data/lib/livr/rules/numeric.rb +136 -0
  15. data/lib/livr/rules/special.rb +65 -0
  16. data/lib/livr/rules/string.rb +150 -0
  17. data/lib/livr/validator.rb +134 -0
  18. data/ruby-livr.gemspec +19 -0
  19. data/spec/01-test_suite_spec.rb +34 -0
  20. data/spec/02-aliases_spec.rb +21 -0
  21. data/spec/03-auto_trim_spec.rb +56 -0
  22. data/spec/04-custom_filters_spec.rb +54 -0
  23. data/spec/05-rules_replacement_spec.rb +67 -0
  24. data/spec/spec_helper.rb +3 -0
  25. data/spec/test_suite/aliases_negative/01-adult_age/aliases.json +12 -0
  26. data/spec/test_suite/aliases_negative/01-adult_age/errors.json +6 -0
  27. data/spec/test_suite/aliases_negative/01-adult_age/input.json +11 -0
  28. data/spec/test_suite/aliases_negative/01-adult_age/rules.json +10 -0
  29. data/spec/test_suite/aliases_negative/02-address/aliases.json +20 -0
  30. data/spec/test_suite/aliases_negative/02-address/errors.json +8 -0
  31. data/spec/test_suite/aliases_negative/02-address/input.json +13 -0
  32. data/spec/test_suite/aliases_negative/02-address/rules.json +4 -0
  33. data/spec/test_suite/aliases_negative/03-adult_age_in_user/aliases.json +31 -0
  34. data/spec/test_suite/aliases_negative/03-adult_age_in_user/errors.json +8 -0
  35. data/spec/test_suite/aliases_negative/03-adult_age_in_user/input.json +14 -0
  36. data/spec/test_suite/aliases_negative/03-adult_age_in_user/rules.json +4 -0
  37. data/spec/test_suite/aliases_positive/01-adult_age/aliases.json +12 -0
  38. data/spec/test_suite/aliases_positive/01-adult_age/input.json +11 -0
  39. data/spec/test_suite/aliases_positive/01-adult_age/output.json +10 -0
  40. data/spec/test_suite/aliases_positive/01-adult_age/rules.json +10 -0
  41. data/spec/test_suite/aliases_positive/02-address/aliases.json +20 -0
  42. data/spec/test_suite/aliases_positive/02-address/input.json +13 -0
  43. data/spec/test_suite/aliases_positive/02-address/output.json +12 -0
  44. data/spec/test_suite/aliases_positive/02-address/rules.json +4 -0
  45. data/spec/test_suite/aliases_positive/03-adult_age_in_user/aliases.json +31 -0
  46. data/spec/test_suite/aliases_positive/03-adult_age_in_user/input.json +14 -0
  47. data/spec/test_suite/aliases_positive/03-adult_age_in_user/output.json +12 -0
  48. data/spec/test_suite/aliases_positive/03-adult_age_in_user/rules.json +4 -0
  49. data/spec/test_suite/negative/01-required/errors.json +5 -0
  50. data/spec/test_suite/negative/01-required/input.json +10 -0
  51. data/spec/test_suite/negative/01-required/rules.json +10 -0
  52. data/spec/test_suite/negative/02-not_empty/errors.json +3 -0
  53. data/spec/test_suite/negative/02-not_empty/input.json +10 -0
  54. data/spec/test_suite/negative/02-not_empty/rules.json +10 -0
  55. data/spec/test_suite/negative/03-one_of/errors.json +11 -0
  56. data/spec/test_suite/negative/03-one_of/input.json +12 -0
  57. data/spec/test_suite/negative/03-one_of/rules.json +11 -0
  58. data/spec/test_suite/negative/04-min_length/errors.json +10 -0
  59. data/spec/test_suite/negative/04-min_length/input.json +12 -0
  60. data/spec/test_suite/negative/04-min_length/rules.json +11 -0
  61. data/spec/test_suite/negative/05-max_length/errors.json +10 -0
  62. data/spec/test_suite/negative/05-max_length/input.json +12 -0
  63. data/spec/test_suite/negative/05-max_length/rules.json +11 -0
  64. data/spec/test_suite/negative/06-length_equal/errors.json +10 -0
  65. data/spec/test_suite/negative/06-length_equal/input.json +12 -0
  66. data/spec/test_suite/negative/06-length_equal/rules.json +11 -0
  67. data/spec/test_suite/negative/07-length_between/errors.json +10 -0
  68. data/spec/test_suite/negative/07-length_between/input.json +12 -0
  69. data/spec/test_suite/negative/07-length_between/rules.json +11 -0
  70. data/spec/test_suite/negative/08-like/errors.json +11 -0
  71. data/spec/test_suite/negative/08-like/input.json +14 -0
  72. data/spec/test_suite/negative/08-like/rules.json +12 -0
  73. data/spec/test_suite/negative/09-integer/errors.json +11 -0
  74. data/spec/test_suite/negative/09-integer/input.json +13 -0
  75. data/spec/test_suite/negative/09-integer/rules.json +12 -0
  76. data/spec/test_suite/negative/10-positive_integer/errors.json +11 -0
  77. data/spec/test_suite/negative/10-positive_integer/input.json +13 -0
  78. data/spec/test_suite/negative/10-positive_integer/rules.json +12 -0
  79. data/spec/test_suite/negative/11-decimal/errors.json +11 -0
  80. data/spec/test_suite/negative/11-decimal/input.json +13 -0
  81. data/spec/test_suite/negative/11-decimal/rules.json +12 -0
  82. data/spec/test_suite/negative/12-positive_decimal/errors.json +11 -0
  83. data/spec/test_suite/negative/12-positive_decimal/input.json +13 -0
  84. data/spec/test_suite/negative/12-positive_decimal/rules.json +12 -0
  85. data/spec/test_suite/negative/13-max_number/errors.json +10 -0
  86. data/spec/test_suite/negative/13-max_number/input.json +12 -0
  87. data/spec/test_suite/negative/13-max_number/rules.json +11 -0
  88. data/spec/test_suite/negative/14-min_number/errors.json +11 -0
  89. data/spec/test_suite/negative/14-min_number/input.json +13 -0
  90. data/spec/test_suite/negative/14-min_number/rules.json +12 -0
  91. data/spec/test_suite/negative/15-number_beetween/errors.json +12 -0
  92. data/spec/test_suite/negative/15-number_beetween/input.json +14 -0
  93. data/spec/test_suite/negative/15-number_beetween/rules.json +13 -0
  94. data/spec/test_suite/negative/16-email/errors.json +12 -0
  95. data/spec/test_suite/negative/16-email/input.json +14 -0
  96. data/spec/test_suite/negative/16-email/rules.json +13 -0
  97. data/spec/test_suite/negative/17-equal_to_field/errors.json +10 -0
  98. data/spec/test_suite/negative/17-equal_to_field/input.json +12 -0
  99. data/spec/test_suite/negative/17-equal_to_field/rules.json +11 -0
  100. data/spec/test_suite/negative/18-nested_object/errors.json +9 -0
  101. data/spec/test_suite/negative/18-nested_object/input.json +9 -0
  102. data/spec/test_suite/negative/18-nested_object/rules.json +9 -0
  103. data/spec/test_suite/negative/19-list_of/errors.json +6 -0
  104. data/spec/test_suite/negative/19-list_of/input.json +6 -0
  105. data/spec/test_suite/negative/19-list_of/rules.json +14 -0
  106. data/spec/test_suite/negative/20-list_of_objects/errors.json +14 -0
  107. data/spec/test_suite/negative/20-list_of_objects/input.json +18 -0
  108. data/spec/test_suite/negative/20-list_of_objects/rules.json +7 -0
  109. data/spec/test_suite/negative/21-list_of_different_objects/errors.json +17 -0
  110. data/spec/test_suite/negative/21-list_of_different_objects/input.json +26 -0
  111. data/spec/test_suite/negative/21-list_of_different_objects/rules.json +17 -0
  112. data/spec/test_suite/negative/22-not_empty_list/errors.json +7 -0
  113. data/spec/test_suite/negative/22-not_empty_list/input.json +6 -0
  114. data/spec/test_suite/negative/22-not_empty_list/rules.json +7 -0
  115. data/spec/test_suite/negative/23-url/errors.json +10 -0
  116. data/spec/test_suite/negative/23-url/input.json +12 -0
  117. data/spec/test_suite/negative/23-url/rules.json +11 -0
  118. data/spec/test_suite/negative/24-iso_date/errors.json +11 -0
  119. data/spec/test_suite/negative/24-iso_date/input.json +13 -0
  120. data/spec/test_suite/negative/24-iso_date/rules.json +12 -0
  121. data/spec/test_suite/negative/25-eq/errors.json +13 -0
  122. data/spec/test_suite/negative/25-eq/input.json +14 -0
  123. data/spec/test_suite/negative/25-eq/rules.json +13 -0
  124. data/spec/test_suite/negative/26-string/errors.json +6 -0
  125. data/spec/test_suite/negative/26-string/input.json +6 -0
  126. data/spec/test_suite/negative/26-string/rules.json +6 -0
  127. data/spec/test_suite/negative/27-any_object/errors.json +6 -0
  128. data/spec/test_suite/negative/27-any_object/input.json +6 -0
  129. data/spec/test_suite/negative/27-any_object/rules.json +6 -0
  130. data/spec/test_suite/negative/28-variable_object/errors.json +15 -0
  131. data/spec/test_suite/negative/28-variable_object/input.json +24 -0
  132. data/spec/test_suite/negative/28-variable_object/rules.json +77 -0
  133. data/spec/test_suite/negative/29-or/errors.json +14 -0
  134. data/spec/test_suite/negative/29-or/input.json +20 -0
  135. data/spec/test_suite/negative/29-or/rules.json +19 -0
  136. data/spec/test_suite/positive/01-required/input.json +7 -0
  137. data/spec/test_suite/positive/01-required/output.json +6 -0
  138. data/spec/test_suite/positive/01-required/rules.json +6 -0
  139. data/spec/test_suite/positive/02-not_empty/input.json +6 -0
  140. data/spec/test_suite/positive/02-not_empty/output.json +5 -0
  141. data/spec/test_suite/positive/02-not_empty/rules.json +6 -0
  142. data/spec/test_suite/positive/03-one_of/input.json +11 -0
  143. data/spec/test_suite/positive/03-one_of/output.json +10 -0
  144. data/spec/test_suite/positive/03-one_of/rules.json +10 -0
  145. data/spec/test_suite/positive/04-min_length/input.json +8 -0
  146. data/spec/test_suite/positive/04-min_length/output.json +7 -0
  147. data/spec/test_suite/positive/04-min_length/rules.json +8 -0
  148. data/spec/test_suite/positive/05-max_length/input.json +9 -0
  149. data/spec/test_suite/positive/05-max_length/output.json +8 -0
  150. data/spec/test_suite/positive/05-max_length/rules.json +9 -0
  151. data/spec/test_suite/positive/06-length_equal/input.json +8 -0
  152. data/spec/test_suite/positive/06-length_equal/output.json +7 -0
  153. data/spec/test_suite/positive/06-length_equal/rules.json +8 -0
  154. data/spec/test_suite/positive/07-length_between/input.json +9 -0
  155. data/spec/test_suite/positive/07-length_between/output.json +8 -0
  156. data/spec/test_suite/positive/07-length_between/rules.json +9 -0
  157. data/spec/test_suite/positive/08-like/input.json +8 -0
  158. data/spec/test_suite/positive/08-like/output.json +7 -0
  159. data/spec/test_suite/positive/08-like/rules.json +8 -0
  160. data/spec/test_suite/positive/09-integer/input.json +7 -0
  161. data/spec/test_suite/positive/09-integer/output.json +6 -0
  162. data/spec/test_suite/positive/09-integer/rules.json +7 -0
  163. data/spec/test_suite/positive/10-positive_integer/input.json +7 -0
  164. data/spec/test_suite/positive/10-positive_integer/output.json +6 -0
  165. data/spec/test_suite/positive/10-positive_integer/rules.json +6 -0
  166. data/spec/test_suite/positive/11-decimal/input.json +8 -0
  167. data/spec/test_suite/positive/11-decimal/output.json +7 -0
  168. data/spec/test_suite/positive/11-decimal/rules.json +7 -0
  169. data/spec/test_suite/positive/12-positive_decimal/input.json +8 -0
  170. data/spec/test_suite/positive/12-positive_decimal/output.json +7 -0
  171. data/spec/test_suite/positive/12-positive_decimal/rules.json +7 -0
  172. data/spec/test_suite/positive/13-max_number/input.json +7 -0
  173. data/spec/test_suite/positive/13-max_number/output.json +6 -0
  174. data/spec/test_suite/positive/13-max_number/rules.json +6 -0
  175. data/spec/test_suite/positive/14-min_number/input.json +7 -0
  176. data/spec/test_suite/positive/14-min_number/output.json +6 -0
  177. data/spec/test_suite/positive/14-min_number/rules.json +6 -0
  178. data/spec/test_suite/positive/15-number_between/input.json +8 -0
  179. data/spec/test_suite/positive/15-number_between/output.json +7 -0
  180. data/spec/test_suite/positive/15-number_between/rules.json +7 -0
  181. data/spec/test_suite/positive/16-email/input.json +7 -0
  182. data/spec/test_suite/positive/16-email/output.json +6 -0
  183. data/spec/test_suite/positive/16-email/rules.json +6 -0
  184. data/spec/test_suite/positive/17-equal_to_field/input.json +7 -0
  185. data/spec/test_suite/positive/17-equal_to_field/output.json +6 -0
  186. data/spec/test_suite/positive/17-equal_to_field/rules.json +6 -0
  187. data/spec/test_suite/positive/18-nested_object/input.json +15 -0
  188. data/spec/test_suite/positive/18-nested_object/output.json +12 -0
  189. data/spec/test_suite/positive/18-nested_object/rules.json +13 -0
  190. data/spec/test_suite/positive/19-list_of/input.json +7 -0
  191. data/spec/test_suite/positive/19-list_of/output.json +7 -0
  192. data/spec/test_suite/positive/19-list_of/rules.json +15 -0
  193. data/spec/test_suite/positive/20-list_of_objects/input.json +17 -0
  194. data/spec/test_suite/positive/20-list_of_objects/output.json +17 -0
  195. data/spec/test_suite/positive/20-list_of_objects/rules.json +10 -0
  196. data/spec/test_suite/positive/21-list_of_different_objects/input.json +22 -0
  197. data/spec/test_suite/positive/21-list_of_different_objects/output.json +21 -0
  198. data/spec/test_suite/positive/21-list_of_different_objects/rules.json +27 -0
  199. data/spec/test_suite/positive/22-not_empty_list/input.json +6 -0
  200. data/spec/test_suite/positive/22-not_empty_list/output.json +5 -0
  201. data/spec/test_suite/positive/22-not_empty_list/rules.json +5 -0
  202. data/spec/test_suite/positive/23-url/input.json +7 -0
  203. data/spec/test_suite/positive/23-url/output.json +6 -0
  204. data/spec/test_suite/positive/23-url/rules.json +6 -0
  205. data/spec/test_suite/positive/24-iso_date/input.json +9 -0
  206. data/spec/test_suite/positive/24-iso_date/output.json +8 -0
  207. data/spec/test_suite/positive/24-iso_date/rules.json +8 -0
  208. data/spec/test_suite/positive/25-eq/input.json +10 -0
  209. data/spec/test_suite/positive/25-eq/output.json +9 -0
  210. data/spec/test_suite/positive/25-eq/rules.json +9 -0
  211. data/spec/test_suite/positive/26-string/input.json +8 -0
  212. data/spec/test_suite/positive/26-string/output.json +7 -0
  213. data/spec/test_suite/positive/26-string/rules.json +7 -0
  214. data/spec/test_suite/positive/27-any_object/input.json +6 -0
  215. data/spec/test_suite/positive/27-any_object/output.json +6 -0
  216. data/spec/test_suite/positive/27-any_object/rules.json +7 -0
  217. data/spec/test_suite/positive/28-variable_object/input.json +19 -0
  218. data/spec/test_suite/positive/28-variable_object/output.json +18 -0
  219. data/spec/test_suite/positive/28-variable_object/rules.json +47 -0
  220. data/spec/test_suite/positive/29-or/input.json +25 -0
  221. data/spec/test_suite/positive/29-or/output.json +24 -0
  222. data/spec/test_suite/positive/29-or/rules.json +24 -0
  223. data/spec/test_suite/positive/30-trim/input.json +7 -0
  224. data/spec/test_suite/positive/30-trim/output.json +7 -0
  225. data/spec/test_suite/positive/30-trim/rules.json +7 -0
  226. data/spec/test_suite/positive/31-to_lc/input.json +8 -0
  227. data/spec/test_suite/positive/31-to_lc/output.json +8 -0
  228. data/spec/test_suite/positive/31-to_lc/rules.json +8 -0
  229. data/spec/test_suite/positive/32-to_uc/input.json +7 -0
  230. data/spec/test_suite/positive/32-to_uc/output.json +7 -0
  231. data/spec/test_suite/positive/32-to_uc/rules.json +7 -0
  232. data/spec/test_suite/positive/33-remove/input.json +5 -0
  233. data/spec/test_suite/positive/33-remove/output.json +5 -0
  234. data/spec/test_suite/positive/33-remove/rules.json +7 -0
  235. data/spec/test_suite/positive/34-leave_only/input.json +5 -0
  236. data/spec/test_suite/positive/34-leave_only/output.json +5 -0
  237. data/spec/test_suite/positive/34-leave_only/rules.json +7 -0
  238. data/spec/test_suite/positive/35-default/input.json +10 -0
  239. data/spec/test_suite/positive/35-default/output.json +12 -0
  240. data/spec/test_suite/positive/35-default/rules.json +12 -0
  241. metadata +532 -0
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = "ruby-livr"
3
+ gem.version = "2.0.0"
4
+ gem.date = "2017-12-22"
5
+ gem.summary = "Implementation of LIVR v2.0"
6
+ gem.description = "Language Independent Validation Rules. Implements 2.0 specification"
7
+ gem.authors = ["Vitaliy Yanchuk"]
8
+ gem.email = 'fuksito@gmail.com'
9
+ gem.homepage = "https://github.com/fuksito/ruby-livr"
10
+ gem.license = "MIT"
11
+
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ gem.require_paths = ["lib"]
16
+
17
+ gem.add_dependency "activesupport", '~> 5'
18
+ gem.add_development_dependency "rspec", "3.7"
19
+ end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper.rb'
2
+
3
+ def read_file(dir, filename)
4
+ data = File.read dir.join("#{filename}.json")
5
+ JSON.parse(data)
6
+ end
7
+
8
+ RSpec.describe "test_suite " do
9
+
10
+ %w[ positive negative ].each do |spec_dir|
11
+ context spec_dir do
12
+ dirs = Pathname.new("#{SPEC_ROOT}/test_suite/#{spec_dir}").children.select(&:directory?)
13
+ dirs.each do |dir|
14
+ it dir.basename do
15
+ rules = read_file(dir, "rules")
16
+ input = read_file(dir, "input")
17
+
18
+ validator = LIVR::Validator.new(rules)
19
+ result = validator.validate(input)
20
+ errors = validator.get_errors
21
+
22
+ if spec_dir == 'positive'
23
+ expected_result = read_file(dir, "output")
24
+ expect(result).to eq(expected_result)
25
+ else
26
+ expected_errors = read_file(dir, "errors")
27
+ expect(errors).to eq(expected_errors)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper.rb'
2
+
3
+ RSpec.describe "aliases" do
4
+
5
+ it "Validates with aliased rules" do
6
+ validator = LIVR::Validator.new({
7
+ "password" => ["required", "strong_password"]
8
+ })
9
+ validator.register_aliased_rule({
10
+ "name" => 'strong_password',
11
+ "rules" => { "min_length" => 6 },
12
+ "error" => 'WEAK_PASSWORD'
13
+ })
14
+
15
+
16
+ output = validator.validate({ "password" => "abc" })
17
+ expect(output).to eq(false)
18
+ expect(validator.get_errors).to eq({"password" => "WEAK_PASSWORD"})
19
+ end
20
+
21
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper.rb'
2
+
3
+ RSpec.describe "auto_trim" do
4
+
5
+ let(:validator) do
6
+ LIVR::Validator.new({
7
+ code: "required",
8
+ password: [ "required", { "min_length" => 3 }],
9
+ address: { "nested_object" => {
10
+ street: { "min_length" => 5 },
11
+ }
12
+ }
13
+ }, true)
14
+ end
15
+
16
+ it "NEGATIVE: Validate data with automatic trim" do
17
+ output = validator.validate({
18
+ code: ' ',
19
+ password: ' 12 ',
20
+ address: {
21
+ street: ' hell '
22
+ }
23
+ })
24
+ # expect(output).to eq(false), 'should return false due to validation errors fot trimmed values'
25
+ expect(output).to eq(false)
26
+
27
+ expect(validator.get_errors).to eq({
28
+ code: 'REQUIRED',
29
+ password: 'TOO_SHORT',
30
+ address: {
31
+ street: 'TOO_SHORT',
32
+ }
33
+ })
34
+
35
+ end
36
+
37
+ it "POSITIVE: Validate data with automatic trim" do
38
+ clean_data = validator.validate({
39
+ code: ' A ',
40
+ password: ' 123 ',
41
+ address: {
42
+ street: ' hello '
43
+ }
44
+ })
45
+
46
+ expect(clean_data).to be_truthy, 'should return clean data'
47
+ expect(clean_data).to eq({
48
+ code: 'A',
49
+ password: '123',
50
+ address: {
51
+ street: 'hello',
52
+ }
53
+ }), 'Should contain error codes'
54
+ end
55
+
56
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper.rb'
2
+
3
+ RSpec.describe "custom_filters" do
4
+ class MyTrim < LIVR::Rule
5
+ def call(value, user_data, field_results)
6
+ return if is_no_value(value) || value.is_a?(Hash)
7
+ field_results << value.to_s.strip
8
+ return
9
+ end
10
+ end
11
+
12
+ class MyLc < LIVR::Rule
13
+ def call(value, user_data, field_results)
14
+ return if is_no_value(value) || value.is_a?(Hash)
15
+ field_results << value.to_s.downcase
16
+ return
17
+ end
18
+ end
19
+
20
+ class MyUcfirst < LIVR::Rule
21
+ def call(value, user_data, field_results)
22
+ return if is_no_value(value) || value.is_a?(Hash)
23
+ field_results << value[0].capitalize + value[1..-1]
24
+ return
25
+ end
26
+ end
27
+
28
+ LIVR::Validator.register_default_rules(
29
+ my_trim: MyTrim,
30
+ my_lc: MyLc,
31
+ my_ucfirst: MyUcfirst
32
+ )
33
+
34
+ it 'Validate data with registered rules' do
35
+ validator = LIVR::Validator.new(
36
+ "word1" => ['my_trim', 'my_lc', 'my_ucfirst'],
37
+ "word2" => ['my_trim', 'my_lc'],
38
+ "word3" => ['my_ucfirst'],
39
+ )
40
+
41
+ output = validator.validate(
42
+ "word1" => ' wordOne ',
43
+ "word2" => ' wordTwo ',
44
+ "word3" => 'wordThree ',
45
+ )
46
+
47
+ expect(output).to eq( "word1" => 'Wordone',
48
+ "word2" => 'wordtwo',
49
+ "word3" => 'WordThree ',
50
+ )
51
+ end
52
+
53
+ end
54
+
@@ -0,0 +1,67 @@
1
+ require 'spec_helper.rb'
2
+
3
+ RSpec.describe "rules_replacement" do
4
+
5
+ class PatchedRule < LIVR::Rule
6
+
7
+ def initialize(rule_name, rule_builder)
8
+ @rule_name = rule_name
9
+ @rule_builder = rule_builder
10
+ end
11
+
12
+ def new(*args)
13
+ @rule_args = args
14
+ @rule_validator = @rule_builder.new(*args)
15
+ self
16
+ end
17
+
18
+ def call(*args)
19
+ error_code = @rule_validator.call(*args)
20
+ if error_code
21
+ return {
22
+ "code" => error_code,
23
+ "rule" => { @rule_name => @rule_args }
24
+ }
25
+ end
26
+ end
27
+ end
28
+
29
+ it 'Validate data with registered rules' do
30
+ # Patch rules
31
+ default_rules = LIVR::DEFAULT_RULES
32
+
33
+ original_rules = {}
34
+ new_rules = {}
35
+ default_rules.each do |rule_name, rule_builder|
36
+ original_rules[rule_name] = rule_builder
37
+ new_rules[rule_name] = PatchedRule.new(rule_name, rule_builder)
38
+ end
39
+
40
+ LIVR::Validator.register_default_rules(new_rules)
41
+
42
+ # Test
43
+ validator = LIVR::Validator.new({
44
+ "name" => ['required'],
45
+ "phone" => { "max_length" => 10 }
46
+ })
47
+
48
+ output = validator.validate({
49
+ "phone" => '123456789123456'
50
+ })
51
+
52
+ expect(output).to eq(false)
53
+ expect(validator.get_errors).to eq({
54
+ "name" => {
55
+ "code" => 'REQUIRED',
56
+ "rule" => { "required" => [] },
57
+ },
58
+ "phone" => {
59
+ "code" => 'TOO_LONG',
60
+ "rule" => { "max_length" => [10] },
61
+ }
62
+ })
63
+
64
+ # Restore
65
+ LIVR::Validator.register_default_rules(original_rules)
66
+ end
67
+ end
@@ -0,0 +1,3 @@
1
+ SPEC_ROOT = File.dirname(__FILE__)
2
+
3
+ require_relative "../lib/livr.rb"
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "name": "adult_age",
4
+ "rules": ["positive_integer", {"min_number": 18}]
5
+ },
6
+
7
+ {
8
+ "name": "adult_age_with_custom_error",
9
+ "rules": ["positive_integer", {"min_number": 18}],
10
+ "error": "WRONG_AGE"
11
+ }
12
+ ]
@@ -0,0 +1,6 @@
1
+ {
2
+ "age3": "TOO_LOW",
3
+ "age4": "NOT_POSITIVE_INTEGER",
4
+ "age3_custom_error": "WRONG_AGE",
5
+ "age4_custom_error": "WRONG_AGE"
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "age1": 32,
3
+ "age2": 33,
4
+ "age3": 15,
5
+ "age4": -20,
6
+ "age1_custom_error": 37,
7
+ "age2_custom_error": 38,
8
+ "age3_custom_error": 16,
9
+ "age4_custom_error": -10,
10
+ "extra_field": 12
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "age1": "adult_age",
3
+ "age2": ["adult_age"],
4
+ "age3": [ { "adult_age": [] } ],
5
+ "age4": { "adult_age": [] },
6
+ "age1_custom_error": "adult_age_with_custom_error",
7
+ "age2_custom_error": ["adult_age_with_custom_error"],
8
+ "age3_custom_error": [ { "adult_age_with_custom_error": [] } ],
9
+ "age4_custom_error": { "adult_age_with_custom_error": [] }
10
+ }
@@ -0,0 +1,20 @@
1
+ [
2
+ {
3
+ "name": "address",
4
+ "rules": { "nested_object":{
5
+ "street": "required",
6
+ "zip": ["required", "positive_integer"],
7
+ "city": {"one_of": ["Kiev", "Kharkiv"] }
8
+ }}
9
+ },
10
+
11
+ {
12
+ "name": "address_with_custom_error",
13
+ "rules": { "nested_object":{
14
+ "street": "required",
15
+ "zip": ["required", "positive_integer"],
16
+ "city": {"one_of": ["Kiev", "Kharkiv"] }
17
+ }},
18
+ "error": "WRONG_ADDRESS"
19
+ }
20
+ ]
@@ -0,0 +1,8 @@
1
+ {
2
+ "address": {
3
+ "street": "REQUIRED",
4
+ "zip": "NOT_POSITIVE_INTEGER",
5
+ "city": "NOT_ALLOWED_VALUE"
6
+ },
7
+ "address_custom_error": "WRONG_ADDRESS"
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "address": {
3
+ "street": "",
4
+ "zip": -1232131,
5
+ "city": "Moscow"
6
+ },
7
+ "address_custom_error": {
8
+ "street": "My street",
9
+ "zip": "12312",
10
+ "city": "Moscow"
11
+ },
12
+ "extra_field": 12
13
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "address": "address",
3
+ "address_custom_error": "address_with_custom_error"
4
+ }
@@ -0,0 +1,31 @@
1
+ [
2
+ {
3
+ "name": "adult_age",
4
+ "rules": ["positive_integer", {"min_number": 18}]
5
+ },
6
+
7
+ {
8
+ "name": "adult_age_with_custom_error",
9
+ "rules": ["positive_integer", {"min_number": 18}],
10
+ "error": "WRONG_AGE"
11
+ },
12
+
13
+ {
14
+ "name": "user",
15
+ "rules": { "nested_object":{
16
+ "name": "required",
17
+ "age1": "adult_age",
18
+ "age2": "adult_age_with_custom_error"
19
+ }}
20
+ },
21
+
22
+ {
23
+ "name": "user_with_custom_error",
24
+ "rules": { "nested_object":{
25
+ "name": "required",
26
+ "age1": "adult_age",
27
+ "age2": "adult_age_with_custom_error"
28
+ }},
29
+ "error": "WRONG_USER"
30
+ }
31
+ ]
@@ -0,0 +1,8 @@
1
+ {
2
+ "user": {
3
+ "name": "REQUIRED",
4
+ "age1": "TOO_LOW",
5
+ "age2": "WRONG_AGE"
6
+ },
7
+ "user_custom_error": "WRONG_USER"
8
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "user": {
3
+ "name": "",
4
+ "age1": 15,
5
+ "age2": 15,
6
+ "extra_field": "som value"
7
+ },
8
+ "user_custom_error": {
9
+ "name": "koorchik",
10
+ "age1": 15,
11
+ "age2": 22
12
+ },
13
+ "extra_field": 12
14
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "user": "user",
3
+ "user_custom_error": ["user_with_custom_error"]
4
+ }
@@ -0,0 +1,12 @@
1
+ [
2
+ {
3
+ "name": "adult_age",
4
+ "rules": ["positive_integer", {"min_number": 18}]
5
+ },
6
+
7
+ {
8
+ "name": "adult_age_with_custom_error",
9
+ "rules": ["positive_integer", {"min_number": 18}],
10
+ "error": "WRONG_AGE"
11
+ }
12
+ ]
@@ -0,0 +1,11 @@
1
+ {
2
+ "age1": 32,
3
+ "age2": 33,
4
+ "age3": 35,
5
+ "age4": 36,
6
+ "age1_custom_error": 37,
7
+ "age2_custom_error": 38,
8
+ "age3_custom_error": 100,
9
+ "age4_custom_error": 110,
10
+ "extra_field": 12
11
+ }