-
Notifications
You must be signed in to change notification settings - Fork 21.4k
/
normalized_attribute_test.rb
113 lines (88 loc) · 3.4 KB
/
normalized_attribute_test.rb
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
# frozen_string_literal: true
require "cases/helper"
require "models/aircraft"
require "active_support/core_ext/string/inflections"
class NormalizedAttributeTest < ActiveRecord::TestCase
class NormalizedAircraft < Aircraft
normalizes :name, with: -> name { name.titlecase }
normalizes :manufactured_at, with: -> time { time.noon }
attr_accessor :validated_name
validate { self.validated_name = name.dup }
end
setup do
@time = Time.utc(1999, 12, 31, 12, 34, 56)
@aircraft = NormalizedAircraft.create!(name: "fly HIGH", manufactured_at: @time)
end
test "normalizes value from create" do
assert_equal "Fly High", @aircraft.name
end
test "normalizes value from update" do
@aircraft.update!(name: "fly HIGHER")
assert_equal "Fly Higher", @aircraft.name
end
test "normalizes value from assignment" do
@aircraft.name = "fly HIGHER"
assert_equal "Fly Higher", @aircraft.name
end
test "normalizes changed-in-place value before validation" do
@aircraft.name.downcase!
assert_equal "fly high", @aircraft.name
@aircraft.valid?
assert_equal "Fly High", @aircraft.validated_name
end
test "normalizes value on demand" do
@aircraft.name.downcase!
assert_equal "fly high", @aircraft.name
@aircraft.normalize_attribute(:name)
assert_equal "Fly High", @aircraft.name
end
test "normalizes value without record" do
assert_equal "Titlecase Me", NormalizedAircraft.normalize_value_for(:name, "titlecase ME")
end
test "casts value when no normalization is declared" do
assert_equal 6, NormalizedAircraft.normalize_value_for(:wheels_count, "6")
end
test "casts value before applying normalization" do
@aircraft.manufactured_at = @time.to_s
assert_equal @time.noon, @aircraft.manufactured_at
end
test "ignores nil by default" do
assert_nil NormalizedAircraft.normalize_value_for(:name, nil)
end
test "normalizes nil if apply_to_nil" do
including_nil = Class.new(Aircraft) do
normalizes :name, with: -> name { name&.titlecase || "Untitled" }, apply_to_nil: true
end
assert_equal "Untitled", including_nil.normalize_value_for(:name, nil)
end
test "does not automatically normalize value from database" do
from_database = NormalizedAircraft.find(Aircraft.create(name: "NOT titlecase").id)
assert_equal "NOT titlecase", from_database.name
end
test "finds record by normalized value" do
assert_equal @time.noon, @aircraft.manufactured_at
assert_equal @aircraft, NormalizedAircraft.find_by(manufactured_at: @time.to_s)
end
test "can stack normalizations" do
titlecase_then_reverse = Class.new(NormalizedAircraft) do
normalizes :name, with: -> name { name.reverse }
end
assert_equal "esreveR nehT esaceltiT", titlecase_then_reverse.normalize_value_for(:name, "titlecase THEN reverse")
assert_equal "Only Titlecase", NormalizedAircraft.normalize_value_for(:name, "ONLY titlecase")
end
test "minimizes number of times normalization is applied" do
count_applied = Class.new(Aircraft) do
normalizes :name, with: -> name { name.succ }
end
aircraft = count_applied.create!(name: "0")
assert_equal "1", aircraft.name
aircraft.name = "0"
assert_equal "1", aircraft.name
aircraft.save
assert_equal "1", aircraft.name
aircraft.name.replace("0")
assert_equal "0", aircraft.name
aircraft.save
assert_equal "1", aircraft.name
end
end