summaryrefslogtreecommitdiff
path: root/test/models/page_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/models/page_test.rb')
-rw-r--r--test/models/page_test.rb229
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
146end 373end