summaryrefslogtreecommitdiff
path: root/test/models
diff options
context:
space:
mode:
Diffstat (limited to 'test/models')
-rw-r--r--test/models/node_action_test.rb112
-rw-r--r--test/models/node_test.rb63
2 files changed, 172 insertions, 3 deletions
diff --git a/test/models/node_action_test.rb b/test/models/node_action_test.rb
new file mode 100644
index 0000000..24d8245
--- /dev/null
+++ b/test/models/node_action_test.rb
@@ -0,0 +1,112 @@
1require "test_helper"
2
3class NodeActionTest < ActiveSupport::TestCase
4
5 # Standalone pages, no node -- same pattern autosave relies on.
6 # Default-locale attributes are written pinned, never ambient.
7 def build_page en: nil, **attrs
8 page = Globalize.with_locale(I18n.default_locale) do
9 Page.create!({ :title => "Titel" }.merge(attrs))
10 end
11 page.translations.create!({ :locale => "en" }.merge(en)) if en
12 page.reload
13 end
14
15 test "first publish yields exactly the title pair, from nil" do
16 diff = NodeAction.head_diff(nil, build_page(:title => "Erstausgabe"))
17
18 assert_equal({ :title => { "from" => nil, "to" => "Erstausgabe" } }, diff)
19 end
20
21 test "title pair is always present, even when unchanged" do
22 diff = NodeAction.head_diff(build_page, build_page)
23
24 assert_equal "Titel", diff[:title]["from"]
25 assert_equal "Titel", diff[:title]["to"]
26 end
27
28 test "author pair present only when the byline changed" do
29 u1, u2 = users(:quentin), users(:aaron)
30
31 assert_nil NodeAction.head_diff(build_page(:user => u1), build_page(:user => u1))[:author]
32
33 changed = NodeAction.head_diff(build_page(:user => u1), build_page(:user => u2))
34 assert_equal({ "from" => u1.login, "to" => u2.login }, changed[:author])
35 end
36
37 test "tags pair present only when the tag set changed" do
38 old_page = build_page; old_page.tag_list = "alpha, beta"; old_page.save!
39 new_page = build_page; new_page.tag_list = "beta, gamma"; new_page.save!
40
41 diff = NodeAction.head_diff(old_page.reload, new_page.reload)
42 assert_equal %w[alpha beta], diff[:tags]["from"]
43 assert_equal %w[beta gamma], diff[:tags]["to"]
44
45 same = NodeAction.head_diff(old_page, old_page)
46 assert_nil same[:tags]
47 end
48
49 test "template_changed flag only when true" do
50 old_page = build_page(:template_name => "standard_template")
51
52 assert NodeAction.head_diff(old_page, build_page(:template_name => "update"))[:template_changed]
53 assert_nil NodeAction.head_diff(old_page, build_page(:template_name => "standard_template"))[:template_changed]
54 end
55
56 test "assets_changed flag when the attached set differs" do
57 asset = Asset.create!(:name => "diff probe",
58 :upload_file_name => "test_image.png",
59 :upload_content_type => "image/png",
60 :upload_file_size => 49854,
61 :upload_updated_at => Time.current)
62 old_page, new_page = build_page, build_page
63 new_page.related_assets.create!(:asset_id => asset.id, :position => 1)
64
65
66 diff = NodeAction.head_diff(old_page, new_page.reload)
67 assert diff[:assets_changed]
68 assert_nil NodeAction.head_diff(old_page, old_page)[:assets_changed]
69 end
70
71 test "default-locale abstract and body changes become flags, only when true" do
72 diff = NodeAction.head_diff(build_page(:abstract => "a"), build_page(:abstract => "b"))
73
74 assert diff[:abstract_changed]
75 assert_nil diff[:body_changed]
76 end
77
78 test "added locale carries status and the new title" do
79 diff = NodeAction.head_diff(build_page, build_page(en: { :title => "English" }))
80
81 entry = diff[:translation_diff]["en"]
82 assert_equal "added", entry["status"]
83 assert_equal({ "from" => nil, "to" => "English" }, entry["title"])
84 end
85
86 test "removed locale keeps the vanished title" do
87 diff = NodeAction.head_diff(build_page(en: { :title => "English" }), build_page)
88
89 entry = diff[:translation_diff]["en"]
90 assert_equal "removed", entry["status"]
91 assert_equal "English", entry["title"]["from"]
92 assert_nil entry["title"]["to"]
93 end
94
95 test "changed locale carries only what actually differs" do
96 old_page = build_page(en: { :title => "Same", :body => "old" })
97 new_page = build_page(en: { :title => "Same", :body => "new" })
98
99 entry = NodeAction.head_diff(old_page, new_page)[:translation_diff]["en"]
100 assert_equal "changed", entry["status"]
101 assert_nil entry["title"]
102 assert entry["body_changed"]
103 assert_nil entry["abstract_changed"]
104 end
105
106 test "untouched locales are absent; identical pages yield no translation_diff at all" do
107 old_page = build_page(en: { :title => "Same" })
108 new_page = build_page(en: { :title => "Same" })
109
110 assert_nil NodeAction.head_diff(old_page, new_page)[:translation_diff]
111 end
112end
diff --git a/test/models/node_test.rb b/test/models/node_test.rb
index 022fff6..c8e49e5 100644
--- a/test/models/node_test.rb
+++ b/test/models/node_test.rb
@@ -633,6 +633,7 @@ class NodeTest < ActiveSupport::TestCase
633 assert_equal node.head, action.page 633 assert_equal node.head, action.page
634 assert_equal @user1, action.user 634 assert_equal @user1, action.user
635 assert_equal "publish", action.action 635 assert_equal "publish", action.action
636 assert_equal "draft", action.metadata["via"]
636 end 637 end
637 638
638 test "publish_draft! called with no user logs no actor, not a guessed one" do 639 test "publish_draft! called with no user logs no actor, not a guessed one" do
@@ -692,7 +693,7 @@ class NodeTest < ActiveSupport::TestCase
692 assert_equal count_before, NodeAction.count 693 assert_equal count_before, NodeAction.count
693 end 694 end
694 695
695 test "publish_draft! records the title's from/to in metadata" do 696 test "publish_draft! records the title diff in metadata" do
696 node = create_node_with_published_page 697 node = create_node_with_published_page
697 Globalize.with_locale(:de) { node.head.update!(:title => "Original Title") } 698 Globalize.with_locale(:de) { node.head.update!(:title => "Original Title") }
698 find_or_create_draft(node, @user1) 699 find_or_create_draft(node, @user1)
@@ -701,7 +702,63 @@ class NodeTest < ActiveSupport::TestCase
701 node.publish_draft!(@user1) 702 node.publish_draft!(@user1)
702 703
703 action = NodeAction.last 704 action = NodeAction.last
704 assert_equal "Original Title", action.metadata["from"] 705 assert_equal "draft", action.metadata["via"]
705 assert_equal "New Title", action.metadata["to"] 706 assert_equal "Original Title", action.metadata.dig("title", "from")
707 assert_equal "New Title", action.metadata.dig("title", "to")
708 end
709
710 test "publishing a staged slug change logs a move with the path pair" do
711 node = create_node_with_published_page
712 path_before = node.unique_name
713 node.staged_slug = "moved-#{node.slug}"
714 node.save!
715 publish_count_before = NodeAction.where(:action => "publish").count
716
717 node.publish_draft!(@user1)
718
719 node.reload
720 assert_not_equal path_before, node.unique_name
721
722 action = NodeAction.where(:action => "move").last
723 assert_equal node, action.node
724 assert_equal @user1, action.user
725 assert_equal path_before, action.metadata.dig("path", "from")
726 assert_equal node.unique_name, action.metadata.dig("path", "to")
727
728 # No draft was pending: path change alone must not fabricate a publish.
729 assert_equal publish_count_before, NodeAction.where(:action => "publish").count
730 end
731
732 test "publishing a draft together with a staged move logs two entries" do
733 node = create_node_with_published_page
734 find_or_create_draft(node, @user1)
735 node.staged_slug = "relocated-#{node.slug}"
736 node.save!
737
738 assert_difference "NodeAction.count", 2 do
739 node.publish_draft!(@user1)
740 end
741
742 assert_equal %w[move publish],
743 NodeAction.order(:id).last(2).map(&:action).sort
744 end
745
746 test "restore_revision! logs a publish via revision" do
747 node = create_node_with_published_page
748 Globalize.with_locale(:de) { node.head.update!(:title => "First") }
749 first_head = node.head
750 find_or_create_draft(node, @user1)
751 Globalize.with_locale(:de) { node.draft.update!(:title => "Second") }
752 node.publish_draft!(@user1)
753
754 node.restore_revision!(first_head.revision, @user1)
755
756 action = NodeAction.last
757 assert_equal "publish", action.action
758 assert_equal "revision", action.metadata["via"]
759 assert_equal first_head, action.page
760 assert_equal @user1, action.user
761 assert_equal "Second", action.metadata.dig("title", "from")
762 assert_equal "First", action.metadata.dig("title", "to")
706 end 763 end
707end 764end