class ProjectsTest < ActionDispatch::IntegrationTest
setup do
- Capybara.current_driver = Capybara.javascript_driver
+ headless = Headless.new
+ headless.start
+ Capybara.current_driver = :selenium
+
+ # project tests need bigger page size to be able to see all the buttons
+ Capybara.current_session.driver.browser.manage.window.resize_to(1152, 768)
end
test 'Check collection count for A Project in the tab pane titles' do
project_uuid = api_fixture('groups')['aproject']['uuid']
visit page_with_token 'active', '/projects/' + project_uuid
+ wait_for_ajax
collection_count = page.all("[data-pk*='collection']").count
assert_selector '#Data_collections-tab span', text: "(#{collection_count})"
end
# visit project page
visit current_path
- assert(has_no_text?('.container-fluid', text: '*Textile description for A project*'),
- "Description is not rendered properly")
+ assert_no_text '*Textile description for A project*'
assert(find?('.container-fluid', text: 'Textile description for A project'),
"Description update did not survive page refresh")
assert(find?('.container-fluid', text: 'And a new paragraph in description'),
assert(has_link?("Write"),
"failed to change access level on new share")
click_on "Revoke"
+ page.driver.browser.switch_to.alert.accept
end
+ wait_for_ajax
using_wait_time(Capybara.default_wait_time * 3) do
assert(page.has_no_text?(name),
"new share row still exists after being revoked")
['Remove',api_fixture('collections')['collection_in_aproject_with_same_name_as_in_home_project'],
api_fixture('groups')['aproject'],nil,true],
].each do |action, my_collection, src, dest=nil, expect_name_change=nil|
- test "selection #{action} #{expect_name_change} for project" do
+ test "selection #{action} -> #{expect_name_change.inspect} for project" do
perform_selection_action src, dest, my_collection, action
case action
find(".dropdown-menu a", text: dest['name']).click
assert page.has_text?(my_collection['name']), 'Collection not found in dest project after copy'
- # now remove it from destination project to restore to original state
- perform_selection_action dest, nil, my_collection, 'Remove'
when 'Move'
assert page.has_no_text?(my_collection['name']), 'Collection still found in src project after move'
visit page_with_token 'active', '/'
find(".dropdown-menu a", text: dest['name']).click
assert page.has_text?(my_collection['name']), 'Collection not found in dest project after move'
- # move it back to src project to restore to original state
- perform_selection_action dest, src, my_collection, action
when 'Remove'
assert page.has_no_text?(my_collection['name']), 'Collection still found in src project after remove'
visit page_with_token 'active', '/'
find('input[type=checkbox]').click
end
- click_button 'Selection...'
+ click_button 'Selection'
within('.selection-action-container') do
assert page.has_text?("Compare selected"), "Compare selected link text not found"
find("#projects-menu").click
find(".dropdown-menu a", text: my_project['name']).click
- click_button 'Selection...'
+ click_button 'Selection'
within('.selection-action-container') do
page.assert_selector 'li.disabled', text: 'Create new collection with selected collections'
page.assert_selector 'li.disabled', text: 'Compare selected'
find('input[type=checkbox]').click
end
- click_button 'Selection...'
+ click_button 'Selection'
within('.selection-action-container') do
page.assert_no_selector 'li.disabled', text: 'Create new collection with selected collections'
page.assert_selector 'li', text: 'Create new collection with selected collections'
find('input[type=checkbox]').click
end
- click_button 'Selection...'
+ click_button 'Selection'
within('.selection-action-container') do
page.assert_selector 'li.disabled', text: 'Create new collection with selected collections'
page.assert_selector 'li.disabled', text: 'Compare selected'
find('input[type=checkbox]').click
end
- click_button 'Selection...'
+ click_button 'Selection'
within('.selection-action-container') do
page.assert_selector 'li.disabled', text: 'Create new collection with selected collections'
page.assert_selector 'li.disabled', text: 'Compare selected'
end
end
+ # "Remove selected" selection option should not be available when current user cannot write to the project
+ test "remove selected action is not available when current user cannot write to project" do
+ my_project = api_fixture('groups')['anonymously_accessible_project']
+ visit page_with_token 'active', "/projects/#{my_project['uuid']}"
+
+ click_button 'Selection'
+ within('.selection-action-container') do
+ assert_selector 'li', text: 'Create new collection with selected collections'
+ assert_selector 'li', text: 'Compare selected'
+ assert_selector 'li', text: 'Copy selected'
+ assert_selector 'li', text: 'Move selected'
+ assert_no_selector 'li', text: 'Remove selected'
+ end
+ end
+
[
['active', true],
['project_viewer', false],
find('input[type=checkbox]').click
end
- click_button 'Selection...'
+ click_button 'Selection'
within('.selection-action-container') do
click_link 'Create new collection with selected collections'
end
end
end
- [
- ['project with 10 collections', 10],
- ['project with 201 collections', 201], # two pages of data
- ].each do |project_name, amount|
- test "scroll collections tab for #{project_name} with #{amount} objects" do
- headless = Headless.new
- headless.start
- Capybara.current_driver = :selenium
+ def scroll_setup(project_name,
+ total_nbr_items,
+ item_list_parameter,
+ sorted = false,
+ sort_parameters = nil)
+ project_uuid = api_fixture('groups')[project_name]['uuid']
+ visit page_with_token 'user1_with_load', '/projects/' + project_uuid
- visit page_with_token 'user1_with_load'
+ assert(page.has_text?("#{item_list_parameter.humanize} (#{total_nbr_items})"), "Number of #{item_list_parameter.humanize} did not match the input amount")
- find("#projects-menu").click
- find(".dropdown-menu a", text: project_name).click
+ click_link item_list_parameter.humanize
+ wait_for_ajax
- my_collections = []
- for i in 1..amount
- my_collections << "Collection_#{i}"
- end
+ if sorted
+ find("th[data-sort-order='#{sort_parameters.gsub(/\s/,'')}']").click
+ wait_for_ajax
+ end
+ end
- # verify Data collections scroll
- assert(page.has_text?("Data collections (#{amount})"), "Number of collections did not match the input amount")
+ def scroll_items_check(nbr_items,
+ fixture_prefix,
+ item_list_parameter,
+ item_selector,
+ sorted = false)
+ items = []
+ for i in 1..nbr_items
+ items << "#{fixture_prefix}#{i}"
+ end
- click_link 'Data collections'
+ verify_items = items.dup
+ unexpected_items = []
+ item_count = 0
+ within(".arv-project-#{item_list_parameter}") do
+ page.execute_script "window.scrollBy(0,999000)"
begin
wait_for_ajax
rescue
end
- verify_collections = my_collections.dup
- unexpected_items = []
- collections_count = 0
- within('.arv-project-Data_collections') do
- page.execute_script "window.scrollBy(0,999000)"
- begin
- wait_for_ajax
- rescue
+ # Visit all rows. If not all expected items are found, retry
+ found_items = page.all(item_selector)
+ item_count = found_items.count
+
+ previous = nil
+ (0..item_count-1).each do |i|
+ # Found row text using the fixture string e.g. "Show Collection_#{n} "
+ item_name = found_items[i].text.split[1]
+ if !items.include? item_name
+ unexpected_items << item_name
+ else
+ verify_items.delete item_name
end
-
- # Visit all rows. If not all expected collections are found, retry
- found_collections = page.all('tr[data-kind="arvados#collection"]')
- collections_count = found_collections.count
-
- (0..collections_count-1).each do |i|
- # Found row text would be of the format "Show Collection_#{n} "
- collection_name = found_collections[i].text.split[1]
- if !my_collections.include? collection_name
- unexpected_items << collection_name
- else
- verify_collections.delete collection_name
- end
+ if sorted
+ # check sort order
+ assert_operator( previous.downcase, :<=, item_name.downcase) if previous
+ previous = item_name
end
-
- assert_equal true, unexpected_items.empty?, "Found unexpected items #{unexpected_items.inspect}"
- assert_equal amount, collections_count, "Found different number of collections"
- assert_equal true, verify_collections.empty?, "Did not find all the collections"
end
+
+ assert_equal true, unexpected_items.empty?, "Found unexpected #{item_list_parameter.humanize} #{unexpected_items.inspect}"
+ assert_equal nbr_items, item_count, "Found different number of #{item_list_parameter.humanize}"
+ assert_equal true, verify_items.empty?, "Did not find all the #{item_list_parameter.humanize}"
end
end
[
- ['project with 10 pipelines', 10, 0],
-# ['project with 200 jobs and 10 pipelines', 2, 200],
- ['project with 25 pipelines', 25, 0],
- ].each do |project_name, num_pipelines, num_jobs|
- test "scroll pipeline instances tab for #{project_name} with #{num_pipelines} pipelines and #{num_jobs} jobs" do
- headless = Headless.new
- headless.start
- Capybara.current_driver = :selenium
-
- visit page_with_token 'user1_with_load'
+ ['project_with_10_collections', 10],
+ ['project_with_201_collections', 201], # two pages of data
+ ].each do |project_name, nbr_items|
+ test "scroll collections tab for #{project_name} with #{nbr_items} objects" do
+ item_list_parameter = "Data_collections"
+ scroll_setup project_name,
+ nbr_items,
+ item_list_parameter
+ scroll_items_check nbr_items,
+ "Collection_",
+ item_list_parameter,
+ 'tr[data-kind="arvados#collection"]'
+ end
+ end
- find("#projects-menu").click
- find(".dropdown-menu a", text: project_name).click
+ [
+ ['project_with_10_collections', 10],
+ ['project_with_201_collections', 201], # two pages of data
+ ].each do |project_name, nbr_items|
+ test "scroll collections tab for #{project_name} with #{nbr_items} objects with ascending sort (case insensitive)" do
+ item_list_parameter = "Data_collections"
+ scroll_setup project_name,
+ nbr_items,
+ item_list_parameter,
+ true,
+ "collections.name"
+ scroll_items_check nbr_items,
+ "Collection_",
+ item_list_parameter,
+ 'tr[data-kind="arvados#collection"]',
+ true
+ end
+ end
- my_pipelines = []
- (0..num_pipelines-1).each do |i|
- name = "pipeline_#{i}"
- my_pipelines << name
- end
+ [
+ ['project_with_10_pipelines', 10, 0],
+ ['project_with_2_pipelines_and_60_jobs', 2, 60],
+ ['project_with_25_pipelines', 25, 0],
+ ].each do |project_name, num_pipelines, num_jobs|
+ test "scroll pipeline instances tab for #{project_name} with #{num_pipelines} pipelines and #{num_jobs} jobs" do
+ item_list_parameter = "Jobs_and_pipelines"
+ scroll_setup project_name,
+ num_pipelines + num_jobs,
+ item_list_parameter
+ # check the general scrolling and the pipelines
+ scroll_items_check num_pipelines,
+ "pipeline_",
+ item_list_parameter,
+ 'tr[data-kind="arvados#pipelineInstance"]'
+ # Check job count separately
+ jobs_found = page.all('tr[data-kind="arvados#job"]')
+ found_job_count = jobs_found.count
+ assert_equal num_jobs, found_job_count, 'Did not find expected number of jobs'
+ end
+ end
- # verify Jobs and pipelines tab scroll
- assert(page.has_text?("Jobs and pipelines (#{num_pipelines+num_jobs})"), "Number of objects did not match the input counts")
- click_link 'Jobs and pipelines'
- begin
- wait_for_ajax
- rescue
+ # Move button accessibility
+ [
+ ['admin', true],
+ ['active', true], # project owner
+ ['project_viewer', false],
+ ].each do |user, can_move|
+ test "#{user} can move subproject under another user's Home #{can_move}" do
+ project = api_fixture('groups')['aproject']
+ collection = api_fixture('collections')['collection_to_move_around_in_aproject']
+
+ # verify the project move button
+ visit page_with_token user, "/projects/#{project['uuid']}"
+ if can_move
+ assert page.has_link? 'Move project...'
+ else
+ assert page.has_no_link? 'Move project...'
end
+ end
+ end
- verify_pipelines = my_pipelines.dup
- unexpected_items = []
- object_count = 0
- within('.arv-project-Jobs_and_pipelines') do
- page.execute_script "window.scrollBy(0,999000)"
- begin
- wait_for_ajax
- rescue
- end
-
- # Visit all rows. Repeat if not all expected my_pipelines are found (inifinite scrolling should kick in)
- pipelines_found = page.all('tr[data-kind="arvados#pipelineInstance"]')
- found_pipeline_count = pipelines_found.count
- (0..found_pipeline_count-1).each do |i|
- name = pipelines_found[i].text.split[1]
- if !my_pipelines.include? name
- unexpected_items << name
- else
- verify_pipelines.delete name
- end
-
- assert_equal true, unexpected_items.empty?, "Found unexpected items #{unexpected_items.inspect}"
- end
+ test "error while loading tab" do
+ original_arvados_v1_base = Rails.configuration.arvados_v1_base
- jobs_found = page.all('tr[data-kind="arvados#job"]')
- found_job_count = jobs_found.count
+ visit page_with_token 'active', '/projects/' + api_fixture('groups')['aproject']['uuid']
- assert_equal num_pipelines, found_pipeline_count, "Found different number of pipelines and jobs"
- assert_equal num_jobs, found_job_count, 'Did not find expected number of jobs'
- assert_equal true, verify_pipelines.empty?, "Did not find all the pipelines and jobs"
+ # Point to a bad api server url to generate error
+ Rails.configuration.arvados_v1_base = "https://[100::f]:1/"
+ click_link 'Other objects'
+ within '#Other_objects' do
+ # Error
+ assert_selector('a', text: 'Reload tab')
+
+ # Now point back to the orig api server and reload tab
+ Rails.configuration.arvados_v1_base = original_arvados_v1_base
+ click_link 'Reload tab'
+ assert_no_selector('a', text: 'Reload tab')
+ assert_selector('button', text: 'Selection')
+ within '.selection-action-container' do
+ assert_selector 'tr[data-kind="arvados#trait"]'
end
end
end