commons_yellowme 0.11.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +62 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +12 -0
  5. data/Gemfile.lock +218 -0
  6. data/bin/test +5 -0
  7. data/commons.gemspec +36 -0
  8. data/lib/commons.rb +1 -1
  9. data/lib/commons/concerns/extensions/soft_deleted.rb +34 -0
  10. data/lib/commons/formatter/regex_constants.rb +2 -0
  11. data/lib/commons/repositories/base_repository.rb +59 -54
  12. data/lib/commons/services/concerns/callable.rb +7 -2
  13. data/lib/commons/version.rb +1 -1
  14. data/spec/commons/authentication/authenticate_by_jwt_spec.rb +37 -0
  15. data/spec/commons/authentication/json_web_token_spec.rb +41 -0
  16. data/spec/commons/concerns/attributes/sex_spec.rb +24 -0
  17. data/spec/commons/concerns/extensions/deleted_spec.rb +40 -0
  18. data/spec/commons/concerns/guard/capitalizable_spec.rb +13 -0
  19. data/spec/commons/concerns/validations/undestroyable_spec.rb +9 -0
  20. data/spec/commons/errors/bad_request_spec.rb +62 -0
  21. data/spec/commons/errors/conflict_spec.rb +62 -0
  22. data/spec/commons/errors/forbidden_spec.rb +62 -0
  23. data/spec/commons/errors/internal_server_error_spec.rb +62 -0
  24. data/spec/commons/errors/invalid_resource_spec.rb +62 -0
  25. data/spec/commons/errors/maintenance_mode_spec.rb +49 -0
  26. data/spec/commons/errors/missing_parameter_spec.rb +49 -0
  27. data/spec/commons/errors/not_unique_spec.rb +62 -0
  28. data/spec/commons/errors/payment_required_spec.rb +62 -0
  29. data/spec/commons/errors/precondition_failed_spec.rb +62 -0
  30. data/spec/commons/errors/resource_not_found_spec.rb +49 -0
  31. data/spec/commons/errors/route_not_found_spec.rb +49 -0
  32. data/spec/commons/errors/unauthorized_spec.rb +62 -0
  33. data/spec/commons/errors/unprocessable_entity_spec.rb +62 -0
  34. data/spec/commons/formatter/e164_phone_spec.rb +155 -0
  35. data/spec/commons/formatter/regex_constants_spec.rb +165 -0
  36. data/spec/commons/formatter/string_utils_spec.rb +19 -0
  37. data/spec/commons/repositories/base_repository_spec.rb +516 -0
  38. data/spec/commons/repositories/catalogs/base_catalog_spec.rb +55 -0
  39. data/spec/commons/serializers/bad_request_spec.rb +46 -0
  40. data/spec/commons/serializers/conflict_spec.rb +46 -0
  41. data/spec/commons/serializers/forbidden_spec.rb +46 -0
  42. data/spec/commons/serializers/internal_server_error_spec.rb +46 -0
  43. data/spec/commons/serializers/invalid_resource_spec.rb +46 -0
  44. data/spec/commons/serializers/maintenance_mode_spec.rb +46 -0
  45. data/spec/commons/serializers/missing_parameter_spec.rb +44 -0
  46. data/spec/commons/serializers/not_unique_spec.rb +46 -0
  47. data/spec/commons/serializers/payment_required_spec.rb +46 -0
  48. data/spec/commons/serializers/precondition_failed_spec.rb +46 -0
  49. data/spec/commons/serializers/route_not_found_spec.rb +46 -0
  50. data/spec/commons/serializers/unauthorized_spec.rb +46 -0
  51. data/spec/commons/serializers/unprocessable_entity_spec.rb +46 -0
  52. data/spec/commons/shared-examples/user_spec.rb +18 -0
  53. data/spec/dummy/.ruby-version +1 -0
  54. data/spec/dummy/Rakefile +6 -0
  55. data/spec/dummy/app/assets/config/manifest.js +2 -0
  56. data/spec/dummy/app/assets/images/.keep +0 -0
  57. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  58. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  59. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  60. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  61. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  62. data/spec/dummy/app/controllers/miscellaneous_controller.rb +13 -0
  63. data/spec/dummy/app/errors/default_handling.rb +35 -0
  64. data/spec/dummy/app/errors/error_notifier.rb +12 -0
  65. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  66. data/spec/dummy/app/javascript/packs/application.js +15 -0
  67. data/spec/dummy/app/jobs/application_job.rb +7 -0
  68. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  69. data/spec/dummy/app/models/application_record.rb +3 -0
  70. data/spec/dummy/app/models/catalogs/application_parameter.rb +6 -0
  71. data/spec/dummy/app/models/concerns/.keep +0 -0
  72. data/spec/dummy/app/models/employee.rb +3 -0
  73. data/spec/dummy/app/models/user.rb +16 -0
  74. data/spec/dummy/app/repositories/catalogs/application_parameter_repository.rb +4 -0
  75. data/spec/dummy/app/repositories/employee_repository.rb +2 -0
  76. data/spec/dummy/app/repositories/user_repository.rb +2 -0
  77. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  78. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  79. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  80. data/spec/dummy/bin/rails +4 -0
  81. data/spec/dummy/bin/rake +4 -0
  82. data/spec/dummy/bin/setup +33 -0
  83. data/spec/dummy/config.ru +5 -0
  84. data/spec/dummy/config/application.rb +29 -0
  85. data/spec/dummy/config/boot.rb +5 -0
  86. data/spec/dummy/config/cable.yml +10 -0
  87. data/spec/dummy/config/database.yml +25 -0
  88. data/spec/dummy/config/environment.rb +5 -0
  89. data/spec/dummy/config/environments/development.rb +62 -0
  90. data/spec/dummy/config/environments/production.rb +112 -0
  91. data/spec/dummy/config/environments/test.rb +48 -0
  92. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  93. data/spec/dummy/config/initializers/assets.rb +12 -0
  94. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  95. data/spec/dummy/config/initializers/content_security_policy.rb +28 -0
  96. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  97. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  98. data/spec/dummy/config/initializers/inflections.rb +16 -0
  99. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  100. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  101. data/spec/dummy/config/locales/en.yml +33 -0
  102. data/spec/dummy/config/puma.rb +38 -0
  103. data/spec/dummy/config/routes.rb +9 -0
  104. data/spec/dummy/config/spring.rb +6 -0
  105. data/spec/dummy/config/storage.yml +34 -0
  106. data/spec/dummy/db/migrate/20191212233443_create_user.rb +13 -0
  107. data/spec/dummy/db/migrate/20191213072543_create_application_parameters.rb +8 -0
  108. data/spec/dummy/db/migrate/20200101204534_create_employee.rb +8 -0
  109. data/spec/dummy/db/schema.rb +35 -0
  110. data/spec/dummy/lib/assets/.keep +0 -0
  111. data/spec/dummy/log/.keep +0 -0
  112. data/spec/dummy/public/404.html +67 -0
  113. data/spec/dummy/public/422.html +67 -0
  114. data/spec/dummy/public/500.html +66 -0
  115. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  116. data/spec/dummy/public/apple-touch-icon.png +0 -0
  117. data/spec/dummy/public/favicon.ico +0 -0
  118. data/spec/factories/catalogs/application_parameters.rb +6 -0
  119. data/spec/factories/employees.rb +6 -0
  120. data/spec/factories/users.rb +7 -0
  121. data/spec/rails_helper.rb +68 -0
  122. data/spec/spec_helper.rb +108 -0
  123. data/spec/support/shared-examples/capitalizable.rb +16 -0
  124. data/spec/support/shared-examples/deletable.rb +39 -0
  125. data/spec/support/shared-examples/dimorphic.rb +28 -0
  126. data/spec/support/shared-examples/stripable.rb +17 -0
  127. data/spec/support/shared-examples/undestroyable.rb +8 -0
  128. metadata +249 -13
  129. data/lib/commons/concerns/extensions/deleted.rb +0 -25
@@ -0,0 +1,516 @@
1
+ RSpec.describe Commons::Repositories::BaseRepository do
2
+ let(:user) { create(:user) }
3
+ let(:valid_params) do
4
+ {
5
+ name: Faker::Name.first_name,
6
+ last_name: Faker::Name.last_name
7
+ }
8
+ end
9
+
10
+ describe 'all' do
11
+ context 'when data exists' do
12
+ let(:users_amount) { 10 }
13
+ let(:deleted_users_amount) { 5 }
14
+ before do
15
+ users_amount.times {
16
+ UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
17
+ }
18
+ deleted_users_amount.times {
19
+ user = UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
20
+ UserRepository.instance.destroy!(user)
21
+ }
22
+ end
23
+ subject { UserRepository.instance.all }
24
+
25
+ it do
26
+ expect(subject.count).to eq users_amount
27
+ expect(subject.first).to be_an_instance_of User
28
+ end
29
+ end
30
+
31
+ context 'when no data' do
32
+ it { expect(UserRepository.instance.all).to be_empty }
33
+ end
34
+ end
35
+
36
+ describe 'query' do
37
+ context 'when data exists' do
38
+ let(:users_amount) { 10 }
39
+ let(:deleted_users_amount) { 5 }
40
+ before do
41
+ users_amount.times {
42
+ UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
43
+ }
44
+ deleted_users_amount.times {
45
+ user = UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
46
+ UserRepository.instance.destroy!(user)
47
+ }
48
+ end
49
+
50
+ subject { UserRepository.instance.query.not(name: nil) }
51
+
52
+ it do
53
+ expect(subject.count).to eq users_amount
54
+ end
55
+ end
56
+
57
+ context 'when no data' do
58
+ let(:deleted_users_amount) { 5 }
59
+ before do
60
+ deleted_users_amount.times {
61
+ user = UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
62
+ UserRepository.instance.destroy!(user)
63
+ }
64
+ end
65
+
66
+ subject { UserRepository.instance.query.not(name: nil) }
67
+
68
+ it { expect(subject).to be_empty }
69
+ end
70
+ end
71
+
72
+ describe 'deleted' do
73
+ context 'when data exists' do
74
+ let(:users_amount) { 10 }
75
+ let(:deleted_users_amount) { 5 }
76
+ before do
77
+ users_amount.times {
78
+ UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
79
+ }
80
+ deleted_users_amount.times {
81
+ user = UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
82
+ UserRepository.instance.destroy!(user)
83
+ }
84
+ end
85
+ subject { UserRepository.instance.deleted }
86
+
87
+ it do
88
+ expect(subject.count).to eq deleted_users_amount
89
+ end
90
+ end
91
+
92
+ context 'when no data' do
93
+ let(:users_amount) { 10 }
94
+ before do
95
+ users_amount.times {
96
+ UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys)
97
+ }
98
+ end
99
+
100
+ it { expect(UserRepository.instance.deleted).to be_empty }
101
+ end
102
+ end
103
+
104
+ describe 'find' do
105
+ context 'by a valid id' do
106
+ subject { UserRepository.instance.find(user.id) }
107
+
108
+ it { is_expected.to be_an_instance_of User }
109
+ end
110
+
111
+ context 'by non-existent id' do
112
+ it do
113
+ expect do
114
+ UserRepository.instance.find('my totally non-existent id')
115
+ end.to raise_error(ActiveRecord::RecordNotFound)
116
+ end
117
+ end
118
+ end
119
+
120
+ describe 'find_deleted' do
121
+ context 'by a valid id' do
122
+ subject { UserRepository.instance.find_deleted(user.id) }
123
+
124
+ it { is_expected.to be_nil }
125
+ end
126
+
127
+ context 'by non-existent id' do
128
+ subject { UserRepository.instance.find_deleted('my totally non-existent id') }
129
+
130
+ it { is_expected.to be_nil }
131
+ end
132
+
133
+ context 'by previously deleted user' do
134
+ before do
135
+ UserRepository.instance.destroy!(user)
136
+ end
137
+
138
+ subject { UserRepository.instance.find_deleted(user.id) }
139
+
140
+ it { is_expected.to be_an_instance_of User }
141
+ end
142
+ end
143
+
144
+ describe 'find_by' do
145
+ context 'by a valid id' do
146
+ subject { UserRepository.instance.find_by(id: user.id) }
147
+
148
+ it { is_expected.to be_an_instance_of User }
149
+ end
150
+
151
+ context 'by non-existent id' do
152
+ it { expect(UserRepository.instance.find_by(id: 'my totally non-existent id')).to be_falsey }
153
+ end
154
+ end
155
+
156
+ describe 'find_deleted_by' do
157
+ context 'by a valid id' do
158
+ subject { UserRepository.instance.find_deleted_by(id: user.id) }
159
+
160
+ it { is_expected.to be_falsey }
161
+ end
162
+
163
+ context 'by non-existent id' do
164
+ subject { UserRepository.instance.find_deleted_by(id: 'my totally non-existent id') }
165
+
166
+ it { is_expected.to be_falsey }
167
+ end
168
+
169
+ context 'by previously deleted user' do
170
+ before do
171
+ UserRepository.instance.destroy!(user)
172
+ end
173
+
174
+ subject { UserRepository.instance.find_deleted_by(id: user.id) }
175
+
176
+ it { is_expected.to be_an_instance_of User }
177
+ end
178
+ end
179
+
180
+ describe 'find_by!' do
181
+ context 'by a valid id!' do
182
+ subject { UserRepository.instance.find_by!(id: user.id) }
183
+
184
+ it { is_expected.to be_an_instance_of User }
185
+ end
186
+
187
+ context 'by non-existent id!' do
188
+ it do
189
+ expect do
190
+ UserRepository.instance.find_by!(
191
+ id: 'my totally non-existent id'
192
+ )
193
+ end.to raise_error(ActiveRecord::RecordNotFound)
194
+ end
195
+ end
196
+ end
197
+
198
+ describe 'find_deleted_by!' do
199
+ context 'by a valid active id' do
200
+ subject { UserRepository.instance.find_deleted_by!(id: user.id) }
201
+
202
+ it do
203
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
204
+ end
205
+ end
206
+
207
+ context 'by non-existent id!' do
208
+ subject { UserRepository.instance.find_deleted_by!(id: 'my totally non-existent id') }
209
+
210
+ it do
211
+ expect { subject }.to raise_error(ActiveRecord::RecordNotFound)
212
+ end
213
+ end
214
+
215
+ context 'by previously deleted user' do
216
+ before do
217
+ UserRepository.instance.destroy!(user)
218
+ end
219
+
220
+ subject { UserRepository.instance.find_deleted_by!(id: user.id) }
221
+
222
+ it { is_expected.to be_an_instance_of User }
223
+ end
224
+ end
225
+
226
+ describe 'find_or_create_by!' do
227
+ describe 'works ok!' do
228
+ context 'when exists' do
229
+ let(:previous_user) { UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys) }
230
+ before do
231
+ previous_user
232
+ end
233
+ subject { UserRepository.instance.find_or_create_by!(**valid_params.to_h.symbolize_keys) }
234
+
235
+ it do
236
+ expect(subject).to be_an_instance_of User
237
+ expect(subject.id).to eq previous_user.id
238
+ expect(subject.name).to eq valid_params[:name]
239
+ expect(subject.last_name).to eq valid_params[:last_name]
240
+ end
241
+ end
242
+
243
+ context 'when creates' do
244
+ let(:previous_valid_params) do
245
+ {
246
+ name: 'Johnny',
247
+ last_name: Faker::Name.last_name
248
+ }
249
+ end
250
+ let(:previous_user) { UserRepository.instance.create_from_params!(**previous_valid_params.to_h.symbolize_keys) }
251
+ before do
252
+ previous_user
253
+ end
254
+ subject { UserRepository.instance.find_or_create_by!(**valid_params.to_h.symbolize_keys) }
255
+
256
+ it do
257
+ expect(subject).to be_an_instance_of User
258
+ expect(subject.id).not_to eq previous_user.id
259
+ expect(subject.name).to eq valid_params[:name]
260
+ expect(subject.last_name).to eq valid_params[:last_name]
261
+ end
262
+ end
263
+ end
264
+
265
+ context 'fails ok!' do
266
+ let(:invalid_params) do
267
+ {
268
+ last_name: Faker::Name.last_name,
269
+ age: 18
270
+ }
271
+ end
272
+
273
+ subject { UserRepository.instance.find_or_create_by!(**invalid_params.to_h.symbolize_keys) }
274
+
275
+ it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) }
276
+ end
277
+ end
278
+
279
+ describe 'where_first_or_create!' do
280
+ describe 'works ok!' do
281
+ context 'when exists' do
282
+ let(:previous_user) { UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys) }
283
+ let(:new_params) do
284
+ {
285
+ name: 'Jhonny',
286
+ last_name: 'Be Good'
287
+ }
288
+ end
289
+ before do
290
+ previous_user
291
+ end
292
+ subject { UserRepository.instance.where_first_or_create!({ name: valid_params[:name]}, **new_params.to_h.symbolize_keys) }
293
+
294
+ it do
295
+ expect(subject).to be_an_instance_of User
296
+ expect(subject.id).to eq previous_user.id
297
+ expect(subject.name).to eq valid_params[:name]
298
+ expect(subject.last_name).to eq valid_params[:last_name]
299
+ end
300
+ end
301
+
302
+ context 'when creates' do
303
+ let(:previous_user) { UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys) }
304
+ let(:new_params) do
305
+ {
306
+ name: 'Jhonny',
307
+ last_name: 'Be Good'
308
+ }
309
+ end
310
+ before do
311
+ previous_user
312
+ end
313
+ subject { UserRepository.instance.where_first_or_create!({ name: new_params[:name]}, **new_params.to_h.symbolize_keys) }
314
+
315
+ it do
316
+ expect(subject).to be_an_instance_of User
317
+ expect(subject.id).not_to eq previous_user.id
318
+ expect(subject.name).to eq new_params[:name]
319
+ expect(subject.last_name).to eq new_params[:last_name]
320
+ end
321
+ end
322
+ end
323
+
324
+ context 'fails ok!' do
325
+ let(:invalid_params) do
326
+ {
327
+ last_name: Faker::Name.last_name,
328
+ age: 18
329
+ }
330
+ end
331
+
332
+ subject { UserRepository.instance.where_first_or_create!({last_name: valid_params[:last_name]}, **invalid_params.to_h.symbolize_keys) }
333
+
334
+ it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) }
335
+ end
336
+ end
337
+
338
+ describe 'create!' do
339
+ describe 'works when' do
340
+ context 'using a valid user' do
341
+ let(:user) { build(:user) }
342
+
343
+ subject { UserRepository.instance.create!(user) }
344
+
345
+ it { expect(subject).to be true }
346
+ end
347
+ end
348
+
349
+ describe 'fails when' do
350
+ context 'is not a employee' do
351
+ let(:user) { build(:user) }
352
+
353
+ it do
354
+ expect do
355
+ EmployeeRepository.instance.create!(user)
356
+ end.to raise_error(ArgumentError)
357
+ end
358
+ end
359
+
360
+ context 'is not a valid user' do
361
+ let(:user) { build(:user, name: nil) }
362
+
363
+ it do
364
+ expect do
365
+ UserRepository.instance.create!(user)
366
+ end.to raise_error(ActiveRecord::RecordInvalid)
367
+ end
368
+ end
369
+ end
370
+ end
371
+
372
+ describe 'create_from_params!' do
373
+ context 'works ok!' do
374
+ subject { UserRepository.instance.create_from_params!(**valid_params.to_h.symbolize_keys) }
375
+
376
+ it do
377
+ expect(subject).to be_an_instance_of User
378
+ expect(subject.name).to eq valid_params[:name]
379
+ expect(subject.last_name).to eq valid_params[:last_name]
380
+ end
381
+ end
382
+
383
+ context 'fails ok!' do
384
+ let(:invalid_params) {}
385
+
386
+ subject { UserRepository.instance.create_from_params!(**invalid_params.to_h.symbolize_keys) }
387
+
388
+ it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) }
389
+ end
390
+ end
391
+
392
+ describe 'update!' do
393
+ describe 'works when' do
394
+ context 'using a valid user' do
395
+ let(:user) { create(:user) }
396
+
397
+ subject { UserRepository.instance.update!(user) }
398
+
399
+ it { expect(subject).to be true }
400
+ end
401
+ end
402
+
403
+ describe 'fails when' do
404
+ context 'is not a user' do
405
+ let(:user) { create(:user) }
406
+
407
+ it do
408
+ expect do
409
+ EmployeeRepository.instance.update!(user)
410
+ end.to raise_error(ArgumentError)
411
+ end
412
+ end
413
+
414
+ context 'is not a previously saved' do
415
+ let(:user) { build(:user) }
416
+
417
+ it do
418
+ expect do
419
+ UserRepository.instance.update!(user)
420
+ end.to raise_error(ArgumentError)
421
+ end
422
+ end
423
+
424
+ context 'is not a valid user' do
425
+ let(:user) { create(:user) }
426
+ let(:invalid_user) do
427
+ user.name = nil
428
+ user
429
+ end
430
+
431
+ it do
432
+ expect do
433
+ UserRepository.instance.update!(invalid_user)
434
+ end.to raise_error(ActiveRecord::RecordInvalid)
435
+ end
436
+ end
437
+ end
438
+ end
439
+
440
+ describe 'update_from_params!' do
441
+ context 'works ok!' do
442
+ subject { UserRepository.instance.update_from_params!(id: user.id, **valid_params.to_h.symbolize_keys) }
443
+
444
+ it do
445
+ expect(subject).to be_an_instance_of User
446
+ expect(subject.name).to eq valid_params[:name]
447
+ expect(subject.last_name).to eq valid_params[:last_name]
448
+ end
449
+ end
450
+
451
+ describe 'fails ok!' do
452
+ context 'if invalid params' do
453
+ let(:invalid_params) do
454
+ {
455
+ name: nil
456
+ }
457
+ end
458
+
459
+ subject { UserRepository.instance.update_from_params!(id: user.id, **invalid_params.to_h.symbolize_keys) }
460
+
461
+ it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) }
462
+ end
463
+
464
+ context 'by a unknown param' do
465
+ it do
466
+ expect do
467
+ UserRepository.instance.update_from_params!(
468
+ id: user.id,
469
+ data: 'dummy'
470
+ )
471
+ end.to raise_error(ActiveRecord::UnknownAttributeError)
472
+ end
473
+ end
474
+
475
+ context 'if not found' do
476
+ subject { UserRepository.instance.update_from_params!(id: Faker::Number.number(digits: 2), **valid_params.to_h.symbolize_keys) }
477
+
478
+ it { expect { subject }.to raise_error(ActiveRecord::RecordNotFound) }
479
+ end
480
+ end
481
+ end
482
+
483
+ describe 'soft_delete' do
484
+ describe 'works when' do
485
+ context 'using a valid user' do
486
+ let(:user) { create(:user) }
487
+
488
+ subject { UserRepository.instance.destroy!(user) }
489
+
490
+ it { expect(subject.deleted_at).not_to be nil }
491
+ end
492
+ end
493
+
494
+ describe 'fails when' do
495
+ context 'is not deletable' do
496
+ let(:employee) { create(:employee) }
497
+
498
+ it do
499
+ expect do
500
+ EmployeeRepository.instance.destroy!(employee)
501
+ end.to raise_error(ActiveModel::MissingAttributeError)
502
+ end
503
+ end
504
+
505
+ context 'is not a valid user' do
506
+ let(:user) { create(:user, deleted_at: Time.current) }
507
+
508
+ it do
509
+ expect do
510
+ UserRepository.instance.destroy!(user)
511
+ end.to raise_error(ActiveRecord::RecordInvalid)
512
+ end
513
+ end
514
+ end
515
+ end
516
+ end