diff options
Diffstat (limited to 'test/models/node_action_test.rb')
| -rw-r--r-- | test/models/node_action_test.rb | 112 |
1 files changed, 112 insertions, 0 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 @@ | |||
| 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 | ||
