aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/cases/dirty_test.rb
blob: c6777f6bfd806c655d8e4b6ba5852bbe91d8a0a2 (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
require 'cases/helper'

# Stub out an AR-alike.
class DirtyTestSubject
  def self.table_name;  'people' end
  def self.primary_key; 'id' end
  def self.attribute_method_suffix(*suffixes) suffixes end

  def initialize(attrs = {}) @attributes = attrs end

  def save
    changed_attributes.clear
  end

  alias_method :save!, :save

  def name; read_attribute('name') end
  def name=(value); write_attribute('name', value) end
  def name_was; attribute_was('name') end
  def name_change; attribute_change('name') end
  def name_changed?; attribute_changed?('name') end

  private
    def define_read_methods; nil end

    def read_attribute(attr)
      @attributes[attr]
    end

    def write_attribute(attr, value)
      @attributes[attr] = value
    end
end

# Include the module after the class is all set up.
DirtyTestSubject.module_eval { include ActiveRecord::Dirty }


class DirtyTest < Test::Unit::TestCase
  def test_attribute_changes
    # New record - no changes.
    person = DirtyTestSubject.new
    assert !person.name_changed?
    assert_nil person.name_change

    # Change name.
    person.name = 'a'
    assert person.name_changed?
    assert_nil person.name_was
    assert_equal [nil, 'a'], person.name_change

    # Saved - no changes.
    person.save!
    assert !person.name_changed?
    assert_nil person.name_change

    # Same value - no changes.
    person.name = 'a'
    assert !person.name_changed?
    assert_nil person.name_change
  end

  def test_object_should_be_changed_if_any_attribute_is_changed
    person = DirtyTestSubject.new
    assert !person.changed?
    assert_equal [], person.changed
    assert_equal Hash.new, person.changes

    person.name = 'a'
    assert person.changed?
    assert_nil person.name_was
    assert_equal %w(name), person.changed
    assert_equal({'name' => [nil, 'a']}, person.changes)

    person.save
    assert !person.changed?
    assert_equal [], person.changed
    assert_equal({}, person.changes)
  end
end