diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/controllers/nodes_controller_test.rb | 15 | ||||
| -rw-r--r-- | test/controllers/page_translations_controller_test.rb | 11 | ||||
| -rw-r--r-- | test/models/node_action_test.rb | 112 | ||||
| -rw-r--r-- | test/models/node_test.rb | 63 |
4 files changed, 191 insertions, 10 deletions
diff --git a/test/controllers/nodes_controller_test.rb b/test/controllers/nodes_controller_test.rb index 9da9514..5b66bd3 100644 --- a/test/controllers/nodes_controller_test.rb +++ b/test/controllers/nodes_controller_test.rb | |||
| @@ -647,4 +647,19 @@ class NodesControllerTest < ActionController::TestCase | |||
| 647 | assert_select ".sitemap_node_actions", :text => /Create Child/ | 647 | assert_select ".sitemap_node_actions", :text => /Create Child/ |
| 648 | assert_select ".sitemap_node_actions", :text => /Revisions/, :count => 0 | 648 | assert_select ".sitemap_node_actions", :text => /Revisions/, :count => 0 |
| 649 | end | 649 | end |
| 650 | |||
| 651 | test "create logs a create NodeAction with path and title" do | ||
| 652 | login_as :quentin | ||
| 653 | |||
| 654 | assert_difference "NodeAction.count" do | ||
| 655 | post :create, params: { :kind => "generic", :title => "Brand New", :parent_id => Node.root.id } | ||
| 656 | end | ||
| 657 | |||
| 658 | action = NodeAction.last | ||
| 659 | assert_equal "create", action.action | ||
| 660 | assert_equal users(:quentin), action.user | ||
| 661 | assert_equal Node.last, action.node | ||
| 662 | assert_equal "Brand New", action.metadata["title"] | ||
| 663 | assert_equal Node.last.unique_name, action.metadata["path"] | ||
| 664 | end | ||
| 650 | end | 665 | end |
diff --git a/test/controllers/page_translations_controller_test.rb b/test/controllers/page_translations_controller_test.rb index 82f8bce..feaacd0 100644 --- a/test/controllers/page_translations_controller_test.rb +++ b/test/controllers/page_translations_controller_test.rb | |||
| @@ -83,18 +83,15 @@ class PageTranslationsControllerTest < ActionController::TestCase | |||
| 83 | assert_equal "in progress", Globalize.with_locale(:en) { node.autosave.title } | 83 | assert_equal "in progress", Globalize.with_locale(:en) { node.autosave.title } |
| 84 | end | 84 | end |
| 85 | 85 | ||
| 86 | test "destroy logs a translation_destroy NodeAction" do | 86 | test "destroy removes the translation, logs nothing, and redirects" do |
| 87 | login_as :quentin | 87 | login_as :quentin |
| 88 | node = Node.root.children.create!(:slug => "translation_destroy_log_test") | 88 | node = Node.root.children.create!(:slug => "translation_destroy_log_test") |
| 89 | Globalize.with_locale(:en) { node.draft.update!(:title => "English title") } | 89 | Globalize.with_locale(:en) { node.draft.update!(:title => "English title") } |
| 90 | 90 | ||
| 91 | delete :destroy, params: { :node_id => node.id, :translation_locale => "en" } | 91 | assert_no_difference "NodeAction.count" do |
| 92 | delete :destroy, params: { :node_id => node.id, :translation_locale => "en" } | ||
| 93 | end | ||
| 92 | 94 | ||
| 93 | action = NodeAction.last | ||
| 94 | assert_equal node, action.node | ||
| 95 | assert_equal "en", action.locale | ||
| 96 | assert_equal "translation_destroy", action.action | ||
| 97 | assert_equal users(:quentin), action.user | ||
| 98 | assert_redirected_to node_path(node) | 95 | assert_redirected_to node_path(node) |
| 99 | end | 96 | end |
| 100 | end | 97 | end |
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 @@ | |||
| 1 | require "test_helper" | ||
| 2 | |||
| 3 | class 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 | ||
| 112 | end | ||
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 |
| 707 | end | 764 | end |
