|
1 | 1 | # frozen_string_literal:true |
2 | 2 |
|
3 | 3 | describe Sequel::Plugins::EnumValues do |
4 | | - type_enum_values = %w[first second third] |
| 4 | + type_enum_values = %w[one another yet_another] |
5 | 5 | status_enum_values = %w[created selected canceled] |
6 | 6 | item_enum_values = type_enum_values + status_enum_values |
7 | 7 |
|
|
71 | 71 | end |
72 | 72 |
|
73 | 73 | describe '.configure' do |
| 74 | + let(:enum_values_options) { {} } |
| 75 | + |
| 76 | + before { item_class.plugin :enum_values, **enum_values_options } |
| 77 | + |
74 | 78 | describe 'caching option' do |
75 | 79 | shared_examples 'works correctly' do |
76 | 80 | before do |
|
107 | 111 | 5.times { item_class.enum_values(:type) } |
108 | 112 | end |
109 | 113 |
|
110 | | - before do |
111 | | - item_class.plugin :enum_values, caching: true |
112 | | - end |
113 | | - |
| 114 | + let(:enum_values_options) { { caching: true } } |
114 | 115 | let(:all_enum_fields_received_times) { 1 } |
115 | 116 | let(:schema_received_times) { 1 } |
116 | 117 |
|
|
122 | 123 | 5.times { item_class.enum_values(:type) } |
123 | 124 | end |
124 | 125 |
|
125 | | - before do |
126 | | - item_class.plugin :enum_values, caching: false |
127 | | - end |
128 | | - |
| 126 | + let(:enum_values_options) { { caching: false } } |
129 | 127 | let(:all_enum_fields_received_times) { 5 } |
130 | 128 | let(:schema_received_times) { 5 } |
131 | 129 |
|
|
180 | 178 | end |
181 | 179 |
|
182 | 180 | context 'with true value' do |
183 | | - before do |
184 | | - item_class.plugin :enum_values, predicate_methods: true |
185 | | - end |
| 181 | + let(:enum_values_options) { { predicate_methods: true } } |
186 | 182 |
|
187 | 183 | include_examples 'for all enum predicate methods', |
188 | 184 | item_enum_predicate_methods, |
189 | 185 | -> { expect(subject).to be false } |
190 | 186 | end |
191 | 187 |
|
192 | 188 | context 'with false value' do |
193 | | - before do |
194 | | - item_class.plugin :enum_values, predicate_methods: false |
195 | | - end |
| 189 | + let(:enum_values_options) { { predicate_methods: false } } |
196 | 190 |
|
197 | 191 | include_examples 'for all enum predicate methods', |
198 | 192 | item_enum_predicate_methods, |
199 | 193 | -> { expect { subject }.to raise_error(NoMethodError) } |
200 | 194 | end |
201 | 195 |
|
202 | 196 | context 'with Array value' do |
203 | | - before do |
204 | | - item_class.plugin :enum_values, predicate_methods: %i[status] |
205 | | - end |
| 197 | + let(:enum_values_options) { { predicate_methods: %i[status] } } |
206 | 198 |
|
207 | 199 | include_examples 'for all enum predicate methods', |
208 | 200 | status_enum_predicate_methods, |
|
214 | 206 | end |
215 | 207 |
|
216 | 208 | context 'with Symbol value' do |
217 | | - before do |
218 | | - item_class.plugin :enum_values, predicate_methods: :status |
219 | | - end |
| 209 | + let(:enum_values_options) { { predicate_methods: :status } } |
220 | 210 |
|
221 | 211 | include_examples 'for all enum predicate methods', |
222 | 212 | status_enum_predicate_methods, |
|
227 | 217 | -> { expect { subject }.to raise_error(NoMethodError) } |
228 | 218 | end |
229 | 219 | end |
| 220 | + |
| 221 | + shared_context('with filter_methods environment') do |
| 222 | + subject(:enum_filter) { item_class.dataset.public_send(enum_value) } |
| 223 | + |
| 224 | + let(:filter_sql) do |
| 225 | + "SELECT * FROM \"items\" WHERE (\"#{field}\" = '#{enum_value}')" |
| 226 | + end |
| 227 | + end |
| 228 | + |
| 229 | + shared_examples('returns correct sql') do |field, field_value| |
| 230 | + subject { enum_filter.sql } |
| 231 | + |
| 232 | + describe field_value do |
| 233 | + let(:field) { field } |
| 234 | + let(:enum_value) { field_value } |
| 235 | + |
| 236 | + it { is_expected.to eq filter_sql } |
| 237 | + end |
| 238 | + end |
| 239 | + |
| 240 | + shared_examples('raises NoMethodError') do |field_value| |
| 241 | + describe field_value do |
| 242 | + let(:enum_value) { field_value } |
| 243 | + |
| 244 | + it { expect { enum_filter }.to raise_error(NoMethodError) } |
| 245 | + end |
| 246 | + end |
| 247 | + |
| 248 | + describe 'filter_methods default option' do |
| 249 | + include_context('with filter_methods environment') |
| 250 | + |
| 251 | + item_enum_values.each do |filter_method_name| |
| 252 | + include_examples('raises NoMethodError', filter_method_name) |
| 253 | + end |
| 254 | + end |
| 255 | + |
| 256 | + describe 'filter_methods true option' do |
| 257 | + let(:enum_values_options) { { filter_methods: true } } |
| 258 | + |
| 259 | + include_context('with filter_methods environment') |
| 260 | + |
| 261 | + type_enum_values.each do |filter_method_name| |
| 262 | + include_examples('returns correct sql', :type, filter_method_name) |
| 263 | + end |
| 264 | + |
| 265 | + status_enum_values.each do |filter_method_name| |
| 266 | + include_examples('returns correct sql', :status, filter_method_name) |
| 267 | + end |
| 268 | + end |
| 269 | + |
| 270 | + describe 'filter_methods false option' do |
| 271 | + let(:enum_values_options) { { filter_methods: false } } |
| 272 | + |
| 273 | + include_context('with filter_methods environment') |
| 274 | + |
| 275 | + item_enum_values.each do |filter_method_name| |
| 276 | + include_examples('raises NoMethodError', filter_method_name) |
| 277 | + end |
| 278 | + end |
| 279 | + |
| 280 | + describe 'filter_methods Array option' do |
| 281 | + let(:enum_values_options) { { filter_methods: %i[status] } } |
| 282 | + |
| 283 | + include_context('with filter_methods environment') |
| 284 | + |
| 285 | + status_enum_values.each do |filter_method_name| |
| 286 | + include_examples('returns correct sql', :status, filter_method_name) |
| 287 | + end |
| 288 | + |
| 289 | + type_enum_values.each do |filter_method_name| |
| 290 | + include_examples('raises NoMethodError', filter_method_name) |
| 291 | + end |
| 292 | + end |
| 293 | + |
| 294 | + describe 'filter_methods Symbol option' do |
| 295 | + let(:enum_values_options) { { filter_methods: :status } } |
| 296 | + |
| 297 | + include_context('with filter_methods environment') |
| 298 | + |
| 299 | + status_enum_values.each do |filter_method_name| |
| 300 | + include_examples('returns correct sql', :status, filter_method_name) |
| 301 | + end |
| 302 | + |
| 303 | + type_enum_values.each do |filter_method_name| |
| 304 | + include_examples('raises NoMethodError', filter_method_name) |
| 305 | + end |
| 306 | + end |
230 | 307 | end |
231 | 308 | end |
232 | 309 | end |
|
0 commit comments