audited 4.7.0 → 4.10.0
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.
Potentially problematic release.
This version of audited might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.gitignore +0 -1
- data/.rubocop.yml +25 -0
- data/.travis.yml +32 -27
- data/Appraisals +29 -12
- data/CHANGELOG.md +77 -1
- data/README.md +73 -17
- data/gemfiles/rails42.gemfile +3 -0
- data/gemfiles/rails50.gemfile +3 -0
- data/gemfiles/rails51.gemfile +3 -0
- data/gemfiles/rails52.gemfile +4 -2
- data/gemfiles/rails60.gemfile +10 -0
- data/gemfiles/rails61.gemfile +10 -0
- data/lib/audited/audit.rb +31 -25
- data/lib/audited/auditor.rb +102 -29
- data/lib/audited/version.rb +1 -1
- data/lib/audited.rb +2 -1
- data/lib/generators/audited/templates/add_version_to_auditable_index.rb +21 -0
- data/lib/generators/audited/templates/install.rb +1 -1
- data/lib/generators/audited/upgrade_generator.rb +4 -0
- data/spec/audited/audit_spec.rb +88 -21
- data/spec/audited/auditor_spec.rb +240 -54
- data/spec/audited/sweeper_spec.rb +15 -6
- data/spec/audited_spec_helpers.rb +3 -1
- data/spec/rails_app/app/assets/config/manifest.js +1 -0
- data/spec/rails_app/app/controllers/application_controller.rb +2 -0
- data/spec/rails_app/config/application.rb +5 -0
- data/spec/rails_app/config/database.yml +1 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/support/active_record/models.rb +22 -0
- data/spec/support/active_record/schema.rb +4 -2
- data/test/db/version_6.rb +2 -0
- data/test/test_helper.rb +1 -2
- data/test/upgrade_generator_test.rb +10 -0
- metadata +59 -22
- data/gemfiles/rails40.gemfile +0 -9
- data/gemfiles/rails41.gemfile +0 -8
@@ -1,5 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
+
SingleCov.covered! uncovered: 13 # not testing proxy_respond_to? hack / 2 methods / deprecation of `version`
|
4
|
+
|
3
5
|
describe Audited::Auditor do
|
4
6
|
|
5
7
|
describe "configuration" do
|
@@ -20,6 +22,24 @@ describe Audited::Auditor do
|
|
20
22
|
context "should be configurable which conditions are audited" do
|
21
23
|
subject { ConditionalCompany.new.send(:auditing_enabled) }
|
22
24
|
|
25
|
+
context "when condition method is private" do
|
26
|
+
subject { ConditionalPrivateCompany.new.send(:auditing_enabled) }
|
27
|
+
|
28
|
+
before do
|
29
|
+
class ConditionalPrivateCompany < ::ActiveRecord::Base
|
30
|
+
self.table_name = 'companies'
|
31
|
+
|
32
|
+
audited if: :foo?
|
33
|
+
|
34
|
+
private def foo?
|
35
|
+
true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it { is_expected.to be_truthy }
|
41
|
+
end
|
42
|
+
|
23
43
|
context "when passing a method name" do
|
24
44
|
before do
|
25
45
|
class ConditionalCompany < ::ActiveRecord::Base
|
@@ -192,7 +212,40 @@ describe Audited::Auditor do
|
|
192
212
|
expect(user.audits.last.audited_changes.keys).to eq(%w{non_column_attr})
|
193
213
|
end
|
194
214
|
|
195
|
-
|
215
|
+
it "should redact columns specified in 'redacted' option" do
|
216
|
+
redacted = Audited::Auditor::AuditedInstanceMethods::REDACTED
|
217
|
+
user = Models::ActiveRecord::UserRedactedPassword.create(password: "password")
|
218
|
+
user.save!
|
219
|
+
expect(user.audits.last.audited_changes['password']).to eq(redacted)
|
220
|
+
user.password = "new_password"
|
221
|
+
user.save!
|
222
|
+
expect(user.audits.last.audited_changes['password']).to eq([redacted, redacted])
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should redact columns specified in 'redacted' option when there are multiple specified" do
|
226
|
+
redacted = Audited::Auditor::AuditedInstanceMethods::REDACTED
|
227
|
+
user =
|
228
|
+
Models::ActiveRecord::UserMultipleRedactedAttributes.create(
|
229
|
+
password: "password",
|
230
|
+
ssn: 123456789
|
231
|
+
)
|
232
|
+
user.save!
|
233
|
+
expect(user.audits.last.audited_changes['password']).to eq(redacted)
|
234
|
+
expect(user.audits.last.audited_changes['ssn']).to eq(redacted)
|
235
|
+
user.password = "new_password"
|
236
|
+
user.ssn = 987654321
|
237
|
+
user.save!
|
238
|
+
expect(user.audits.last.audited_changes['password']).to eq([redacted, redacted])
|
239
|
+
expect(user.audits.last.audited_changes['ssn']).to eq([redacted, redacted])
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should redact columns in 'redacted' column with custom option" do
|
243
|
+
user = Models::ActiveRecord::UserRedactedPasswordCustomRedaction.create(password: "password")
|
244
|
+
user.save!
|
245
|
+
expect(user.audits.last.audited_changes['password']).to eq(["My", "Custom", "Value", 7])
|
246
|
+
end
|
247
|
+
|
248
|
+
if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
|
196
249
|
describe "'json' and 'jsonb' audited_changes column type" do
|
197
250
|
let(:migrations_path) { SPEC_ROOT.join("support/active_record/postgres") }
|
198
251
|
|
@@ -246,7 +299,7 @@ describe Audited::Auditor do
|
|
246
299
|
end
|
247
300
|
|
248
301
|
describe "on create" do
|
249
|
-
let( :user ) { create_user audit_comment: "Create" }
|
302
|
+
let( :user ) { create_user status: :reliable, audit_comment: "Create" }
|
250
303
|
|
251
304
|
it "should change the audit count" do
|
252
305
|
expect {
|
@@ -270,6 +323,10 @@ describe Audited::Auditor do
|
|
270
323
|
expect(user.audits.first.audited_changes).to eq(user.audited_attributes)
|
271
324
|
end
|
272
325
|
|
326
|
+
it "should store enum value" do
|
327
|
+
expect(user.audits.first.audited_changes["status"]).to eq(1)
|
328
|
+
end
|
329
|
+
|
273
330
|
it "should store comment" do
|
274
331
|
expect(user.audits.first.comment).to eq('Create')
|
275
332
|
end
|
@@ -288,7 +345,7 @@ describe Audited::Auditor do
|
|
288
345
|
|
289
346
|
describe "on update" do
|
290
347
|
before do
|
291
|
-
@user = create_user( name: 'Brandon', audit_comment: 'Update' )
|
348
|
+
@user = create_user( name: 'Brandon', status: :active, audit_comment: 'Update' )
|
292
349
|
end
|
293
350
|
|
294
351
|
it "should save an audit" do
|
@@ -301,17 +358,22 @@ describe Audited::Auditor do
|
|
301
358
|
end
|
302
359
|
|
303
360
|
it "should set the action to 'update'" do
|
304
|
-
@user.
|
361
|
+
@user.update! name: 'Changed'
|
305
362
|
expect(@user.audits.last.action).to eq('update')
|
306
363
|
expect(Audited::Audit.updates.order(:id).last).to eq(@user.audits.last)
|
307
364
|
expect(@user.audits.updates.last).to eq(@user.audits.last)
|
308
365
|
end
|
309
366
|
|
310
367
|
it "should store the changed attributes" do
|
311
|
-
@user.
|
368
|
+
@user.update! name: 'Changed'
|
312
369
|
expect(@user.audits.last.audited_changes).to eq({ 'name' => ['Brandon', 'Changed'] })
|
313
370
|
end
|
314
371
|
|
372
|
+
it "should store changed enum values" do
|
373
|
+
@user.update! status: 1
|
374
|
+
expect(@user.audits.last.audited_changes["status"]).to eq([0, 1])
|
375
|
+
end
|
376
|
+
|
315
377
|
it "should store audit comment" do
|
316
378
|
expect(@user.audits.last.comment).to eq('Update')
|
317
379
|
end
|
@@ -319,12 +381,12 @@ describe Audited::Auditor do
|
|
319
381
|
it "should not save an audit if only specified on create/destroy" do
|
320
382
|
on_create_destroy = Models::ActiveRecord::OnCreateDestroy.create( name: 'Bart' )
|
321
383
|
expect {
|
322
|
-
on_create_destroy.
|
384
|
+
on_create_destroy.update! name: 'Changed'
|
323
385
|
}.to_not change( Audited::Audit, :count )
|
324
386
|
end
|
325
387
|
|
326
388
|
it "should not save an audit if the value doesn't change after type casting" do
|
327
|
-
@user.
|
389
|
+
@user.update! logins: 0, activated: true
|
328
390
|
expect { @user.update_attribute :logins, '0' }.to_not change( Audited::Audit, :count )
|
329
391
|
expect { @user.update_attribute :activated, 1 }.to_not change( Audited::Audit, :count )
|
330
392
|
expect { @user.update_attribute :activated, '1' }.to_not change( Audited::Audit, :count )
|
@@ -348,7 +410,7 @@ describe Audited::Auditor do
|
|
348
410
|
|
349
411
|
describe "on destroy" do
|
350
412
|
before do
|
351
|
-
@user = create_user
|
413
|
+
@user = create_user(status: :active)
|
352
414
|
end
|
353
415
|
|
354
416
|
it "should save an audit" do
|
@@ -373,6 +435,11 @@ describe Audited::Auditor do
|
|
373
435
|
expect(@user.audits.last.audited_changes).to eq(@user.audited_attributes)
|
374
436
|
end
|
375
437
|
|
438
|
+
it "should store enum value" do
|
439
|
+
@user.destroy
|
440
|
+
expect(@user.audits.last.audited_changes["status"]).to eq(0)
|
441
|
+
end
|
442
|
+
|
376
443
|
it "should be able to reconstruct a destroyed record without history" do
|
377
444
|
@user.audits.delete_all
|
378
445
|
@user.destroy
|
@@ -474,13 +541,13 @@ describe Audited::Auditor do
|
|
474
541
|
it "should delete old extra audits after introducing limit" do
|
475
542
|
stub_global_max_audits(nil) do
|
476
543
|
user = Models::ActiveRecord::User.create!(name: 'Brandon', username: 'brandon')
|
477
|
-
user.
|
478
|
-
user.
|
479
|
-
user.
|
544
|
+
user.update!(name: 'Foobar')
|
545
|
+
user.update!(name: 'Awesome', username: 'keepers')
|
546
|
+
user.update!(activated: true)
|
480
547
|
|
481
548
|
Audited.max_audits = 3
|
482
549
|
Models::ActiveRecord::User.send(:normalize_audited_options)
|
483
|
-
user.
|
550
|
+
user.update!(favourite_device: 'Android Phone')
|
484
551
|
audits = user.audits
|
485
552
|
|
486
553
|
expect(audits.count).to eq(3)
|
@@ -531,8 +598,8 @@ describe Audited::Auditor do
|
|
531
598
|
|
532
599
|
it "should set the attributes for each revision" do
|
533
600
|
u = Models::ActiveRecord::User.create(name: 'Brandon', username: 'brandon')
|
534
|
-
u.
|
535
|
-
u.
|
601
|
+
u.update! name: 'Foobar'
|
602
|
+
u.update! name: 'Awesome', username: 'keepers'
|
536
603
|
|
537
604
|
expect(u.revisions.size).to eql(3)
|
538
605
|
|
@@ -548,8 +615,8 @@ describe Audited::Auditor do
|
|
548
615
|
|
549
616
|
it "access to only recent revisions" do
|
550
617
|
u = Models::ActiveRecord::User.create(name: 'Brandon', username: 'brandon')
|
551
|
-
u.
|
552
|
-
u.
|
618
|
+
u.update! name: 'Foobar'
|
619
|
+
u.update! name: 'Awesome', username: 'keepers'
|
553
620
|
|
554
621
|
expect(u.revisions(2).size).to eq(2)
|
555
622
|
|
@@ -566,7 +633,7 @@ describe Audited::Auditor do
|
|
566
633
|
end
|
567
634
|
|
568
635
|
it "should ignore attributes that have been deleted" do
|
569
|
-
user.audits.last.
|
636
|
+
user.audits.last.update! audited_changes: {old_attribute: 'old value'}
|
570
637
|
expect { user.revisions }.to_not raise_error
|
571
638
|
end
|
572
639
|
end
|
@@ -581,21 +648,21 @@ describe Audited::Auditor do
|
|
581
648
|
it "should find the given revision" do
|
582
649
|
revision = user.revision(3)
|
583
650
|
expect(revision).to be_a_kind_of( Models::ActiveRecord::User )
|
584
|
-
expect(revision.
|
651
|
+
expect(revision.audit_version).to eq(3)
|
585
652
|
expect(revision.name).to eq('Foobar 3')
|
586
653
|
end
|
587
654
|
|
588
655
|
it "should find the previous revision with :previous" do
|
589
656
|
revision = user.revision(:previous)
|
590
|
-
expect(revision.
|
657
|
+
expect(revision.audit_version).to eq(4)
|
591
658
|
#expect(revision).to eq(user.revision(4))
|
592
659
|
expect(revision.attributes).to eq(user.revision(4).attributes)
|
593
660
|
end
|
594
661
|
|
595
662
|
it "should be able to get the previous revision repeatedly" do
|
596
663
|
previous = user.revision(:previous)
|
597
|
-
expect(previous.
|
598
|
-
expect(previous.revision(:previous).
|
664
|
+
expect(previous.audit_version).to eq(4)
|
665
|
+
expect(previous.revision(:previous).audit_version).to eq(3)
|
599
666
|
end
|
600
667
|
|
601
668
|
it "should be able to set protected attributes" do
|
@@ -615,8 +682,8 @@ describe Audited::Auditor do
|
|
615
682
|
|
616
683
|
it "should set the attributes for each revision" do
|
617
684
|
u = Models::ActiveRecord::User.create(name: 'Brandon', username: 'brandon')
|
618
|
-
u.
|
619
|
-
u.
|
685
|
+
u.update! name: 'Foobar'
|
686
|
+
u.update! name: 'Awesome', username: 'keepers'
|
620
687
|
|
621
688
|
expect(u.revision(3).name).to eq('Awesome')
|
622
689
|
expect(u.revision(3).username).to eq('keepers')
|
@@ -628,6 +695,16 @@ describe Audited::Auditor do
|
|
628
695
|
expect(u.revision(1).username).to eq('brandon')
|
629
696
|
end
|
630
697
|
|
698
|
+
it "should correctly restore revision with enum" do
|
699
|
+
u = Models::ActiveRecord::User.create(status: :active)
|
700
|
+
u.update_attribute(:status, :reliable)
|
701
|
+
u.update_attribute(:status, :banned)
|
702
|
+
|
703
|
+
expect(u.revision(3)).to be_banned
|
704
|
+
expect(u.revision(2)).to be_reliable
|
705
|
+
expect(u.revision(1)).to be_active
|
706
|
+
end
|
707
|
+
|
631
708
|
it "should be able to get time for first revision" do
|
632
709
|
suspended_at = Time.zone.now
|
633
710
|
u = Models::ActiveRecord::User.create(suspended_at: suspended_at)
|
@@ -668,8 +745,8 @@ describe Audited::Auditor do
|
|
668
745
|
audit = user.audits.first
|
669
746
|
audit.created_at = 1.hour.ago
|
670
747
|
audit.save!
|
671
|
-
user.
|
672
|
-
expect(user.revision_at( 2.minutes.ago ).
|
748
|
+
user.update! name: 'updated'
|
749
|
+
expect(user.revision_at( 2.minutes.ago ).audit_version).to eq(1)
|
673
750
|
end
|
674
751
|
|
675
752
|
it "should be nil if given a time before audits" do
|
@@ -677,6 +754,33 @@ describe Audited::Auditor do
|
|
677
754
|
end
|
678
755
|
end
|
679
756
|
|
757
|
+
describe "own_and_associated_audits" do
|
758
|
+
it "should return audits for self and associated audits" do
|
759
|
+
owner = Models::ActiveRecord::Owner.create!
|
760
|
+
company = owner.companies.create!
|
761
|
+
company.update!(name: "Collective Idea")
|
762
|
+
|
763
|
+
other_owner = Models::ActiveRecord::Owner.create!
|
764
|
+
other_owner.companies.create!
|
765
|
+
|
766
|
+
expect(owner.own_and_associated_audits).to match_array(owner.audits + company.audits)
|
767
|
+
end
|
768
|
+
|
769
|
+
it "should order audits by creation time" do
|
770
|
+
owner = Models::ActiveRecord::Owner.create!
|
771
|
+
first_audit = owner.audits.first
|
772
|
+
first_audit.update_column(:created_at, 1.year.ago)
|
773
|
+
|
774
|
+
company = owner.companies.create!
|
775
|
+
second_audit = company.audits.first
|
776
|
+
second_audit.update_column(:created_at, 1.month.ago)
|
777
|
+
|
778
|
+
company.update!(name: "Collective Idea")
|
779
|
+
third_audit = company.audits.last
|
780
|
+
expect(owner.own_and_associated_audits.to_a).to eq([third_audit, second_audit, first_audit])
|
781
|
+
end
|
782
|
+
end
|
783
|
+
|
680
784
|
describe "without auditing" do
|
681
785
|
it "should not save an audit when calling #save_without_auditing" do
|
682
786
|
expect {
|
@@ -697,31 +801,103 @@ describe Audited::Auditor do
|
|
697
801
|
end
|
698
802
|
|
699
803
|
it "should be thread safe using a #without_auditing block" do
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
804
|
+
skip if Models::ActiveRecord::User.connection.class.name.include?("SQLite")
|
805
|
+
|
806
|
+
t1 = Thread.new do
|
807
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
808
|
+
Models::ActiveRecord::User.without_auditing do
|
809
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
810
|
+
Models::ActiveRecord::User.create!( name: 'Bart' )
|
811
|
+
sleep 1
|
812
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
710
813
|
end
|
814
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
815
|
+
end
|
816
|
+
|
817
|
+
t2 = Thread.new do
|
818
|
+
sleep 0.5
|
819
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
820
|
+
Models::ActiveRecord::User.create!( name: 'Lisa' )
|
821
|
+
end
|
822
|
+
t1.join
|
823
|
+
t2.join
|
824
|
+
|
825
|
+
expect(Models::ActiveRecord::User.find_by_name('Bart').audits.count).to eq(0)
|
826
|
+
expect(Models::ActiveRecord::User.find_by_name('Lisa').audits.count).to eq(1)
|
827
|
+
end
|
828
|
+
|
829
|
+
it "should not save an audit when auditing is globally disabled" do
|
830
|
+
expect(Audited.auditing_enabled).to eq(true)
|
831
|
+
Audited.auditing_enabled = false
|
832
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
833
|
+
|
834
|
+
user = create_user
|
835
|
+
expect(user.audits.count).to eq(0)
|
836
|
+
|
837
|
+
Audited.auditing_enabled = true
|
838
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
839
|
+
|
840
|
+
user.update!(name: 'Test')
|
841
|
+
expect(user.audits.count).to eq(1)
|
842
|
+
Models::ActiveRecord::User.enable_auditing
|
843
|
+
end
|
844
|
+
end
|
845
|
+
|
846
|
+
describe "with auditing" do
|
847
|
+
it "should save an audit when calling #save_with_auditing" do
|
848
|
+
expect {
|
849
|
+
u = Models::ActiveRecord::User.new(name: 'Brandon')
|
850
|
+
Models::ActiveRecord::User.auditing_enabled = false
|
851
|
+
expect(u.save_with_auditing).to eq(true)
|
852
|
+
Models::ActiveRecord::User.auditing_enabled = true
|
853
|
+
}.to change( Audited::Audit, :count ).by(1)
|
854
|
+
end
|
855
|
+
|
856
|
+
it "should save an audit inside of the #with_auditing block" do
|
857
|
+
expect {
|
858
|
+
Models::ActiveRecord::User.auditing_enabled = false
|
859
|
+
Models::ActiveRecord::User.with_auditing { Models::ActiveRecord::User.create!( name: 'Brandon' ) }
|
860
|
+
Models::ActiveRecord::User.auditing_enabled = true
|
861
|
+
}.to change( Audited::Audit, :count ).by(1)
|
862
|
+
end
|
863
|
+
|
864
|
+
it "should reset auditing status even it raises an exception" do
|
865
|
+
Models::ActiveRecord::User.disable_auditing
|
866
|
+
Models::ActiveRecord::User.with_auditing { raise } rescue nil
|
867
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
868
|
+
Models::ActiveRecord::User.enable_auditing
|
869
|
+
end
|
711
870
|
|
712
|
-
|
713
|
-
|
871
|
+
it "should be thread safe using a #with_auditing block" do
|
872
|
+
skip if Models::ActiveRecord::User.connection.class.name.include?("SQLite")
|
873
|
+
|
874
|
+
t1 = Thread.new do
|
875
|
+
Models::ActiveRecord::User.disable_auditing
|
876
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
877
|
+
Models::ActiveRecord::User.with_auditing do
|
878
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
879
|
+
|
880
|
+
Models::ActiveRecord::User.create!( name: 'Shaggy' )
|
881
|
+
sleep 1
|
714
882
|
expect(Models::ActiveRecord::User.auditing_enabled).to eq(true)
|
715
|
-
Models::ActiveRecord::User.create!( name: 'Lisa' )
|
716
883
|
end
|
717
|
-
|
718
|
-
|
884
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
885
|
+
Models::ActiveRecord::User.enable_auditing
|
886
|
+
end
|
719
887
|
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
888
|
+
t2 = Thread.new do
|
889
|
+
sleep 0.5
|
890
|
+
Models::ActiveRecord::User.disable_auditing
|
891
|
+
expect(Models::ActiveRecord::User.auditing_enabled).to eq(false)
|
892
|
+
Models::ActiveRecord::User.create!( name: 'Scooby' )
|
893
|
+
Models::ActiveRecord::User.enable_auditing
|
724
894
|
end
|
895
|
+
t1.join
|
896
|
+
t2.join
|
897
|
+
|
898
|
+
Models::ActiveRecord::User.enable_auditing
|
899
|
+
expect(Models::ActiveRecord::User.find_by_name('Shaggy').audits.count).to eq(1)
|
900
|
+
expect(Models::ActiveRecord::User.find_by_name('Scooby').audits.count).to eq(0)
|
725
901
|
end
|
726
902
|
end
|
727
903
|
|
@@ -758,21 +934,21 @@ describe Audited::Auditor do
|
|
758
934
|
let( :on_destroy_user ) { Models::ActiveRecord::OnDestroyCommentRequiredUser.create }
|
759
935
|
|
760
936
|
it "should not validate when audit_comment is not supplied" do
|
761
|
-
expect(user.
|
937
|
+
expect(user.update(name: 'Test')).to eq(false)
|
762
938
|
end
|
763
939
|
|
764
940
|
it "should validate when audit_comment is not supplied, and updating is not being audited" do
|
765
|
-
expect(on_create_user.
|
766
|
-
expect(on_destroy_user.
|
941
|
+
expect(on_create_user.update(name: 'Test')).to eq(true)
|
942
|
+
expect(on_destroy_user.update(name: 'Test')).to eq(true)
|
767
943
|
end
|
768
944
|
|
769
945
|
it "should validate when audit_comment is supplied" do
|
770
|
-
expect(user.
|
946
|
+
expect(user.update(name: 'Test', audit_comment: 'Update')).to eq(true)
|
771
947
|
end
|
772
948
|
|
773
949
|
it "should validate when audit_comment is not supplied, and auditing is disabled" do
|
774
950
|
Models::ActiveRecord::CommentRequiredUser.disable_auditing
|
775
|
-
expect(user.
|
951
|
+
expect(user.update(name: 'Test')).to eq(true)
|
776
952
|
Models::ActiveRecord::CommentRequiredUser.enable_auditing
|
777
953
|
end
|
778
954
|
end
|
@@ -805,6 +981,16 @@ describe Audited::Auditor do
|
|
805
981
|
|
806
982
|
end
|
807
983
|
|
984
|
+
describe "no update with comment only" do
|
985
|
+
let( :user ) { Models::ActiveRecord::NoUpdateWithCommentOnlyUser.create }
|
986
|
+
|
987
|
+
it "does not create an audit when only an audit_comment is present" do
|
988
|
+
user.audit_comment = "Comment"
|
989
|
+
expect { user.save! }.to_not change( Audited::Audit, :count )
|
990
|
+
end
|
991
|
+
|
992
|
+
end
|
993
|
+
|
808
994
|
describe "attr_protected and attr_accessible" do
|
809
995
|
|
810
996
|
it "should not raise error when attr_accessible is set and protected is false" do
|
@@ -826,7 +1012,7 @@ describe Audited::Auditor do
|
|
826
1012
|
it "should record user objects" do
|
827
1013
|
Models::ActiveRecord::Company.audit_as( user ) do
|
828
1014
|
company = Models::ActiveRecord::Company.create name: 'The auditors'
|
829
|
-
company.
|
1015
|
+
company.update! name: 'The Auditors'
|
830
1016
|
|
831
1017
|
company.audits.each do |audit|
|
832
1018
|
expect(audit.user).to eq(user)
|
@@ -837,7 +1023,7 @@ describe Audited::Auditor do
|
|
837
1023
|
it "should record usernames" do
|
838
1024
|
Models::ActiveRecord::Company.audit_as( user.name ) do
|
839
1025
|
company = Models::ActiveRecord::Company.create name: 'The auditors'
|
840
|
-
company.
|
1026
|
+
company.update! name: 'The Auditors'
|
841
1027
|
|
842
1028
|
company.audits.each do |audit|
|
843
1029
|
expect(audit.user).to eq(user.name)
|
@@ -847,7 +1033,7 @@ describe Audited::Auditor do
|
|
847
1033
|
end
|
848
1034
|
|
849
1035
|
describe "after_audit" do
|
850
|
-
let( :user ) {
|
1036
|
+
let( :user ) { Models::ActiveRecord::UserWithAfterAudit.new }
|
851
1037
|
|
852
1038
|
it "should invoke after_audit callback on create" do
|
853
1039
|
expect(user.bogus_attr).to be_nil
|
@@ -857,7 +1043,7 @@ describe Audited::Auditor do
|
|
857
1043
|
end
|
858
1044
|
|
859
1045
|
describe "around_audit" do
|
860
|
-
let( :user ) {
|
1046
|
+
let( :user ) { Models::ActiveRecord::UserWithAfterAudit.new }
|
861
1047
|
|
862
1048
|
it "should invoke around_audit callback on create" do
|
863
1049
|
expect(user.around_attr).to be_nil
|
@@ -872,7 +1058,7 @@ describe Audited::Auditor do
|
|
872
1058
|
expect(company.type).to eq("Models::ActiveRecord::Company::STICompany")
|
873
1059
|
expect {
|
874
1060
|
Models::ActiveRecord::Company.auditing_enabled = false
|
875
|
-
company.
|
1061
|
+
company.update! name: 'STI auditors'
|
876
1062
|
Models::ActiveRecord::Company.auditing_enabled = true
|
877
1063
|
}.to_not change( Audited::Audit, :count )
|
878
1064
|
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
|
+
SingleCov.covered! uncovered: 2 # 2 conditional on_load conditions
|
4
|
+
|
3
5
|
class AuditsController < ActionController::Base
|
4
6
|
before_action :populate_user
|
5
7
|
|
@@ -11,7 +13,7 @@ class AuditsController < ActionController::Base
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def update
|
14
|
-
current_user.
|
16
|
+
current_user.update!(password: 'foo')
|
15
17
|
head :ok
|
16
18
|
end
|
17
19
|
|
@@ -27,14 +29,13 @@ describe AuditsController do
|
|
27
29
|
include RSpec::Rails::ControllerExampleGroup
|
28
30
|
render_views
|
29
31
|
|
30
|
-
before
|
32
|
+
before do
|
31
33
|
Audited.current_user_method = :current_user
|
32
34
|
end
|
33
35
|
|
34
36
|
let(:user) { create_user }
|
35
37
|
|
36
38
|
describe "POST audit" do
|
37
|
-
|
38
39
|
it "should audit user" do
|
39
40
|
controller.send(:current_user=, user)
|
40
41
|
expect {
|
@@ -44,6 +45,15 @@ describe AuditsController do
|
|
44
45
|
expect(controller.company.audits.last.user).to eq(user)
|
45
46
|
end
|
46
47
|
|
48
|
+
it "does not audit when method is not found" do
|
49
|
+
controller.send(:current_user=, user)
|
50
|
+
Audited.current_user_method = :nope
|
51
|
+
expect {
|
52
|
+
post :create
|
53
|
+
}.to change( Audited::Audit, :count )
|
54
|
+
expect(controller.company.audits.last.user).to eq(nil)
|
55
|
+
end
|
56
|
+
|
47
57
|
it "should support custom users for sweepers" do
|
48
58
|
controller.send(:custom_user=, user)
|
49
59
|
Audited.current_user_method = :custom_user
|
@@ -84,7 +94,6 @@ describe AuditsController do
|
|
84
94
|
|
85
95
|
expect(controller.company.audits.last.user).to eq(user)
|
86
96
|
end
|
87
|
-
|
88
97
|
end
|
89
98
|
|
90
99
|
describe "PUT update" do
|
@@ -92,13 +101,13 @@ describe AuditsController do
|
|
92
101
|
controller.send(:current_user=, user)
|
93
102
|
|
94
103
|
expect {
|
95
|
-
|
104
|
+
params = Rails::VERSION::MAJOR == 4 ? {id: 123} : {params: {id: 123}}
|
105
|
+
put :update, **params
|
96
106
|
}.to_not change( Audited::Audit, :count )
|
97
107
|
end
|
98
108
|
end
|
99
109
|
end
|
100
110
|
|
101
|
-
|
102
111
|
describe Audited::Sweeper do
|
103
112
|
|
104
113
|
it "should be thread-safe" do
|
@@ -20,8 +20,10 @@ module AuditedSpecHelpers
|
|
20
20
|
def run_migrations(direction, migrations_paths, target_version = nil)
|
21
21
|
if rails_below?('5.2.0.rc1')
|
22
22
|
ActiveRecord::Migrator.send(direction, migrations_paths, target_version)
|
23
|
-
|
23
|
+
elsif rails_below?('6.0.0.rc1')
|
24
24
|
ActiveRecord::MigrationContext.new(migrations_paths).send(direction, target_version)
|
25
|
+
else
|
26
|
+
ActiveRecord::MigrationContext.new(migrations_paths, ActiveRecord::SchemaMigration).send(direction, target_version)
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -6,3 +6,8 @@ module RailsApp
|
|
6
6
|
config.i18n.enforce_available_locales = true
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
10
|
+
require 'active_record/connection_adapters/sqlite3_adapter'
|
11
|
+
if ActiveRecord::ConnectionAdapters::SQLite3Adapter.respond_to?(:represent_boolean_as_integer)
|
12
|
+
ActiveRecord::ConnectionAdapters::SQLite3Adapter.represent_boolean_as_integer = true
|
13
|
+
end
|
data/spec/spec_helper.rb
CHANGED