LittleWeasel 3.0.4 → 5.0.1

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 (153) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/codeql-analysis.yml +72 -0
  3. data/.gitignore +19 -17
  4. data/.reek.yml +17 -0
  5. data/.rspec +4 -2
  6. data/.rubocop.yml +187 -0
  7. data/.ruby-version +1 -1
  8. data/.yardopts +2 -0
  9. data/CHANGELOG.md +21 -1
  10. data/Gemfile +3 -1
  11. data/Gemfile.lock +114 -0
  12. data/Jenkinsfile +20 -0
  13. data/LittleWeasel.gemspec +31 -18
  14. data/README.md +408 -42
  15. data/Rakefile +296 -3
  16. data/lib/LittleWeasel/block_results.rb +81 -0
  17. data/lib/LittleWeasel/configure.rb +98 -0
  18. data/lib/LittleWeasel/dictionary.rb +125 -0
  19. data/lib/LittleWeasel/dictionary_key.rb +48 -0
  20. data/lib/LittleWeasel/dictionary_manager.rb +91 -0
  21. data/lib/LittleWeasel/errors/dictionary_file_already_loaded_error.rb +9 -0
  22. data/lib/LittleWeasel/errors/dictionary_file_empty_error.rb +8 -0
  23. data/lib/LittleWeasel/errors/dictionary_file_not_found_error.rb +8 -0
  24. data/lib/LittleWeasel/errors/dictionary_file_too_large_error.rb +16 -0
  25. data/lib/LittleWeasel/errors/language_required_error.rb +8 -0
  26. data/lib/LittleWeasel/errors/must_override_error.rb +8 -0
  27. data/lib/LittleWeasel/filters/en_us/currency_filter.rb +19 -0
  28. data/lib/LittleWeasel/filters/en_us/numeric_filter.rb +19 -0
  29. data/lib/LittleWeasel/filters/en_us/single_character_word_filter.rb +21 -0
  30. data/lib/LittleWeasel/filters/word_filter.rb +59 -0
  31. data/lib/LittleWeasel/filters/word_filter_managable.rb +80 -0
  32. data/lib/LittleWeasel/filters/word_filter_validatable.rb +31 -0
  33. data/lib/LittleWeasel/filters/word_filterable.rb +19 -0
  34. data/lib/LittleWeasel/filters/word_filters_validatable.rb +29 -0
  35. data/lib/LittleWeasel/metadata/dictionary_metadata.rb +145 -0
  36. data/lib/LittleWeasel/metadata/invalid_words_metadata.rb +134 -0
  37. data/lib/LittleWeasel/metadata/invalid_words_service_results.rb +45 -0
  38. data/lib/LittleWeasel/metadata/metadata_observable_validatable.rb +22 -0
  39. data/lib/LittleWeasel/metadata/metadata_observerable.rb +90 -0
  40. data/lib/LittleWeasel/metadata/metadatable.rb +134 -0
  41. data/lib/LittleWeasel/modules/class_name_to_symbol.rb +26 -0
  42. data/lib/LittleWeasel/modules/configurable.rb +26 -0
  43. data/lib/LittleWeasel/modules/deep_dup.rb +11 -0
  44. data/lib/LittleWeasel/modules/dictionary_cache_keys.rb +34 -0
  45. data/lib/LittleWeasel/modules/dictionary_cache_servicable.rb +26 -0
  46. data/lib/LittleWeasel/modules/dictionary_cache_validatable.rb +18 -0
  47. data/lib/LittleWeasel/modules/dictionary_creator_servicable.rb +27 -0
  48. data/lib/LittleWeasel/modules/dictionary_file_loader.rb +67 -0
  49. data/lib/LittleWeasel/modules/dictionary_key_validatable.rb +17 -0
  50. data/lib/LittleWeasel/modules/dictionary_keyable.rb +24 -0
  51. data/lib/LittleWeasel/modules/dictionary_metadata_servicable.rb +29 -0
  52. data/lib/LittleWeasel/modules/dictionary_metadata_validatable.rb +15 -0
  53. data/lib/LittleWeasel/modules/dictionary_source_validatable.rb +15 -0
  54. data/lib/LittleWeasel/modules/dictionary_sourceable.rb +86 -0
  55. data/lib/LittleWeasel/modules/dictionary_validatable.rb +18 -0
  56. data/lib/LittleWeasel/modules/language.rb +24 -0
  57. data/lib/LittleWeasel/modules/language_validatable.rb +14 -0
  58. data/lib/LittleWeasel/modules/locale.rb +23 -0
  59. data/lib/LittleWeasel/modules/order_validatable.rb +16 -0
  60. data/lib/LittleWeasel/modules/orderable.rb +17 -0
  61. data/lib/LittleWeasel/modules/region.rb +24 -0
  62. data/lib/LittleWeasel/modules/region_validatable.rb +14 -0
  63. data/lib/LittleWeasel/modules/tag_validatable.rb +14 -0
  64. data/lib/LittleWeasel/modules/taggable.rb +31 -0
  65. data/lib/LittleWeasel/modules/word_results_validatable.rb +28 -0
  66. data/lib/LittleWeasel/preprocessors/en_us/capitalize_preprocessor.rb +22 -0
  67. data/lib/LittleWeasel/preprocessors/preprocessed_word.rb +29 -0
  68. data/lib/LittleWeasel/preprocessors/preprocessed_word_validatable.rb +56 -0
  69. data/lib/LittleWeasel/preprocessors/preprocessed_words.rb +59 -0
  70. data/lib/LittleWeasel/preprocessors/preprocessed_words_validatable.rb +28 -0
  71. data/lib/LittleWeasel/preprocessors/word_preprocessable.rb +19 -0
  72. data/lib/LittleWeasel/preprocessors/word_preprocessor.rb +123 -0
  73. data/lib/LittleWeasel/preprocessors/word_preprocessor_managable.rb +114 -0
  74. data/lib/LittleWeasel/preprocessors/word_preprocessor_validatable.rb +40 -0
  75. data/lib/LittleWeasel/preprocessors/word_preprocessors_validatable.rb +24 -0
  76. data/lib/LittleWeasel/services/dictionary_cache_service.rb +211 -0
  77. data/lib/LittleWeasel/services/dictionary_creator_service.rb +94 -0
  78. data/lib/LittleWeasel/services/dictionary_file_loader_service.rb +37 -0
  79. data/lib/LittleWeasel/services/dictionary_killer_service.rb +35 -0
  80. data/lib/LittleWeasel/services/dictionary_metadata_service.rb +116 -0
  81. data/lib/LittleWeasel/services/invalid_words_service.rb +59 -0
  82. data/lib/LittleWeasel/version.rb +3 -1
  83. data/lib/LittleWeasel/word_results.rb +146 -0
  84. data/lib/LittleWeasel.rb +72 -186
  85. data/spec/factories/dictionary.rb +43 -0
  86. data/spec/factories/dictionary_cache_service.rb +95 -0
  87. data/spec/factories/dictionary_creator_service.rb +16 -0
  88. data/spec/factories/dictionary_file_loader_service.rb +13 -0
  89. data/spec/factories/dictionary_hash.rb +39 -0
  90. data/spec/factories/dictionary_key.rb +14 -0
  91. data/spec/factories/dictionary_killer_service.rb +14 -0
  92. data/spec/factories/dictionary_manager.rb +10 -0
  93. data/spec/factories/dictionary_metadata.rb +16 -0
  94. data/spec/factories/dictionary_metadata_service.rb +16 -0
  95. data/spec/factories/numeric_filter.rb +12 -0
  96. data/spec/factories/preprocessed_word.rb +16 -0
  97. data/spec/factories/preprocessed_words.rb +41 -0
  98. data/spec/factories/single_character_word_filter.rb +12 -0
  99. data/spec/factories/word_results.rb +16 -0
  100. data/spec/lib/LittleWeasel/block_results_spec.rb +248 -0
  101. data/spec/lib/LittleWeasel/configure_spec.rb +74 -0
  102. data/spec/lib/LittleWeasel/dictionary_key_spec.rb +118 -0
  103. data/spec/lib/LittleWeasel/dictionary_manager_spec.rb +166 -0
  104. data/spec/lib/LittleWeasel/dictionary_spec.rb +289 -0
  105. data/spec/lib/LittleWeasel/filters/en_us/currency_filter_spec.rb +80 -0
  106. data/spec/lib/LittleWeasel/filters/en_us/numeric_filter_spec.rb +66 -0
  107. data/spec/lib/LittleWeasel/filters/en_us/single_character_word_filter_spec.rb +58 -0
  108. data/spec/lib/LittleWeasel/filters/word_filter_managable_spec.rb +180 -0
  109. data/spec/lib/LittleWeasel/filters/word_filter_spec.rb +151 -0
  110. data/spec/lib/LittleWeasel/filters/word_filter_validatable_spec.rb +94 -0
  111. data/spec/lib/LittleWeasel/filters/word_filters_validatable_spec.rb +48 -0
  112. data/spec/lib/LittleWeasel/integraton_tests/dictionary_integration_spec.rb +201 -0
  113. data/spec/lib/LittleWeasel/metadata/dictionary_creator_servicable_spec.rb +54 -0
  114. data/spec/lib/LittleWeasel/metadata/dictionary_metadata_spec.rb +209 -0
  115. data/spec/lib/LittleWeasel/metadata/invalid_words_metadata_spec.rb +155 -0
  116. data/spec/lib/LittleWeasel/metadata/metadata_observerable_spec.rb +31 -0
  117. data/spec/lib/LittleWeasel/metadata/metadatable_spec.rb +35 -0
  118. data/spec/lib/LittleWeasel/modules/class_name_to_symbol_spec.rb +21 -0
  119. data/spec/lib/LittleWeasel/modules/dictionary_file_loader_spec.rb +125 -0
  120. data/spec/lib/LittleWeasel/modules/dictionary_sourceable_spec.rb +81 -0
  121. data/spec/lib/LittleWeasel/modules/language_spec.rb +112 -0
  122. data/spec/lib/LittleWeasel/modules/locale_spec.rb +95 -0
  123. data/spec/lib/LittleWeasel/modules/region_spec.rb +112 -0
  124. data/spec/lib/LittleWeasel/preprocessors/en_us/capitalize_preprocessor_spec.rb +34 -0
  125. data/spec/lib/LittleWeasel/preprocessors/preprocessed_word_spec.rb +105 -0
  126. data/spec/lib/LittleWeasel/preprocessors/preprocessed_word_validatable_spec.rb +143 -0
  127. data/spec/lib/LittleWeasel/preprocessors/preprocessed_words_spec.rb +77 -0
  128. data/spec/lib/LittleWeasel/preprocessors/preprocessed_words_validatable_spec.rb +58 -0
  129. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_managable_spec.rb +242 -0
  130. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_spec.rb +218 -0
  131. data/spec/lib/LittleWeasel/preprocessors/word_preprocessor_validatable_spec.rb +109 -0
  132. data/spec/lib/LittleWeasel/preprocessors/word_preprocessors_validatable_spec.rb +49 -0
  133. data/spec/lib/LittleWeasel/services/dictionary_cache_service_spec.rb +444 -0
  134. data/spec/lib/LittleWeasel/services/dictionary_creator_service_spec.rb +119 -0
  135. data/spec/lib/LittleWeasel/services/dictionary_file_loader_service_spec.rb +71 -0
  136. data/spec/lib/LittleWeasel/services/dictionary_metadata_service_spec.rb +279 -0
  137. data/spec/lib/LittleWeasel/word_results_spec.rb +275 -0
  138. data/spec/lib/LittleWeasel/workflow/workflow_spec.rb +20 -0
  139. data/spec/spec_helper.rb +117 -6
  140. data/spec/support/factory_bot.rb +15 -0
  141. data/spec/support/file_helpers.rb +46 -0
  142. data/spec/support/files/empty-dictionary.txt +0 -0
  143. data/{lib/dictionary → spec/support/files/en-US-big.txt} +262156 -31488
  144. data/spec/support/files/en-US-tagged.txt +26 -0
  145. data/spec/support/files/en-US.txt +26 -0
  146. data/spec/support/files/en.txt +26 -0
  147. data/spec/support/files/es-ES.txt +27 -0
  148. data/spec/support/files/es.txt +27 -0
  149. data/spec/support/general_helpers.rb +68 -0
  150. data/spec/support/shared_contexts.rb +107 -0
  151. data/spec/support/shared_examples.rb +105 -0
  152. metadata +418 -70
  153. data/spec/checker/checker_spec.rb +0 -286
@@ -0,0 +1,218 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::WordPreprocessor do
6
+ subject do
7
+ word_preprocessor = described_class.new order: order
8
+ word_preprocessor.preprocessor_on = preprocessor_on
9
+ word_preprocessor
10
+ end
11
+
12
+ let(:preprocessor_on) { true }
13
+ let(:order) { 0 }
14
+ let(:word) { 'word' }
15
+
16
+ #.new
17
+ describe '.new' do
18
+ context 'when arguments are valid' do
19
+ it 'instantiates the object' do
20
+ expect { subject }.to_not raise_error
21
+ end
22
+ end
23
+
24
+ context 'when arguments are INVALID' do
25
+ context 'when argument order is invalid' do
26
+ context 'when order is not an Integer' do
27
+ let(:order) { :not_an_integer }
28
+
29
+ it 'raises an error' do
30
+ expect { subject }.to raise_error(/Argument order is not an Integer/)
31
+ end
32
+ end
33
+
34
+ context 'when order is negative' do
35
+ let(:order) { -1 }
36
+
37
+ it 'raises an error' do
38
+ expect { subject }.to raise_error "Argument order '#{order}' is not a a number from 0-n"
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'when argument preprocessor_on is invalid' do
44
+ context 'when preprocessor_on is not true or false' do
45
+ let(:preprocessor_on) { :not_true_or_false }
46
+
47
+ it 'raises an error' do
48
+ expect { subject }.to raise_error "Argument value is not true or false: #{preprocessor_on}"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ #.preprocess
56
+ describe '.preprocess' do
57
+ context 'when not overridden' do
58
+ it 'raises an error' do
59
+ expect { subject.class.preprocess word }.to raise_error LittleWeasel::Errors::MustOverrideError
60
+ end
61
+ end
62
+ end
63
+
64
+ #preprocessor_on
65
+ describe '#preprocessor_on' do
66
+ context 'when set to true' do
67
+ before do
68
+ subject.preprocessor_on = true
69
+ end
70
+
71
+ it 'returns true' do
72
+ expect(subject.preprocessor_on).to eq true
73
+ end
74
+ end
75
+
76
+ context 'when set to false' do
77
+ before do
78
+ subject.preprocessor_on = false
79
+ end
80
+
81
+ it 'returns false' do
82
+ expect(subject.preprocessor_on).to eq false
83
+ end
84
+ end
85
+ end
86
+
87
+ #preprocessor_on!
88
+ describe '#preprocessor_on!' do
89
+ before do
90
+ expect(subject.preprocessor_off?).to eq true
91
+ end
92
+
93
+ let(:preprocessor_on) { false }
94
+
95
+ it 'turns the preprocessor on' do
96
+ subject.preprocessor_on!
97
+ expect(subject.preprocessor_on).to eq true
98
+ end
99
+ end
100
+
101
+ #preprocessor_on?
102
+ describe '#preprocessor_on?' do
103
+ context 'when #preprocessor_on is true' do
104
+ it 'returns true' do
105
+ expect(subject.preprocessor_on?).to eq true
106
+ end
107
+ end
108
+
109
+ context 'when #preprocessor_on is false' do
110
+ let(:preprocessor_on) { false }
111
+
112
+ it 'returns false' do
113
+ expect(subject.preprocessor_on?).to eq false
114
+ end
115
+ end
116
+ end
117
+
118
+ #preprocess
119
+ describe '#preprocess' do
120
+ context 'when not overridden' do
121
+ it 'raises an error' do
122
+ expect { subject.preprocess 'x' }.to raise_error LittleWeasel::Errors::MustOverrideError
123
+ end
124
+ end
125
+
126
+ context 'when overridden' do
127
+ before do
128
+ allow(described_class).to receive(:preprocess?)
129
+ .and_return true
130
+ allow(described_class).to receive(:preprocess)
131
+ .and_return [true, 'preprocessed-word']
132
+ end
133
+
134
+ context 'when #preprocessor_on? is true' do
135
+ it 'calls .preprocess and returns a ProcessedWord object' do
136
+ expect(described_class).to receive(:preprocess)
137
+ expect(subject.preprocess word).to be_kind_of LittleWeasel::Preprocessors::PreprocessedWord
138
+ end
139
+ end
140
+
141
+ context 'when #preprocessor_on? is false' do
142
+ let(:preprocessor_on) { false }
143
+
144
+ it 'does NOT call .preprocess and returns a ProcessedWord object' do
145
+ expect(described_class).to_not receive(:preprocess)
146
+ expect(subject.preprocess word).to be_kind_of LittleWeasel::Preprocessors::PreprocessedWord
147
+ end
148
+
149
+ end
150
+ end
151
+ end
152
+
153
+ #preprocess?
154
+ describe '#preprocess?' do
155
+ let(:word) { 'word' }
156
+
157
+ it 'returns true by default' do
158
+ expect(subject.preprocess? word).to be true
159
+ end
160
+
161
+ context 'when #preprocess? returns true' do
162
+ before { allow(subject.class).to receive(:preprocess?).and_return(true) }
163
+
164
+ context 'when #preprocessor_on? is true' do
165
+ it_behaves_like 'the preprocessor matches and #preprocessor_on? is true'
166
+ end
167
+
168
+ context 'when #preprocessor_on? is false' do
169
+ let(:preprocessor_on) { false }
170
+
171
+ it_behaves_like 'the preprocessor matches and #preprocessor_on? is false'
172
+ end
173
+ end
174
+
175
+ context 'when #preprocess? returns false' do
176
+ before { allow(subject.class).to receive(:preprocess?).and_return(false) }
177
+
178
+ context 'when #preprocessor_on? is true' do
179
+ it_behaves_like 'the preprocessor DOES NOT match and #preprocessor_on? is true'
180
+ end
181
+
182
+ context 'when #preprocessor_on? is false' do
183
+ let(:preprocessor_on) { false }
184
+
185
+ it_behaves_like 'the preprocessor DOES NOT match and #preprocessor_on? is false'
186
+ end
187
+ end
188
+ end
189
+
190
+ #preprocessor_off?
191
+ describe '#preprocessor_off?' do
192
+ context 'when #preprocessor_on is false' do
193
+ let(:preprocessor_on) { false }
194
+
195
+ it 'returns true' do
196
+ expect(subject.preprocessor_off?).to eq true
197
+ end
198
+ end
199
+
200
+ context 'when #preprocessor_on is true' do
201
+ it 'returns false' do
202
+ expect(subject.preprocessor_off?).to eq false
203
+ end
204
+ end
205
+ end
206
+
207
+ #preprocessor_off!
208
+ describe '#preprocessor_off!' do
209
+ before do
210
+ expect(subject.preprocessor_on?).to eq true
211
+ end
212
+
213
+ it 'turns the preprocessor off' do
214
+ subject.preprocessor_off!
215
+ expect(subject.preprocessor_on).to eq false
216
+ end
217
+ end
218
+ end
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::WordPreprocessorValidatable, type: :module do
6
+ subject { MockSubject.new }
7
+
8
+ WordPreprocessorValidatable = described_class
9
+
10
+ class MockSubject
11
+ include WordPreprocessorValidatable
12
+ end
13
+
14
+ class MockWordPreprocessor < LittleWeasel::Preprocessors::WordPreprocessor
15
+ def preprocess(word)
16
+ [true, "#{word}-preprocessed"]
17
+ end
18
+ end
19
+
20
+ let(:order) { 0 }
21
+ let(:preprocessor_on) { true }
22
+ let(:word_preprocessor) do
23
+ word_preprocessor = MockWordPreprocessor.new order: order
24
+ word_preprocessor.preprocessor_on = preprocessor_on
25
+ word_preprocessor
26
+ end
27
+
28
+ shared_examples 'an instance method is missing' do
29
+ before do
30
+ allow(word_preprocessor).to receive(:respond_to?).with(method).and_return(false)
31
+ end
32
+
33
+ it 'raises an error' do
34
+ expect { WordPreprocessorValidatable.validate_word_preprocessor word_preprocessor: word_preprocessor }.to raise_error expected_error_message
35
+ end
36
+ end
37
+
38
+ shared_examples 'a class method is missing' do
39
+ before do
40
+ allow(word_preprocessor.class).to receive(:respond_to?).with(method).and_return(false)
41
+ end
42
+
43
+ it 'raises an error' do
44
+ expect { WordPreprocessorValidatable.validate_word_preprocessor word_preprocessor: word_preprocessor }.to raise_error expected_error_message
45
+ end
46
+ end
47
+
48
+ #.validate_word_preprocessor
49
+ describe '.validate_word_preprocessor' do
50
+ before do
51
+ allow(word_preprocessor.class).to receive(:respond_to?).and_call_original
52
+ allow(word_preprocessor).to receive(:respond_to?).and_call_original
53
+ end
54
+
55
+ context 'when the object quacks right' do
56
+ it 'passes validation' do
57
+ expect { WordPreprocessorValidatable.validate_word_preprocessor word_preprocessor: word_preprocessor }.to_not raise_error
58
+ end
59
+ end
60
+
61
+ context 'when the object DOES NOT quack right' do
62
+ let(:expected_error_message) { /Argument word_preprocessor: does not respond to/ }
63
+
64
+ context 'when a class method is missing' do
65
+ context 'when the class does not respond to .preprocess' do
66
+ let(:method) { :preprocess }
67
+ it_behaves_like 'a class method is missing'
68
+ end
69
+
70
+ context 'when the class does not respond to .preprocess?' do
71
+ let(:method) { :preprocess? }
72
+ it_behaves_like 'a class method is missing'
73
+ end
74
+ end
75
+
76
+ context 'when an instance method is missing' do
77
+ context 'when the object does not respond to #preprocess' do
78
+ let(:method) { :preprocess }
79
+ it_behaves_like 'an instance method is missing'
80
+ end
81
+
82
+ context 'when the object does not respond to #preprocess?' do
83
+ let(:method) { :preprocess? }
84
+ it_behaves_like 'an instance method is missing'
85
+ end
86
+
87
+ context 'when the object does not respond to #preprocessor_off?' do
88
+ let(:method) { :preprocessor_off? }
89
+ it_behaves_like 'an instance method is missing'
90
+ end
91
+
92
+ context 'when the object does not respond to #preprocessor_on' do
93
+ let(:method) { :preprocessor_on }
94
+ it_behaves_like 'an instance method is missing'
95
+ end
96
+
97
+ context 'when the object does not respond to #preprocessor_on=' do
98
+ let(:method) { :preprocessor_on= }
99
+ it_behaves_like 'an instance method is missing'
100
+ end
101
+
102
+ context 'when the object does not respond to #preprocessor_on?' do
103
+ let(:method) { :preprocessor_on? }
104
+ it_behaves_like 'an instance method is missing'
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe LittleWeasel::Preprocessors::WordPreprocessorsValidatable, type: :module do
6
+ subject { MockSubject.new }
7
+
8
+ WordPreprocessorsValidatable = described_class
9
+
10
+ class MockSubject
11
+ include WordPreprocessorsValidatable
12
+ end
13
+
14
+ subject { MockSubject.new }
15
+
16
+ class MockWordPreprocessor < LittleWeasel::Preprocessors::WordPreprocessor
17
+ def initialize(order: 0)
18
+ super order: order
19
+ self.preprocessor_on = preprocessor_on
20
+ end
21
+
22
+ class << self
23
+ def preprocess(word) [true, "#{word}-0"]; end
24
+ end
25
+ end
26
+
27
+ #.validate_word_preprocessors
28
+ describe '.validate_word_preprocessors' do
29
+ context 'when passing a blank Array' do
30
+ it 'passes validaton' do
31
+ expect { WordPreprocessorsValidatable.validate_word_preprocessors(word_preprocessors: []) }.to_not raise_error
32
+ end
33
+ end
34
+
35
+ context 'when passing a an Array with valid word preprocessors' do
36
+ it 'passes validation' do
37
+ expect { WordPreprocessorsValidatable.validate_word_preprocessors(word_preprocessors: [MockWordPreprocessor.new]) }.to_not raise_error
38
+ end
39
+ end
40
+
41
+ context 'when passing an INVALID argument' do
42
+ context 'when passing an invalid Array' do
43
+ it 'raises an error' do
44
+ expect { WordPreprocessorsValidatable.validate_word_preprocessors(word_preprocessors: :not_an_array) }.to raise_error(/Argument word_preprocessors is not an Array/)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end