diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-06-27 22:52:50 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-06-27 22:52:50 +0200 |
| commit | 9a19a0494ef51cdac9a78e24d517ca48ba44c453 (patch) | |
| tree | 8eaae12d8047a40e29d3ea7ff3116b5c869e04bd /test/models/node_test.rb | |
| parent | 85a01e35274b8d4d4165a7b26bd7986e211246bb (diff) | |
| parent | 1853082fcd8c067390c246f9daa01a9b47387497 (diff) | |
Migration from Rails 2.3.5 to Rails 8.1 successful.
Merging dev branch.
Diffstat (limited to 'test/models/node_test.rb')
| -rw-r--r-- | test/models/node_test.rb | 290 |
1 files changed, 290 insertions, 0 deletions
diff --git a/test/models/node_test.rb b/test/models/node_test.rb new file mode 100644 index 0000000..514ba3f --- /dev/null +++ b/test/models/node_test.rb | |||
| @@ -0,0 +1,290 @@ | |||
| 1 | require 'test_helper' | ||
| 2 | |||
| 3 | class NodeTest < ActiveSupport::TestCase | ||
| 4 | |||
| 5 | def setup | ||
| 6 | @root = Node.find(1) | ||
| 7 | @first_child = Node.find(2) | ||
| 8 | @first_child.pages.create! :title => "one" | ||
| 9 | @first_child.draft = @first_child.pages.last | ||
| 10 | @first_child.save | ||
| 11 | @second_child = Node.find(3) | ||
| 12 | @second_child.pages.create! :title => "one" | ||
| 13 | |||
| 14 | @user1 = User.create :login => 'demo', :email => "f@b.com", :password => 'foobar', :password_confirmation => 'foobar' | ||
| 15 | @user2 = User.create :login => 'show', :email => "f@b.com", :password => 'foobar', :password_confirmation => 'foobar' | ||
| 16 | end | ||
| 17 | |||
| 18 | test "can only create one root node" do | ||
| 19 | Node.delete_all | ||
| 20 | Node.create! :slug => :root | ||
| 21 | assert_raise(ActiveRecord::RecordInvalid) do | ||
| 22 | Node.create! :slug => :root | ||
| 23 | end | ||
| 24 | end | ||
| 25 | |||
| 26 | def test_returning_existing_drafts | ||
| 27 | test_node = Node.root.children.create! :slug => "test_node" | ||
| 28 | |||
| 29 | assert_not_nil test_node.draft | ||
| 30 | assert_equal 1, test_node.pages.length | ||
| 31 | assert_nil test_node.draft.user | ||
| 32 | |||
| 33 | 3.times do | ||
| 34 | test_node.find_or_create_draft @user1 | ||
| 35 | end | ||
| 36 | |||
| 37 | assert_equal 1, test_node.pages.length | ||
| 38 | end | ||
| 39 | |||
| 40 | def test_user_gets_assigned_to_unlocked_draft | ||
| 41 | assert_not_nil @first_child.draft | ||
| 42 | assert_nil @first_child.draft.user | ||
| 43 | @first_child.find_or_create_draft @user1 | ||
| 44 | assert_equal @user1, @first_child.lock_owner | ||
| 45 | end | ||
| 46 | |||
| 47 | def test_unique_path_returns_an_array | ||
| 48 | assert_equal ["first_child"], @first_child.unique_path | ||
| 49 | new_node = @first_child.children.create! :slug => "third_child" | ||
| 50 | assert_equal ["first_child", "third_child"], new_node.unique_path | ||
| 51 | end | ||
| 52 | |||
| 53 | def test_specifying_a_revision_other_than_with_a_fixnum_raises_exception | ||
| 54 | assert_raise(ArgumentError) { Node.find_page "first_child", 1.9 } | ||
| 55 | assert_raise(ArgumentError) { Node.find_page "first_child", "1" } | ||
| 56 | assert_raise(ArgumentError) { Node.find_page "first_child", :head } | ||
| 57 | end | ||
| 58 | |||
| 59 | def test_publish_draft_on_a_node_without_a_draft_returns_nil | ||
| 60 | |||
| 61 | assert @first_child.publish_draft! | ||
| 62 | assert_nil @first_child.publish_draft! | ||
| 63 | end | ||
| 64 | |||
| 65 | def test_cloning_a_head_page_to_a_new_draft_with_translations | ||
| 66 | assert_not_nil draft = @first_child.draft | ||
| 67 | I18n.locale = :de | ||
| 68 | draft.title = "Hallo" | ||
| 69 | draft.abstract = "Bitte" | ||
| 70 | draft.body = "Danke" | ||
| 71 | draft.save | ||
| 72 | I18n.locale = :en | ||
| 73 | draft.title = "Hello" | ||
| 74 | draft.abstract = "Please" | ||
| 75 | draft.body = "Thanks" | ||
| 76 | draft.save | ||
| 77 | |||
| 78 | @first_child.publish_draft! | ||
| 79 | |||
| 80 | draft1 = @first_child.find_or_create_draft(@user1) | ||
| 81 | |||
| 82 | I18n.locale = :de | ||
| 83 | assert_equal "Hallo", draft1.title | ||
| 84 | assert_equal "Bitte", draft1.abstract | ||
| 85 | assert_equal "Danke", draft1.body | ||
| 86 | |||
| 87 | I18n.locale = :en | ||
| 88 | assert_equal "Hello", draft1.title | ||
| 89 | assert_equal "Please", draft1.abstract | ||
| 90 | assert_equal "Thanks", draft1.body | ||
| 91 | end | ||
| 92 | |||
| 93 | def test_created_nodes_have_an_empty_draft_and_no_head | ||
| 94 | node = Node.root.children.create! :slug => "third_child_beta" | ||
| 95 | |||
| 96 | assert !node.pages.empty? | ||
| 97 | assert_equal 1, node.pages.length | ||
| 98 | assert_not_nil node.draft | ||
| 99 | assert_nil node.draft.user | ||
| 100 | assert_nil node.head | ||
| 101 | end | ||
| 102 | |||
| 103 | def test_create_new_draft_of_published_page | ||
| 104 | node = Node.root.children.create :slug => "xyz" | ||
| 105 | assert node.publish_draft! | ||
| 106 | end | ||
| 107 | |||
| 108 | def test_find_or_create_draft_if_no_draft_exists | ||
| 109 | node = Node.root.children.create :slug => "xyz" | ||
| 110 | node.publish_draft! | ||
| 111 | assert_not_nil node.find_or_create_draft( @user1 ) | ||
| 112 | end | ||
| 113 | |||
| 114 | def test_find_or_create_draft_if_draft_exists_and_is_owned_by_user | ||
| 115 | node = Node.root.children.create :slug => "xyz" | ||
| 116 | node.publish_draft! | ||
| 117 | |||
| 118 | node.find_or_create_draft @user1 | ||
| 119 | node.find_or_create_draft @user1 | ||
| 120 | end | ||
| 121 | |||
| 122 | def test_exception_if_draft_exists_but_locked_by_another_user | ||
| 123 | node = Node.root.children.create :slug => "xyz" | ||
| 124 | node.publish_draft! | ||
| 125 | node.find_or_create_draft @user1 | ||
| 126 | assert_equal @user1, node.lock_owner | ||
| 127 | assert_raise(LockedByAnotherUser) do | ||
| 128 | node.find_or_create_draft @user2 | ||
| 129 | end | ||
| 130 | end | ||
| 131 | |||
| 132 | def test_creation_of_unique_name | ||
| 133 | node = Node.root.children.create :slug => 'child' | ||
| 134 | node.reload | ||
| 135 | assert_equal 'child', node.unique_name | ||
| 136 | |||
| 137 | node = @first_child.children.create :slug => 'deep_child' | ||
| 138 | node.reload | ||
| 139 | assert_equal 'first_child/deep_child', node.unique_name | ||
| 140 | end | ||
| 141 | |||
| 142 | def test_order_of_pages_by_revision | ||
| 143 | # This test should make sure the order is the same on different db's | ||
| 144 | # Remember, there is already an empty draft | ||
| 145 | two = @second_child.pages.create :title => "two" | ||
| 146 | three = @second_child.pages.create :title => "three" | ||
| 147 | four = @second_child.pages.create :title => "four" | ||
| 148 | |||
| 149 | @second_child.pages.reload | ||
| 150 | |||
| 151 | assert_equal [1,2,3,4], @second_child.pages.map { |x| x.revision } | ||
| 152 | end | ||
| 153 | |||
| 154 | def test_behavior_of_acts_as_list | ||
| 155 | two = @second_child.pages.create :title => "two" | ||
| 156 | three = @second_child.pages.create :title => "three" | ||
| 157 | four = @second_child.pages.create :title => "four" | ||
| 158 | |||
| 159 | assert_equal 2, two.revision | ||
| 160 | assert_equal 3, three.revision | ||
| 161 | assert_equal 4, four.revision | ||
| 162 | |||
| 163 | assert_equal four, @second_child.pages.last | ||
| 164 | |||
| 165 | assert two.move_to_bottom | ||
| 166 | |||
| 167 | two.reload; three.reload; four.reload; | ||
| 168 | |||
| 169 | assert_equal 4, two.revision | ||
| 170 | assert_equal 2, three.revision | ||
| 171 | assert_equal 3, four.revision | ||
| 172 | end | ||
| 173 | |||
| 174 | def test_retrieving_page_current | ||
| 175 | updates = Node.root.children.create(:slug => 'updates') | ||
| 176 | year = updates.children.create(:slug => '2008') | ||
| 177 | foo = year.children.create(:slug => 'foo') | ||
| 178 | |||
| 179 | assert_not_nil Node.find_by_unique_name('updates/2008/foo') | ||
| 180 | |||
| 181 | # Note that there is already an initial, blank revision | ||
| 182 | foo.pages.create :title => "Version 2" | ||
| 183 | foo.pages.create :title => "Version 3" | ||
| 184 | foo.pages.create :title => "Version 4" | ||
| 185 | |||
| 186 | foo.head = foo.pages.last | ||
| 187 | foo.save! | ||
| 188 | |||
| 189 | page = Node.find_page("updates/2008/foo") | ||
| 190 | assert_equal page, foo.pages.find_by_revision(4) | ||
| 191 | end | ||
| 192 | |||
| 193 | def test_retrieving_page_by_revision | ||
| 194 | updates = Node.root.children.create(:slug => 'updates') | ||
| 195 | year = updates.children.create(:slug => '2008') | ||
| 196 | foo = year.children.create(:slug => 'foo') | ||
| 197 | |||
| 198 | assert_not_nil Node.find_by_unique_name('updates/2008/foo') | ||
| 199 | |||
| 200 | # Note that there is already an initial, blank revision | ||
| 201 | foo.pages.create :title => "Version 2" | ||
| 202 | foo.pages.create :title => "Version 3" | ||
| 203 | foo.pages.create :title => "Version 4" | ||
| 204 | |||
| 205 | page = Node.find_page("updates/2008/foo", 2) | ||
| 206 | assert_equal "Version 2", page.title | ||
| 207 | end | ||
| 208 | |||
| 209 | # Thats a lengthy test to make sure everything works as it should, it was | ||
| 210 | # created during a bug hunt | ||
| 211 | def test_creating_new_draft | ||
| 212 | test_node = Node.root.children.create! :slug => "test_node" | ||
| 213 | test_node.draft.user = @user1 | ||
| 214 | test_node.save | ||
| 215 | assert test_node.publish_draft! | ||
| 216 | test_node.reload | ||
| 217 | assert_equal 1, test_node.pages.length | ||
| 218 | assert_not_nil test_node.head | ||
| 219 | assert_nil test_node.draft | ||
| 220 | test_node.find_or_create_draft @user1 | ||
| 221 | test_node.reload | ||
| 222 | assert_equal 2, test_node.pages.length | ||
| 223 | assert_not_nil test_node.draft | ||
| 224 | assert test_node.head != test_node.draft | ||
| 225 | end | ||
| 226 | |||
| 227 | test "restoring a revision" do | ||
| 228 | test_node = Node.root.children.create! :slug => "test_node" | ||
| 229 | create_revisions( test_node, 3 ) | ||
| 230 | test_node.find_or_create_draft @user1 | ||
| 231 | test_node.reload | ||
| 232 | |||
| 233 | assert_equal 4, test_node.pages.count | ||
| 234 | assert_equal 3, test_node.head.revision | ||
| 235 | |||
| 236 | test_node.restore_revision!(1) | ||
| 237 | assert_equal 1, test_node.head.revision | ||
| 238 | assert_equal 4, test_node.draft.revision | ||
| 239 | end | ||
| 240 | |||
| 241 | test "a new revision keeps the initial user" do | ||
| 242 | Node.root.descendants.destroy_all | ||
| 243 | node = create_node_with_draft | ||
| 244 | draft = node.draft | ||
| 245 | draft.user = users(:aaron) | ||
| 246 | draft.save | ||
| 247 | node.publish_draft! | ||
| 248 | new_draft = node.find_or_create_draft( users(:quentin) ) | ||
| 249 | assert_equal "aaron", new_draft.user.login | ||
| 250 | end | ||
| 251 | |||
| 252 | test "a new revision can overwrite the initial author" do | ||
| 253 | Node.root.descendants.destroy_all | ||
| 254 | node = create_node_with_draft | ||
| 255 | draft = node.draft | ||
| 256 | draft.user = users(:aaron) | ||
| 257 | draft.save! | ||
| 258 | node.publish_draft! | ||
| 259 | new_draft = node.find_or_create_draft( users(:quentin) ) | ||
| 260 | new_draft.user_id = users(:quentin).id | ||
| 261 | new_draft.save | ||
| 262 | node.publish_draft! | ||
| 263 | assert_equal "quentin", node.head.user.login | ||
| 264 | end | ||
| 265 | |||
| 266 | |||
| 267 | test "update?" do | ||
| 268 | Node.root.descendants.delete_all | ||
| 269 | updates = Node.root.children.create!( :slug => "updates" ) | ||
| 270 | assert !updates.update? | ||
| 271 | |||
| 272 | updates2009 = updates.children.create!( :slug => "2009" ) | ||
| 273 | assert !updates2009.update? | ||
| 274 | |||
| 275 | update = updates2009.children.create!( :slug => "my-first-update" ) | ||
| 276 | assert update.update? | ||
| 277 | end | ||
| 278 | |||
| 279 | test "new nodes should have drafts with no publidhed_at set" do | ||
| 280 | node = Node.root.children.create( :slug => "wow" ) | ||
| 281 | assert_nil node.draft.published_at | ||
| 282 | end | ||
| 283 | |||
| 284 | def create_revisions node, count | ||
| 285 | count.times do | ||
| 286 | node.find_or_create_draft @user1 | ||
| 287 | node.publish_draft! | ||
| 288 | end | ||
| 289 | end | ||
| 290 | end | ||
