enum_test.rb 4.1 KB
Newer Older
1 2 3
require 'cases/helper'
require 'models/book'

4
class EnumTest < ActiveRecord::TestCase
5 6 7
  fixtures :books

  setup do
8
    @book = books(:awdr)
9 10 11 12 13 14
  end

  test "query state by predicate" do
    assert @book.proposed?
    assert_not @book.written?
    assert_not @book.published?
Y
Yury Korolev 已提交
15 16

    assert @book.unread?
17
  end
18

R
Robin Dupret 已提交
19
  test "query state with strings" do
20 21
    assert_equal "proposed", @book.status
    assert_equal "unread", @book.read_status
22 23
  end

24 25
  test "find via scope" do
    assert_equal @book, Book.proposed.first
Y
Yury Korolev 已提交
26
    assert_equal @book, Book.unread.first
27 28
  end

29 30 31 32
  test "update by declaration" do
    @book.written!
    assert @book.written?
  end
33

34 35 36 37
  test "update by setter" do
    @book.update! status: :written
    assert @book.written?
  end
38 39 40 41 42

  test "enum methods are overwritable" do
    assert_equal "do publish work...", @book.published!
    assert @book.published?
  end
43 44 45 46 47 48

  test "direct assignment" do
    @book.status = :written
    assert @book.written?
  end

49 50 51 52 53
  test "assign string value" do
    @book.status = "written"
    assert @book.written?
  end

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
  test "enum changed attributes" do
    old_status = @book.status
    @book.status = :published
    assert_equal old_status, @book.changed_attributes[:status]
  end

  test "enum changes" do
    old_status = @book.status
    @book.status = :published
    assert_equal [old_status, 'published'], @book.changes[:status]
  end

  test "enum attribute was" do
    old_status = @book.status
    @book.status = :published
    assert_equal old_status, @book.attribute_was(:status)
  end

  test "enum attribute changed" do
    @book.status = :published
    assert @book.attribute_changed?(:status)
  end

  test "enum attribute changed to" do
    @book.status = :published
    assert @book.attribute_changed?(:status, to: 'published')
  end

  test "enum attribute changed from" do
    old_status = @book.status
    @book.status = :published
    assert @book.attribute_changed?(:status, from: old_status)
  end

  test "enum attribute changed from old status to new status" do
    old_status = @book.status
    @book.status = :published
    assert @book.attribute_changed?(:status, from: old_status, to: 'published')
  end

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
  test "enum didn't change" do
    old_status = @book.status
    @book.status = old_status
    assert_not @book.attribute_changed?(:status)
  end

  test "persist changes that are dirty" do
    @book.status = :published
    assert @book.attribute_changed?(:status)
    @book.status = :written
    assert @book.attribute_changed?(:status)
  end

  test "reverted changes that are not dirty" do
    old_status = @book.status
    @book.status = :published
    assert @book.attribute_changed?(:status)
    @book.status = old_status
    assert_not @book.attribute_changed?(:status)
  end

  test "reverted changes are not dirty going from nil to value and back" do
    book = Book.create!(nullable_status: nil)

    book.nullable_status = :married
    assert book.attribute_changed?(:nullable_status)

    book.nullable_status = nil
    assert_not book.attribute_changed?(:nullable_status)
  end

125 126 127 128 129 130
  test "assign non existing value raises an error" do
    e = assert_raises(ArgumentError) do
      @book.status = :unknown
    end
    assert_equal "'unknown' is not a valid status", e.message
  end
131

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
  test "assign nil value" do
    @book.status = nil
    assert @book.status.nil?
  end

  test "assign empty string value" do
    @book.status = ''
    assert @book.status.nil?
  end

  test "assign long empty string value" do
    @book.status = '   '
    assert @book.status.nil?
  end

147
  test "constant to access the mapping" do
148 149 150
    assert_equal 0, Book.statuses[:proposed]
    assert_equal 1, Book.statuses["written"]
    assert_equal 2, Book.statuses[:published]
151
  end
R
Robin Dupret 已提交
152

153 154 155 156
  test "building new objects with enum scopes" do
    assert Book.written.build.written?
    assert Book.read.build.read?
  end
R
Robin Dupret 已提交
157

158 159 160
  test "creating new objects with enum scopes" do
    assert Book.written.create.written?
    assert Book.read.create.read?
R
Robin Dupret 已提交
161
  end
162 163 164 165

  test "_before_type_cast returns the enum label (required for form fields)" do
    assert_equal "proposed", @book.status_before_type_cast
  end
166
end