require 'test_helper' class RelatedAssetsControllerTest < ActionController::TestCase test "search finds assets by name, excluding ones already attached" do login_as :quentin node = Node.root.children.create!(:slug => "related_assets_search_test") attached = Asset.create!(:name => "biometrics-scan", :upload_content_type => "image/png") node.draft.assets << attached Asset.create!(:name => "biometrics-poster", :upload_content_type => "image/png") Asset.create!(:name => "chaostreff-flyer", :upload_content_type => "image/png") get :search, params: { :node_id => node.id, :q => "biometrics" } json = JSON.parse(response.body) names = json.map { |a| a["name"] } assert_includes names, "biometrics-poster" assert_not_includes names, "biometrics-scan" assert_not_includes names, "chaostreff-flyer" end test "search returns an empty list for a blank term" do login_as :quentin node = Node.root.children.create!(:slug => "related_assets_blank_search_test") get :search, params: { :node_id => node.id, :q => "" } assert_equal [], JSON.parse(response.body) end test "create attaches an asset to the node's editable page" do login_as :quentin node = Node.root.children.create!(:slug => "related_assets_create_test") asset = Asset.create!(:name => "erfa-photo", :upload_content_type => "image/png") post :create, params: { :node_id => node.id, :asset_id => asset.id } assert_response :success assert_includes node.draft.reload.related_assets.map(&:asset_id), asset.id end test "create does not duplicate an already-attached asset" do login_as :quentin node = Node.root.children.create!(:slug => "related_assets_dup_test") asset = Asset.create!(:name => "erfa-photo-2", :upload_content_type => "image/png") node.draft.assets << asset post :create, params: { :node_id => node.id, :asset_id => asset.id } assert_response :success assert_equal 1, node.draft.reload.related_assets.count end test "destroy removes the attached asset" do login_as :quentin node = Node.root.children.create!(:slug => "related_assets_destroy_test") asset = Asset.create!(:name => "old-photo", :upload_content_type => "image/png") node.draft.assets << asset related = node.draft.related_assets.first delete :destroy, params: { :node_id => node.id, :id => related.id } assert_response :success assert_equal 0, node.draft.reload.related_assets.count end test "update reorders the attached assets" do login_as :quentin node = Node.root.children.create!(:slug => "related_assets_reorder_test") first = Asset.create!(:name => "first-photo", :upload_content_type => "image/png") second = Asset.create!(:name => "second-photo", :upload_content_type => "image/png") node.draft.assets << first node.draft.assets << second second_related = node.draft.related_assets.find_by(:asset_id => second.id) patch :update, params: { :node_id => node.id, :id => second_related.id, :position => 1 } assert_response :success ordered_asset_ids = node.draft.reload.related_assets.map(&:asset_id) assert_equal [second.id, first.id], ordered_asset_ids end end