audited 5.3.0 → 5.3.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of audited might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a879772fc10cec2e4712d1f1407f78d98e424530bcd0124a02982d65c480a86e
4
- data.tar.gz: 3323835790e0dec306f7cdf26cd7a64cd3439f62b65c796ccb7db9d444766548
3
+ metadata.gz: 051f76b7a9cfbc91222643f2e0ddaa7738d2e446c00ec079dcf0b5d64d7146d3
4
+ data.tar.gz: 70ef8ed6c1473ca9d2ac21dc444ae66c0b8d42280e5a3c6bf4d1fe46c07f0e60
5
5
  SHA512:
6
- metadata.gz: f9b3891dbf782c3a24f04fcf552d9c2b821d38af1d4d1cece7b52990657f4a8ecfac86a98dc564b916eea60fe8788729914c58b6ce0e67fe9f55e836366cd13a
7
- data.tar.gz: 0b2bcb8602361987a30661fad0d22bd0058639a8f238457d37d3ec1c98fd03c4f6978164d2975f159d640ae0aceab024e03268616b55eade69d7dc8210c0ac5a
6
+ metadata.gz: e085b0764b5feb96dc88cb5db4361f07148550368bde350a45fe21aba47ed80bfa38bb5683437bf3ad7cd983d7dbfe5f4980a80a7da0f1bf76dabea037323b58
7
+ data.tar.gz: d55bbe1f1f139efd63ac97281d954bfac440b091e292ad57b23668a456f4e389f4401c9a6e6e4ebb9627d4556a9460cb94d2d71c0f0f2f5174b0e62cb2c10968
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Audited ChangeLog
2
2
 
3
+ ## 5.3.1 (2023-02-21)
4
+
5
+ - Ensure touch support doesn't cause double audits - @mcyoung
6
+ [#660](https://github.com/collectiveidea/audited/pull/660)
7
+ - Testing Improvements - @vlad-psh
8
+ [#628](https://github.com/collectiveidea/audited/pull/628)
9
+ - Testing Improvements - @mcyoung
10
+ [#658](https://github.com/collectiveidea/audited/pull/658)
11
+
3
12
  ## 5.3.0 (2023-02-14)
4
13
 
5
14
  - Audit touch calls - @mcyoung
@@ -247,6 +247,13 @@ module Audited
247
247
  all_changes.except(*self.class.non_audited_columns)
248
248
  end
249
249
 
250
+ if for_touch
251
+ filtered_changes.reject! do |k, v|
252
+ audits.last.audited_changes[k].to_json == v.to_json ||
253
+ audits.last.audited_changes[k].to_json == v[1].to_json
254
+ end
255
+ end
256
+
250
257
  filtered_changes = redact_values(filtered_changes)
251
258
  filtered_changes = filter_encrypted_attrs(filtered_changes)
252
259
  filtered_changes = normalize_enum_changes(filtered_changes)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Audited
4
- VERSION = "5.3.0"
4
+ VERSION = "5.3.1"
5
5
  end
@@ -1,8 +1,8 @@
1
1
  require "spec_helper"
2
2
 
3
3
  # not testing proxy_respond_to? hack / 2 methods / deprecation of `version`
4
- # also, an additional 3 around `after_touch` for Versions before 6.
5
- uncovered = ActiveRecord::VERSION::MAJOR < 6 ? 12 : 9
4
+ # also, an additional 5 around `after_touch` for Versions before 6.
5
+ uncovered = ActiveRecord::VERSION::MAJOR < 6 ? 14 : 9
6
6
  SingleCov.covered! uncovered: uncovered
7
7
 
8
8
  class ConditionalPrivateCompany < ::ActiveRecord::Base
@@ -146,7 +146,7 @@ describe Audited::Auditor do
146
146
  end
147
147
 
148
148
  it "should be configurable which attributes are not audited via ignored_attributes" do
149
- Audited.ignored_attributes = ["delta", "top_secret", "created_at"]
149
+ Audited.ignored_attributes = ["delta", "top_secret", "created_at", "updated_at"]
150
150
 
151
151
  expect(Secret.non_audited_columns).to include("delta", "top_secret", "created_at")
152
152
  end
@@ -218,17 +218,25 @@ describe Audited::Auditor do
218
218
  redacted = Audited::Auditor::AuditedInstanceMethods::REDACTED
219
219
  user =
220
220
  Models::ActiveRecord::UserMultipleRedactedAttributes.create(
221
- password: "password",
222
- ssn: 123456789
221
+ password: "password"
223
222
  )
224
223
  user.save!
225
224
  expect(user.audits.last.audited_changes["password"]).to eq(redacted)
225
+ # Saving '[REDACTED]' value for 'ssn' even if value wasn't set explicitly when record was created
226
226
  expect(user.audits.last.audited_changes["ssn"]).to eq(redacted)
227
+
227
228
  user.password = "new_password"
228
229
  user.ssn = 987654321
229
230
  user.save!
230
231
  expect(user.audits.last.audited_changes["password"]).to eq([redacted, redacted])
231
232
  expect(user.audits.last.audited_changes["ssn"]).to eq([redacted, redacted])
233
+
234
+ # If we haven't changed any attrs from 'redacted' list, audit should not contain these keys
235
+ user.name = "new name"
236
+ user.save!
237
+ expect(user.audits.last.audited_changes).to have_key('name')
238
+ expect(user.audits.last.audited_changes).not_to have_key('password')
239
+ expect(user.audits.last.audited_changes).not_to have_key('ssn')
232
240
  end
233
241
 
234
242
  it "should redact columns in 'redacted' column with custom option" do
@@ -420,7 +428,7 @@ describe Audited::Auditor do
420
428
  if ::ActiveRecord::VERSION::MAJOR >= 6
421
429
  describe "on touch" do
422
430
  before do
423
- @user = create_user(name: "Brandon", status: :active, audit_comment: "Touch")
431
+ @user = create_user(name: "Brandon", status: :active)
424
432
  end
425
433
 
426
434
  it "should save an audit" do
@@ -437,11 +445,14 @@ describe Audited::Auditor do
437
445
  it "should store the changed attributes" do
438
446
  @user.touch(:suspended_at)
439
447
  expect(@user.audits.last.audited_changes["suspended_at"][0]).to be_nil
440
- expect(Time.parse(@user.audits.last.audited_changes["suspended_at"][1].to_s)).to be_within(1.second).of(Time.current)
448
+ expect(Time.parse(@user.audits.last.audited_changes["suspended_at"][1].to_s)).to be_within(2.seconds).of(Time.current)
441
449
  end
442
450
 
443
451
  it "should store audit comment" do
444
- expect(@user.audits.last.comment).to eq("Touch")
452
+ @user.audit_comment = "Here exists a touch comment"
453
+ @user.touch(:suspended_at)
454
+ expect(@user.audits.last.action).to eq("update")
455
+ expect(@user.audits.last.comment).to eq("Here exists a touch comment")
445
456
  end
446
457
 
447
458
  it "should not save an audit if only specified on create/destroy" do
@@ -450,6 +461,44 @@ describe Audited::Auditor do
450
461
  on_create_destroy.touch(:suspended_at)
451
462
  }.to_not change(Audited::Audit, :count)
452
463
  end
464
+
465
+ context "don't double audit" do
466
+ let(:user) { Models::ActiveRecord::Owner.create(name: "OwnerUser", suspended_at: 1.month.ago, companies_attributes: [{ name: "OwnedCompany" }]) }
467
+ let(:company) { user.companies.first }
468
+
469
+ it "should only create 1 (create) audit for object" do
470
+ expect(user.audits.count).to eq(1)
471
+ expect(user.audits.first.action).to eq("create")
472
+ end
473
+
474
+ it "should only create 1 (create) audit for nested resource" do
475
+ expect(company.audits.count).to eq(1)
476
+ expect(company.audits.first.action).to eq("create")
477
+ end
478
+
479
+ context "after creating" do
480
+ it "updating / touching nested resource shouldn't save touch audit on parent object" do
481
+ expect { company.touch(:type) }.not_to change(user.audits, :count)
482
+ expect { company.update(type: "test") }.not_to change(user.audits, :count)
483
+ end
484
+
485
+ it "updating / touching parent object shouldn't save previous data" do
486
+ expect { user.touch(:suspended_at) }.to change(user.audits, :count).from(1).to(2)
487
+ expect(user.audits.last.action).to eq("update")
488
+ expect(user.audits.last.audited_changes.keys).to eq(%w[suspended_at])
489
+ end
490
+ end
491
+
492
+ context "after updating" do
493
+ it "changing nested resource shouldn't audit owner" do
494
+ expect { user.update(username: "test") }.to change(user.audits, :count).from(1).to(2)
495
+ expect { company.update(type: "test") }.not_to change(user.audits, :count)
496
+
497
+ expect { user.touch(:suspended_at) }.to change(user.audits, :count).from(2).to(3)
498
+ expect { company.update(type: "another_test") }.not_to change(user.audits, :count)
499
+ end
500
+ end
501
+ end
453
502
  end
454
503
  end
455
504
 
@@ -124,11 +124,12 @@ module Models
124
124
  audited
125
125
  has_associated_audits
126
126
  has_many :companies, class_name: "OwnedCompany", dependent: :destroy
127
+ accepts_nested_attributes_for :companies
127
128
  end
128
129
 
129
130
  class OwnedCompany < ::ActiveRecord::Base
130
131
  self.table_name = "companies"
131
- belongs_to :owner, class_name: "Owner"
132
+ belongs_to :owner, class_name: "Owner", touch: true
132
133
  attr_accessible :name, :owner if respond_to?(:attr_accessible) # declare attr_accessible before calling aaa
133
134
  audited associated_with: :owner
134
135
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: audited
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.3.0
4
+ version: 5.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Keepers
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2023-02-14 00:00:00.000000000 Z
16
+ date: 2023-02-21 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: activerecord
@@ -252,7 +252,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
252
252
  - !ruby/object:Gem::Version
253
253
  version: '0'
254
254
  requirements: []
255
- rubygems_version: 3.3.7
255
+ rubygems_version: 3.4.6
256
256
  signing_key:
257
257
  specification_version: 4
258
258
  summary: Log all changes to your models