+ test "Filtering collection files by regexp" do
+ col = api_fixture('collections', 'multilevel_collection_1')
+ visit page_with_token('active', "/collections/#{col['uuid']}")
+
+ # Filter file list to some but not all files in the collection
+ page.find_field('file_regex').set('file[12]')
+ assert page.has_text?("file1")
+ assert page.has_text?("file2")
+ assert page.has_no_text?("file3")
+
+ # Filter file list with a regex matching all files
+ page.find_field('file_regex').set('.*')
+ assert page.has_text?("file1")
+ assert page.has_text?("file2")
+ assert page.has_text?("file3")
+
+ # Filter file list to a regex matching no files
+ page.find_field('file_regex').set('file9')
+ assert page.has_no_text?("file1")
+ assert page.has_no_text?("file2")
+ assert page.has_no_text?("file3")
+ # make sure that we actually are looking at the collections
+ # page and not e.g. a fiddlesticks
+ assert page.has_text?("multilevel_collection_1")
+ assert page.has_text?(col["name"] || col["uuid"])
+
+ # Set filename filter to a syntactically invalid regex
+ # Page loads, but stops filtering after the last valid regex parse
+ page.find_field('file_regex').set('file[2')
+ assert page.has_text?("multilevel_collection_1")
+ assert page.has_text?(col["name"] || col["uuid"])
+ assert page.has_text?("file1")
+ assert page.has_text?("file2")
+ assert page.has_text?("file3")
+
+ # Test the "Select all" button
+
+ # Note: calling .set('') on a Selenium element is not sufficient
+ # to reset the field for this test, as it does not send any key
+ # events to the browser. To clear the field, we must instead send
+ # a backspace character.
+ # See https://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Element.html#clear-instance_method
+ page.find_field('file_regex').set("\b") # backspace
+ find('button#select-all').click
+ assert_checkboxes_state('input[type=checkbox]', true, '"select all" should check all checkboxes')
+
+ # Test the "Unselect all" button
+ page.find_field('file_regex').set("\b") # backspace
+ find('button#unselect-all').click
+ assert_checkboxes_state('input[type=checkbox]', false, '"unselect all" should clear all checkboxes')
+
+ # Filter files, then "select all", then unfilter
+ page.find_field('file_regex').set("\b") # backspace
+ find('button#unselect-all').click
+ page.find_field('file_regex').set('file[12]')
+ find('button#select-all').click
+ page.find_field('file_regex').set("\b") # backspace
+
+ # all "file1" and "file2" checkboxes must be selected
+ # all "file3" checkboxes must be clear
+ assert_checkboxes_state('[value*="file1"]', true, 'checkboxes for file1 should be selected after filtering')
+ assert_checkboxes_state('[value*="file2"]', true, 'checkboxes for file2 should be selected after filtering')
+ assert_checkboxes_state('[value*="file3"]', false, 'checkboxes for file3 should be clear after filtering')
+
+ # Select all files, then filter, then "unselect all", then unfilter
+ page.find_field('file_regex').set("\b") # backspace
+ find('button#select-all').click
+ page.find_field('file_regex').set('file[12]')
+ find('button#unselect-all').click
+ page.find_field('file_regex').set("\b") # backspace
+
+ # all "file1" and "file2" checkboxes must be clear
+ # all "file3" checkboxes must be selected
+ assert_checkboxes_state('[value*="file1"]', false, 'checkboxes for file1 should be clear after filtering')
+ assert_checkboxes_state('[value*="file2"]', false, 'checkboxes for file2 should be clear after filtering')
+ assert_checkboxes_state('[value*="file3"]', true, 'checkboxes for file3 should be selected after filtering')
+ end
+
+ test "Creating collection from list of filtered files" do
+ col = api_fixture('collections', 'collection_with_files_in_subdir')
+ visit page_with_token('user1_with_load', "/collections/#{col['uuid']}")
+ assert page.has_text?('file_in_subdir1'), 'expected file_in_subdir1 not found'
+ assert page.has_text?('file1_in_subdir3'), 'expected file1_in_subdir3 not found'
+ assert page.has_text?('file2_in_subdir3'), 'expected file2_in_subdir3 not found'
+ assert page.has_text?('file1_in_subdir4'), 'expected file1_in_subdir4 not found'
+ assert page.has_text?('file2_in_subdir4'), 'expected file2_in_subdir4 not found'
+
+ # Select all files but then filter them to files in subdir1, subdir2 or subdir3
+ find('button#select-all').click
+ page.find_field('file_regex').set('_in_subdir[123]')
+ assert page.has_text?('file_in_subdir1'), 'expected file_in_subdir1 not in filtered files'
+ assert page.has_text?('file1_in_subdir3'), 'expected file1_in_subdir3 not in filtered files'
+ assert page.has_text?('file2_in_subdir3'), 'expected file2_in_subdir3 not in filtered files'
+ assert page.has_no_text?('file1_in_subdir4'), 'file1_in_subdir4 found in filtered files'
+ assert page.has_no_text?('file2_in_subdir4'), 'file2_in_subdir4 found in filtered files'
+
+ # Create a new collection
+ click_button 'Selection...'
+ within('.selection-action-container') do
+ click_link 'Create new collection with selected files'
+ end
+
+ # now in the newly created collection page
+ # must have files in subdir1 and subdir3 but not subdir4
+ assert page.has_text?('file_in_subdir1'), 'file_in_subdir1 missing from new collection'
+ assert page.has_text?('file1_in_subdir3'), 'file1_in_subdir3 missing from new collection'
+ assert page.has_text?('file2_in_subdir3'), 'file2_in_subdir3 missing from new collection'
+ assert page.has_no_text?('file1_in_subdir4'), 'file1_in_subdir4 found in new collection'
+ assert page.has_no_text?('file2_in_subdir4'), 'file2_in_subdir4 found in new collection'
+
+ # Make sure we're not still on the old collection page.
+ refute_match(%r{/collections/#{col['uuid']}}, page.current_url)
+ end