aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/filter_attributes_test.rb
blob: 2f4c9b0ef790c66d4a4d094efc41f50b916a687b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# frozen_string_literal: true

require "cases/helper"
require "models/admin"
require "models/admin/user"
require "models/admin/account"
require "models/user"
require "pp"

class FilterAttributesTest < ActiveRecord::TestCase
  fixtures :"admin/users", :"admin/accounts"

  setup do
    @previous_filter_attributes = ActiveRecord::Base.filter_attributes
    ActiveRecord::Base.filter_attributes = [:name]
  end

  teardown do
    ActiveRecord::Base.filter_attributes = @previous_filter_attributes
  end

  test "filter_attributes" do
    Admin::User.all.each do |user|
      assert_includes user.inspect, "name: [FILTERED]"
      assert_equal 1, user.inspect.scan("[FILTERED]").length
    end

    Admin::Account.all.each do |account|
      assert_includes account.inspect, "name: [FILTERED]"
      assert_equal 1, account.inspect.scan("[FILTERED]").length
    end
  end

  test "string filter_attributes perform pertial match" do
    ActiveRecord::Base.filter_attributes = ["n"]
    Admin::Account.all.each do |account|
      assert_includes account.inspect, "name: [FILTERED]"
      assert_equal 1, account.inspect.scan("[FILTERED]").length
    end
  end

  test "regex filter_attributes are accepted" do
    ActiveRecord::Base.filter_attributes = [/\An\z/]
    account = Admin::Account.find_by(name: "37signals")
    assert_includes account.inspect, 'name: "37signals"'
    assert_equal 0, account.inspect.scan("[FILTERED]").length

    ActiveRecord::Base.filter_attributes = [/\An/]
    account = Admin::Account.find_by(name: "37signals")
    assert_includes account.reload.inspect, "name: [FILTERED]"
    assert_equal 1, account.inspect.scan("[FILTERED]").length
  end

  test "proc filter_attributes are accepted" do
    ActiveRecord::Base.filter_attributes = [ lambda { |key, value| value.reverse! if key == "name" } ]
    account = Admin::Account.find_by(name: "37signals")
    assert_includes account.inspect, 'name: "slangis73"'
  end

  test "filter_attributes could be overwritten by models" do
    Admin::Account.all.each do |account|
      assert_includes account.inspect, "name: [FILTERED]"
      assert_equal 1, account.inspect.scan("[FILTERED]").length
    end

    begin
      Admin::Account.filter_attributes = []

      # Above changes should not impact other models
      Admin::User.all.each do |user|
        assert_includes user.inspect, "name: [FILTERED]"
        assert_equal 1, user.inspect.scan("[FILTERED]").length
      end

      Admin::Account.all.each do |account|
        assert_not_includes account.inspect, "name: [FILTERED]"
        assert_equal 0, account.inspect.scan("[FILTERED]").length
      end
    ensure
      Admin::Account.remove_instance_variable(:@filter_attributes)
    end
  end

  test "filter_attributes should not filter nil value" do
    account = Admin::Account.new

    assert_includes account.inspect, "name: nil"
    assert_not_includes account.inspect, "name: [FILTERED]"
    assert_equal 0, account.inspect.scan("[FILTERED]").length
  end

  test "filter_attributes should handle [FILTERED] value properly" do
    User.filter_attributes = ["auth"]
    user = User.new(token: "[FILTERED]", auth_token: "[FILTERED]")

    assert_includes user.inspect, "auth_token: [FILTERED]"
    assert_includes user.inspect, 'token: "[FILTERED]"'
  ensure
    User.remove_instance_variable(:@filter_attributes)
  end

  test "filter_attributes on pretty_print" do
    user = admin_users(:david)
    actual = "".dup
    PP.pp(user, StringIO.new(actual))

    assert_includes actual, "name: [FILTERED]"
    assert_equal 1, actual.scan("[FILTERED]").length
  end

  test "filter_attributes on pretty_print should not filter nil value" do
    user = Admin::User.new
    actual = "".dup
    PP.pp(user, StringIO.new(actual))

    assert_includes actual, "name: nil"
    assert_not_includes actual, "name: [FILTERED]"
    assert_equal 0, actual.scan("[FILTERED]").length
  end

  test "filter_attributes on pretty_print should handle [FILTERED] value properly" do
    User.filter_attributes = ["auth"]
    user = User.new(token: "[FILTERED]", auth_token: "[FILTERED]")
    actual = "".dup
    PP.pp(user, StringIO.new(actual))

    assert_includes actual, "auth_token: [FILTERED]"
    assert_includes actual, 'token: "[FILTERED]"'
  ensure
    User.remove_instance_variable(:@filter_attributes)
  end
end