diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/controllers/assets_controller_test.rb | 41 | ||||
| -rw-r--r-- | test/controllers/nodes_controller_test.rb | 39 | ||||
| -rw-r--r-- | test/models/node_attach_asset_test.rb | 107 | ||||
| -rw-r--r-- | test/models/node_test.rb | 24 |
4 files changed, 179 insertions, 32 deletions
diff --git a/test/controllers/assets_controller_test.rb b/test/controllers/assets_controller_test.rb index f834541..05fc6de 100644 --- a/test/controllers/assets_controller_test.rb +++ b/test/controllers/assets_controller_test.rb | |||
| @@ -92,6 +92,47 @@ class AssetsControllerTest < ActionController::TestCase | |||
| 92 | end | 92 | end |
| 93 | end | 93 | end |
| 94 | 94 | ||
| 95 | # --- create with attach --- | ||
| 96 | |||
| 97 | test "create with node_id attaches the asset to the node's draft" do | ||
| 98 | node = Node.root.children.create!(:slug => "asset_attach_target") | ||
| 99 | |||
| 100 | post :create, params: { asset: { name: 'Attach me' }, node_id: node.id } | ||
| 101 | |||
| 102 | assert_response :redirect | ||
| 103 | asset = Asset.last | ||
| 104 | assert_includes node.draft.assets.reload, asset | ||
| 105 | assert_match /attached/, flash[:notice] | ||
| 106 | end | ||
| 107 | |||
| 108 | test "create against a foreign-locked node keeps the asset but refuses the attach" do | ||
| 109 | node = Node.root.children.create!(:slug => "asset_attach_locked") | ||
| 110 | node.lock_for_editing!(users(:aaron)) | ||
| 111 | |||
| 112 | assert_difference 'Asset.count', 1 do | ||
| 113 | post :create, params: { asset: { name: 'Orphaned for now' }, node_id: node.id } | ||
| 114 | end | ||
| 115 | |||
| 116 | assert_empty node.draft.assets.reload | ||
| 117 | assert_equal node_path(node), flash[:locked_node_path] | ||
| 118 | assert_equal "aaron", flash[:locked_by] | ||
| 119 | end | ||
| 120 | |||
| 121 | test "create with headline against a page that has one keeps the incumbent and warns" do | ||
| 122 | node = Node.root.children.create!(:slug => "asset_attach_headline") | ||
| 123 | incumbent = Asset.create!(:name => 'Incumbent', :upload_content_type => 'image/png') | ||
| 124 | node.draft.related_assets.create!(:asset => incumbent, :headline => true) | ||
| 125 | |||
| 126 | uploaded = Rack::Test::UploadedFile.new( | ||
| 127 | Rails.root.join('test', 'fixtures', 'files', 'test_image.png'), 'image/png') | ||
| 128 | post :create, params: { asset: { name: 'Challenger', upload: uploaded }, | ||
| 129 | node_id: node.id, headline: "1" } | ||
| 130 | |||
| 131 | assert_includes node.draft.assets.reload, Asset.last | ||
| 132 | assert_equal incumbent, node.draft.reload.headline_asset | ||
| 133 | assert_equal node_path(node), flash[:headline_kept_path] | ||
| 134 | end | ||
| 135 | |||
| 95 | # --- edit --- | 136 | # --- edit --- |
| 96 | 137 | ||
| 97 | test "get edit" do | 138 | test "get edit" do |
diff --git a/test/controllers/nodes_controller_test.rb b/test/controllers/nodes_controller_test.rb index ddc4565..d777108 100644 --- a/test/controllers/nodes_controller_test.rb +++ b/test/controllers/nodes_controller_test.rb | |||
| @@ -79,6 +79,35 @@ class NodesControllerTest < ActionController::TestCase | |||
| 79 | end | 79 | end |
| 80 | end | 80 | end |
| 81 | 81 | ||
| 82 | test "create with asset_id attaches the asset to the new draft, as headline when asked" do | ||
| 83 | login_as :quentin | ||
| 84 | asset = Asset.create!(:name => 'Birth attachment', :upload_content_type => 'image/png') | ||
| 85 | |||
| 86 | post :create, params: { :kind => "generic", :parent_id => Node.root.id, | ||
| 87 | :title => "Born Attached", | ||
| 88 | :asset_id => asset.id, :asset_headline => "1" } | ||
| 89 | |||
| 90 | assert_response :redirect | ||
| 91 | node = Node.last | ||
| 92 | assert_includes node.draft.assets, asset | ||
| 93 | assert_equal asset, node.draft.headline_asset | ||
| 94 | assert_match /attached/, flash[:notice] | ||
| 95 | end | ||
| 96 | |||
| 97 | test "the attach notice survives the redirect into the editor" do | ||
| 98 | login_as :quentin | ||
| 99 | asset = Asset.create!(:name => 'Flash survivor', :upload_content_type => 'image/png') | ||
| 100 | |||
| 101 | post :create, params: { :kind => "generic", :parent_id => Node.root.id, | ||
| 102 | :title => "Notice Carrier", :asset_id => asset.id } | ||
| 103 | assert_redirected_to edit_node_path(Node.last) | ||
| 104 | |||
| 105 | get :edit, params: { :id => Node.last.id } | ||
| 106 | assert_response :success | ||
| 107 | assert_match /attached/, flash[:notice] | ||
| 108 | assert_no_match /ready to edit/, flash[:notice] | ||
| 109 | end | ||
| 110 | |||
| 82 | test "editing a node" do | 111 | test "editing a node" do |
| 83 | login_as :quentin | 112 | login_as :quentin |
| 84 | 113 | ||
| @@ -409,7 +438,7 @@ class NodesControllerTest < ActionController::TestCase | |||
| 409 | 438 | ||
| 410 | get :show, params: { id: node.id } | 439 | get :show, params: { id: node.id } |
| 411 | assert_response :success | 440 | assert_response :success |
| 412 | assert_select "a", text: "add event" | 441 | assert_select "a", text: "Add event" |
| 413 | assert_select "a[href*='tag_list=open-day']" | 442 | assert_select "a[href*='tag_list=open-day']" |
| 414 | assert_select "a[href*='auto_tag_source=erfa-detail']" | 443 | assert_select "a[href*='auto_tag_source=erfa-detail']" |
| 415 | end | 444 | end |
| @@ -420,7 +449,7 @@ class NodesControllerTest < ActionController::TestCase | |||
| 420 | 449 | ||
| 421 | get :show, params: { id: node.id } | 450 | get :show, params: { id: node.id } |
| 422 | assert_response :success | 451 | assert_response :success |
| 423 | assert_select "a", text: "add event" | 452 | assert_select "a", text: "Add event" |
| 424 | assert_select "a[href*='tag_list=']", count: 0 | 453 | assert_select "a[href*='tag_list=']", count: 0 |
| 425 | end | 454 | end |
| 426 | 455 | ||
| @@ -514,12 +543,6 @@ class NodesControllerTest < ActionController::TestCase | |||
| 514 | assert_includes assigns(:nodes), chaostreff_node | 543 | assert_includes assigns(:nodes), chaostreff_node |
| 515 | end | 544 | end |
| 516 | 545 | ||
| 517 | test "recent combined with a search term does not raise an ambiguous column error" do | ||
| 518 | login_as :quentin | ||
| 519 | get :recent, params: { :q => "Zombies" } | ||
| 520 | assert_response :success | ||
| 521 | end | ||
| 522 | |||
| 523 | test "drafts combined with a search term does not raise an ambiguous column error" do | 546 | test "drafts combined with a search term does not raise an ambiguous column error" do |
| 524 | login_as :quentin | 547 | login_as :quentin |
| 525 | get :drafts, params: { :q => "Zombies" } | 548 | get :drafts, params: { :q => "Zombies" } |
diff --git a/test/models/node_attach_asset_test.rb b/test/models/node_attach_asset_test.rb new file mode 100644 index 0000000..cb5b60f --- /dev/null +++ b/test/models/node_attach_asset_test.rb | |||
| @@ -0,0 +1,107 @@ | |||
| 1 | require "test_helper" | ||
| 2 | |||
| 3 | class NodeAttachAssetTest < ActiveSupport::TestCase | ||
| 4 | |||
| 5 | def setup | ||
| 6 | @user = users(:quentin) | ||
| 7 | @other = users(:aaron) | ||
| 8 | @node = Node.root.children.create!(:slug => "attach_asset_test") | ||
| 9 | @image = create_image_asset | ||
| 10 | end | ||
| 11 | |||
| 12 | test "attaches to a draft-only node" do | ||
| 13 | result = @node.attach_asset!(@image, :user => @user) | ||
| 14 | assert_equal 1, result[:attached] | ||
| 15 | assert_includes @node.draft.assets, @image | ||
| 16 | end | ||
| 17 | |||
| 18 | test "attaches to head when no draft is pending" do | ||
| 19 | @node.publish_draft!(@user) | ||
| 20 | result = @node.attach_asset!(@image, :user => @user) | ||
| 21 | assert_equal 1, result[:attached] | ||
| 22 | assert_includes @node.head.assets, @image | ||
| 23 | end | ||
| 24 | |||
| 25 | test "attaches to head and pending draft alike" do | ||
| 26 | @node.publish_draft!(@user) | ||
| 27 | @node.lock_for_editing!(@user) | ||
| 28 | @node.create_new_draft(@user) | ||
| 29 | result = @node.attach_asset!(@image, :user => @user) | ||
| 30 | assert_equal 2, result[:attached] | ||
| 31 | assert_includes @node.head.assets, @image | ||
| 32 | assert_includes @node.draft.assets, @image | ||
| 33 | end | ||
| 34 | |||
| 35 | test "attaches to all three lifecycle rows" do | ||
| 36 | @node.publish_draft!(@user) | ||
| 37 | @node.lock_for_editing!(@user) | ||
| 38 | @node.create_new_draft(@user) | ||
| 39 | @node.autosave!({ :title => "wip" }, @user) | ||
| 40 | result = @node.attach_asset!(@image, :user => @user) | ||
| 41 | assert_equal 3, result[:attached] | ||
| 42 | [@node.head, @node.draft, @node.autosave].each do |row| | ||
| 43 | assert_includes row.assets, @image | ||
| 44 | end | ||
| 45 | end | ||
| 46 | |||
| 47 | test "skips rows that already carry the asset" do | ||
| 48 | @node.draft.related_assets.create!(:asset => @image) | ||
| 49 | @node.publish_draft!(@user) | ||
| 50 | @node.lock_for_editing!(@user) | ||
| 51 | @node.create_new_draft(@user) | ||
| 52 | result = @node.attach_asset!(@image, :user => @user) | ||
| 53 | assert_equal 0, result[:attached] | ||
| 54 | assert_equal 2, result[:already] | ||
| 55 | assert_equal 1, @node.draft.related_assets.where(:asset_id => @image.id).count | ||
| 56 | end | ||
| 57 | |||
| 58 | test "refuses when another user holds the lock and writes nothing" do | ||
| 59 | @node.lock_for_editing!(@other) | ||
| 60 | assert_raises(LockedByAnotherUser) { @node.attach_asset!(@image, :user => @user) } | ||
| 61 | assert_empty @node.draft.assets.reload | ||
| 62 | end | ||
| 63 | |||
| 64 | test "proceeds when the attaching user holds the lock" do | ||
| 65 | @node.lock_for_editing!(@user) | ||
| 66 | result = @node.attach_asset!(@image, :user => @user) | ||
| 67 | assert_equal 1, result[:attached] | ||
| 68 | end | ||
| 69 | |||
| 70 | test "sets the headline when none exists" do | ||
| 71 | result = @node.attach_asset!(@image, :user => @user, :headline => true) | ||
| 72 | assert_equal :set, result[:headline] | ||
| 73 | assert_equal @image, @node.draft.headline_asset | ||
| 74 | end | ||
| 75 | |||
| 76 | test "keeps an existing headline and reports it" do | ||
| 77 | incumbent = create_image_asset | ||
| 78 | @node.draft.related_assets.create!(:asset => incumbent, :headline => true) | ||
| 79 | result = @node.attach_asset!(@image, :user => @user, :headline => true) | ||
| 80 | assert_equal :kept_existing, result[:headline] | ||
| 81 | assert_equal incumbent, @node.draft.reload.headline_asset | ||
| 82 | assert_includes @node.draft.assets, @image | ||
| 83 | end | ||
| 84 | |||
| 85 | test "declines the headline flag for ineligible asset types" do | ||
| 86 | plain = create_plain_asset | ||
| 87 | result = @node.attach_asset!(plain, :user => @user, :headline => true) | ||
| 88 | assert_equal :not_eligible, result[:headline] | ||
| 89 | assert_includes @node.draft.assets.reload, plain | ||
| 90 | assert_nil @node.draft.headline_asset | ||
| 91 | end | ||
| 92 | |||
| 93 | test "refuses nodes in the Trash" do | ||
| 94 | @node.trash!(@user) | ||
| 95 | assert_raises(ActiveRecord::RecordInvalid) { @node.attach_asset!(@image, :user => @user) } | ||
| 96 | end | ||
| 97 | |||
| 98 | private | ||
| 99 | |||
| 100 | def create_image_asset | ||
| 101 | Asset.create!(:name => "attach test image", :upload_content_type => "image/png") | ||
| 102 | end | ||
| 103 | |||
| 104 | def create_plain_asset | ||
| 105 | Asset.create!(:name => "attach test note", :upload_content_type => "text/plain") | ||
| 106 | end | ||
| 107 | end | ||
diff --git a/test/models/node_test.rb b/test/models/node_test.rb index d7e4dd0..ba38340 100644 --- a/test/models/node_test.rb +++ b/test/models/node_test.rb | |||
| @@ -546,30 +546,6 @@ class NodeTest < ActiveSupport::TestCase | |||
| 546 | assert result.index(mine) < result.index(someone_elses_newer) | 546 | assert result.index(mine) < result.index(someone_elses_newer) |
| 547 | end | 547 | end |
| 548 | 548 | ||
| 549 | test "recently_changed includes a node whose head was recently published" do | ||
| 550 | node = Node.root.children.create!(:slug => "recent_changed_published") | ||
| 551 | find_or_create_draft(node, @user1) | ||
| 552 | node.autosave!({:title => "v1"}, @user1) | ||
| 553 | node.save_draft!(@user1) | ||
| 554 | node.publish_draft! | ||
| 555 | |||
| 556 | assert_includes Node.recently_changed, node | ||
| 557 | end | ||
| 558 | |||
| 559 | test "recently_changed excludes a node only touched by locking or unlocking after an old publish" do | ||
| 560 | node = Node.root.children.create!(:slug => "recent_changed_lock_only") | ||
| 561 | find_or_create_draft(node, @user1) | ||
| 562 | node.autosave!({:title => "v1"}, @user1) | ||
| 563 | node.save_draft!(@user1) | ||
| 564 | node.publish_draft! | ||
| 565 | node.head.update_column(:updated_at, 20.days.ago) | ||
| 566 | |||
| 567 | node.lock_for_editing!(@user1) | ||
| 568 | node.unlock! | ||
| 569 | |||
| 570 | assert_not_includes Node.recently_changed, node | ||
| 571 | end | ||
| 572 | |||
| 573 | test "autosave! carries over the current related assets to the newly created autosave row" do | 549 | test "autosave! carries over the current related assets to the newly created autosave row" do |
| 574 | node = Node.root.children.create!(:slug => "autosave_asset_carryover_test") | 550 | node = Node.root.children.create!(:slug => "autosave_asset_carryover_test") |
| 575 | user = User.find_by_login("quentin") | 551 | user = User.find_by_login("quentin") |
