require 'test_helper' class NodeActionsHelperTest < ActionView::TestCase def setup @original_locale = I18n.locale I18n.locale = :en end def default_url_options { :locale => nil } end def icon(_name, **) ''.html_safe end def teardown I18n.locale = @original_locale end def entry action, metadata = {}, node: nil, user: nil, page: nil NodeAction.create!(:node => node, :user => user, :page => page, :action => action, :occurred_at => Time.now, :metadata => { "username" => "quentin", "human_readable_node_name" => "Subject" }.merge(metadata)) end test "publish renders the revision sentence, not the titles" do out = action_summary(entry("publish", { "via" => "draft", "title" => { "from" => "Old", "to" => "New" } })) assert_includes out, "quentin" assert_includes out, "new revision" assert_not_includes out, "Old" end test "first publish uses its own sentence" do out = action_summary(entry("publish", { "via" => "draft", "title" => { "from" => nil, "to" => "New" } })) assert_includes out, "for the first time" end test "rollback publishes get the rollback sentence" do out = action_summary(entry("publish", { "via" => "revision", "title" => { "from" => "Now", "to" => "Then" } })) assert_includes out, "rolled" end test "move renders the path pair" do out = action_summary(entry("move", { "path" => { "from" => "a/b", "to" => "a/c" } })) assert_includes out, "a/b" assert_includes out, "a/c" end test "unknown verbs degrade to a generic sentence, never an error" do out = action_summary(entry("frobnicate")) assert_includes out, "frobnicate" assert_includes out, "quentin" end test "dead references render as plain names from metadata, no links" do out = action_summary(entry("publish", { "title" => { "from" => "Old", "to" => "New" } })) assert_not_includes out, " "bold" })) assert_not_includes out, "" end test "live associations upgrade names to links" do out = action_summary(entry("publish", { "title" => { "from" => "Old", "to" => "New" } }, :user => users(:quentin))) assert_includes out, " { "from" => "Same", "to" => "Same" } }) changed = entry("publish", { "title" => { "from" => "Old", "to" => "New" } }) assert_not action_details?(unchanged) assert action_details?(changed) end test "first publish with a byline names the author" do out = action_summary(entry("publish", { "title" => { "from" => nil, "to" => "New" }, "author" => { "from" => nil, "to" => "quentin" } })) assert_includes out, "author" end test "create entries with their flat title render and are guarded off details" do e = entry("create", { "title" => "Initial", "path" => "a/b" }) assert_includes action_summary(e), "a/b" assert_not action_details?(e) end test "trash, restore, and destroy render their paths" do trash = entry("trash", { "path" => { "from" => "club/old", "to" => "trash/old" } }) restore = entry("restore_from_trash", { "path" => { "from" => "trash/old", "to" => "club/new" } }) doomed = entry("destroy", { "path" => "trash/old" }) assert_includes action_summary(trash), "club/old" assert_includes action_summary(restore), "club/new" assert_includes action_summary(doomed), "trash/old" end test "revision lifecycle badges cover create, publish, rollback, and inference" do created = entry("create", { "title" => "x", "path" => "a/b" }) published = entry("publish", { "via" => "draft", "title" => { "from" => nil, "to" => "x" } }) restored = entry("publish", { "via" => "revision", "title" => { "from" => "y", "to" => "x" } }) restored.update!(:inferred_from => "from_page_revision") out = revision_lifecycle_badges([created, published, restored]) assert_includes out, "created" assert_includes out, "published" assert_includes out, "restored" assert_includes out, "quentin" assert_includes out, "node_action_inferred" assert_includes out, " { "from" => "a", "to" => "t/a" } })), "node_action_icon--trash" assert_includes verb_icon(entry("publish", { "via" => "revision" })), "node_action_icon--history" assert_includes verb_icon(entry("frobnicate")), "node_action_icon--circle-dashed" end end