diff options
Diffstat (limited to 'test/models/page_test.rb')
| -rw-r--r-- | test/models/page_test.rb | 229 |
1 files changed, 228 insertions, 1 deletions
diff --git a/test/models/page_test.rb b/test/models/page_test.rb index afba8b5..24bc7c5 100644 --- a/test/models/page_test.rb +++ b/test/models/page_test.rb | |||
| @@ -142,5 +142,232 @@ class PageTest < ActiveSupport::TestCase | |||
| 142 | update = updates2009.children.create!( :slug => "my-first-update" ) | 142 | update = updates2009.children.create!( :slug => "my-first-update" ) |
| 143 | assert_equal "update", update.draft.template_name | 143 | assert_equal "update", update.draft.template_name |
| 144 | end | 144 | end |
| 145 | 145 | ||
| 146 | test "a page scheduled for future publication is not yet public even after being published" do | ||
| 147 | node = Node.root.children.create!(slug: "preview-scheduled-test") | ||
| 148 | draft = node.find_or_create_draft(@user1) | ||
| 149 | draft.title = "Scheduled test" | ||
| 150 | draft.published_at = 1.day.from_now | ||
| 151 | draft.save! | ||
| 152 | token = draft.ensure_preview_token! | ||
| 153 | |||
| 154 | node.publish_draft! | ||
| 155 | page = Page.find_by(preview_token: token) | ||
| 156 | |||
| 157 | assert_equal page.id, page.node.head_id | ||
| 158 | assert_not page.public? | ||
| 159 | end | ||
| 160 | |||
| 161 | test "a superseded page is no longer the head, even though it was once published" do | ||
| 162 | node = Node.root.children.create!(slug: "preview-superseded-test") | ||
| 163 | first_draft = node.find_or_create_draft(@user1) | ||
| 164 | first_draft.title = "First version" | ||
| 165 | first_draft.save! | ||
| 166 | first_token = first_draft.ensure_preview_token! | ||
| 167 | node.publish_draft! | ||
| 168 | |||
| 169 | second_draft = node.find_or_create_draft(@user1) | ||
| 170 | second_draft.title = "Second version" | ||
| 171 | second_draft.save! | ||
| 172 | node.publish_draft! | ||
| 173 | |||
| 174 | first_page = Page.find_by(preview_token: first_token) | ||
| 175 | |||
| 176 | assert_not_equal first_page.id, first_page.node.head_id | ||
| 177 | assert first_page.published_at.present? | ||
| 178 | end | ||
| 179 | |||
| 180 | test "clone_attributes_from preserves an unchanged locale's original timestamp" do | ||
| 181 | n = Node.root.children.create!(:slug => "clone_preserve_timestamp_test") | ||
| 182 | source = n.draft | ||
| 183 | Globalize.with_locale(:de) { source.update!(:title => "Deutscher Titel") } | ||
| 184 | Globalize.with_locale(:en) { source.update!(:title => "English Title") } | ||
| 185 | |||
| 186 | target = Page.create! | ||
| 187 | target.clone_attributes_from(source) | ||
| 188 | original_en_updated_at = target.translations.find_by(:locale => :en).updated_at | ||
| 189 | |||
| 190 | Globalize.with_locale(:de) { source.update!(:title => "Deutscher Titel (bearbeitet)") } | ||
| 191 | target.clone_attributes_from(source) | ||
| 192 | |||
| 193 | en_translation = target.translations.find_by(:locale => :en) | ||
| 194 | assert_equal "English Title", en_translation.title | ||
| 195 | assert_equal original_en_updated_at, en_translation.updated_at | ||
| 196 | end | ||
| 197 | |||
| 198 | test "clone_attributes_from gives a genuinely changed locale a fresh timestamp" do | ||
| 199 | n = Node.root.children.create!(:slug => "clone_fresh_timestamp_test") | ||
| 200 | source = n.draft | ||
| 201 | Globalize.with_locale(:de) { source.update!(:title => "Erste Version") } | ||
| 202 | |||
| 203 | target = Page.create! | ||
| 204 | target.clone_attributes_from(source) | ||
| 205 | original_de_updated_at = target.translations.find_by(:locale => :de).updated_at | ||
| 206 | |||
| 207 | Globalize.with_locale(:de) { source.update!(:title => "Zweite Version") } | ||
| 208 | target.clone_attributes_from(source) | ||
| 209 | |||
| 210 | de_translation = target.translations.find_by(:locale => :de) | ||
| 211 | assert_equal "Zweite Version", de_translation.title | ||
| 212 | assert_operator de_translation.updated_at, :>, original_de_updated_at | ||
| 213 | end | ||
| 214 | |||
| 215 | test "clone_attributes_from removes a locale no longer present in the source" do | ||
| 216 | n = Node.root.children.create!(:slug => "clone_removed_locale_test") | ||
| 217 | source = n.draft | ||
| 218 | Globalize.with_locale(:en) { source.update!(:title => "English Title") } | ||
| 219 | |||
| 220 | target = Page.create! | ||
| 221 | target.clone_attributes_from(source) | ||
| 222 | assert_includes target.translations.map(&:locale), :en | ||
| 223 | |||
| 224 | source.translations.where(:locale => :en).delete_all | ||
| 225 | target.clone_attributes_from(source) | ||
| 226 | |||
| 227 | assert_not_includes target.reload.translations.map(&:locale), :en | ||
| 228 | end | ||
| 229 | |||
| 230 | def test_diff_against_inline_keeps_tags_and_marks_only_the_changed_word | ||
| 231 | n = Node.root.children.create! :slug => "diff_against_test" | ||
| 232 | d = n.find_or_create_draft @user1 | ||
| 233 | d.title = "Old heading" | ||
| 234 | d.save! | ||
| 235 | n.publish_draft! | ||
| 236 | |||
| 237 | d2 = n.find_or_create_draft @user1 | ||
| 238 | d2.title = "New heading" | ||
| 239 | d2.save! | ||
| 240 | |||
| 241 | diff = d2.diff_against(n.head) | ||
| 242 | |||
| 243 | assert_match "<del>Old</del>", diff[:title] | ||
| 244 | assert_match "<ins>New</ins>", diff[:title] | ||
| 245 | end | ||
| 246 | |||
| 247 | def test_diff_against_side_by_side_returns_two_annotated_strings | ||
| 248 | n = Node.root.children.create! :slug => "diff_against_sbs_test" | ||
| 249 | d = n.find_or_create_draft @user1 | ||
| 250 | d.title = "Old heading" | ||
| 251 | d.save! | ||
| 252 | n.publish_draft! | ||
| 253 | |||
| 254 | d2 = n.find_or_create_draft @user1 | ||
| 255 | d2.title = "New heading" | ||
| 256 | d2.save! | ||
| 257 | |||
| 258 | old_html, new_html = d2.diff_against(n.head, view: :side_by_side)[:title] | ||
| 259 | |||
| 260 | assert_match "<del>Old</del>", old_html | ||
| 261 | assert_match "<ins>New</ins>", new_html | ||
| 262 | end | ||
| 263 | |||
| 264 | test "diff_against handles an inserted paragraph split without corrupting the document" do | ||
| 265 | n = Node.root.children.create! :slug => "paragraph_split_test" | ||
| 266 | d = n.find_or_create_draft @user1 | ||
| 267 | d.body = "<p>Der Vortragsraum ist ab 19 Uhr geöffnet, der Zugang erfolgt über den Hinterhof.</p>" | ||
| 268 | d.save! | ||
| 269 | n.publish_draft! | ||
| 270 | |||
| 271 | d2 = n.find_or_create_draft @user1 | ||
| 272 | d2.body = "<p>Der Vortragsraum ist ab 19 Uhr geöffnet,</p>\n<p>der Zugang erfolgt über den Hinterhof.</p>" | ||
| 273 | d2.save! | ||
| 274 | |||
| 275 | diff = d2.diff_against(n.head) | ||
| 276 | fragment = Nokogiri::HTML::DocumentFragment.parse(diff[:body]) | ||
| 277 | |||
| 278 | assert_equal 2, fragment.css('ins.diff_structural').length | ||
| 279 | assert_match "der Zugang erfolgt über den Hinterhof.", fragment.text | ||
| 280 | end | ||
| 281 | |||
| 282 | test "diff_against reports tag and template changes" do | ||
| 283 | n = Node.root.children.create! :slug => "field_diff_test" | ||
| 284 | d = n.find_or_create_draft @user1 | ||
| 285 | d.tag_list = "update" | ||
| 286 | d.template_name = "standard_template" | ||
| 287 | d.save! | ||
| 288 | n.publish_draft! | ||
| 289 | |||
| 290 | d2 = n.find_or_create_draft @user1 | ||
| 291 | d2.tag_list = "update, pressemitteilung" | ||
| 292 | d2.template_name = "title_only" | ||
| 293 | d2.save! | ||
| 294 | |||
| 295 | diff = d2.diff_against(n.head) | ||
| 296 | |||
| 297 | assert_equal ["pressemitteilung"], diff[:tags][:added] | ||
| 298 | assert_equal [], diff[:tags][:removed] | ||
| 299 | assert diff[:template_name][:changed] | ||
| 300 | assert_equal "standard_template", diff[:template_name][:from] | ||
| 301 | assert_equal "title_only", diff[:template_name][:to] | ||
| 302 | end | ||
| 303 | |||
| 304 | test "diff_against reports added and removed assets by filename" do | ||
| 305 | n = Node.root.children.create! :slug => "asset_diff_test" | ||
| 306 | d = n.find_or_create_draft @user1 | ||
| 307 | d.save! | ||
| 308 | n.publish_draft! | ||
| 309 | |||
| 310 | kept_asset = Asset.create!(:upload_file_name => "kept.png", :upload_content_type => "image/png", :upload_file_size => 1) | ||
| 311 | removed_asset = Asset.create!(:upload_file_name => "removed.pdf", :upload_content_type => "application/pdf", :upload_file_size => 1) | ||
| 312 | n.head.update_assets([kept_asset.id, removed_asset.id]) | ||
| 313 | |||
| 314 | d2 = n.find_or_create_draft @user1 | ||
| 315 | added_asset = Asset.create!(:upload_file_name => "added.png", :upload_content_type => "image/png", :upload_file_size => 1) | ||
| 316 | d2.update_assets([kept_asset.id, added_asset.id]) | ||
| 317 | d2.save! | ||
| 318 | |||
| 319 | diff = d2.diff_against(n.head) | ||
| 320 | |||
| 321 | assert_equal [added_asset], diff[:assets][:added] | ||
| 322 | assert_equal [removed_asset], diff[:assets][:removed] | ||
| 323 | end | ||
| 324 | |||
| 325 | test "diff_against with an explicit locale compares that locale's own translation on each side" do | ||
| 326 | n = Node.root.children.create!(:slug => "diff_locale_test") | ||
| 327 | d = n.find_or_create_draft(@user1) | ||
| 328 | Globalize.with_locale(:en) { d.update!(:title => "Old English") } | ||
| 329 | d.save! | ||
| 330 | n.publish_draft! | ||
| 331 | |||
| 332 | d2 = n.find_or_create_draft(@user1) | ||
| 333 | Globalize.with_locale(:en) { d2.update!(:title => "New English") } | ||
| 334 | d2.save! | ||
| 335 | |||
| 336 | diff = d2.diff_against(n.head, :locale => :en) | ||
| 337 | |||
| 338 | assert_match "<del>Old</del>", diff[:title] | ||
| 339 | assert_match "<ins>New</ins>", diff[:title] | ||
| 340 | end | ||
| 341 | |||
| 342 | test "diff_against with an explicit locale ignores content in other locales entirely" do | ||
| 343 | n = Node.root.children.create!(:slug => "diff_locale_isolation_test") | ||
| 344 | d = n.find_or_create_draft(@user1) | ||
| 345 | d.save! | ||
| 346 | n.publish_draft! | ||
| 347 | |||
| 348 | d2 = n.find_or_create_draft(@user1) | ||
| 349 | Globalize.with_locale(:de) { d2.update!(:title => "Nur Deutsch geändert") } | ||
| 350 | d2.save! | ||
| 351 | |||
| 352 | diff = d2.diff_against(n.head, :locale => :en) | ||
| 353 | |||
| 354 | assert_no_match(/Deutsch/, diff[:title]) | ||
| 355 | end | ||
| 356 | |||
| 357 | test "locale_diff_summary flags a locale that only exists on one side as changed" do | ||
| 358 | n = Node.root.children.create!(:slug => "diff_locale_summary_test") | ||
| 359 | d = n.find_or_create_draft(@user1) | ||
| 360 | d.save! | ||
| 361 | n.publish_draft! | ||
| 362 | |||
| 363 | d2 = n.find_or_create_draft(@user1) | ||
| 364 | Globalize.with_locale(:en) { d2.update!(:title => "New English translation") } | ||
| 365 | d2.save! | ||
| 366 | |||
| 367 | summary = d2.locale_diff_summary(n.head) | ||
| 368 | en_entry = summary.find { |s| s[:locale] == :en } | ||
| 369 | |||
| 370 | assert en_entry[:changed] | ||
| 371 | refute en_entry[:exists_there] | ||
| 372 | end | ||
| 146 | end | 373 | end |
