@ -58,143 +58,180 @@ describe 'work package export', type: :feature do
login_as ( current_user )
end
let ( :export_type ) { 'CSV' }
subject { DownloadedFile . download_content }
def export!
def export! ( wait_for_downloads = true )
DownloadedFile :: clear_downloads
work_packages_page . ensure_loaded
settings_menu . open_and_choose 'Export ...'
click_on 'CSV'
click_on export_type
perform_enqueued_jobs
# Wait for the file to download
:: DownloadedFile . wait_for_download
:: DownloadedFile . wait_for_download_content
end
begin
perform_enqueued_jobs
rescue
# nothing
end
#before do
# # render the CSV as plain text so we can run expectations against the output
# expect_any_instance_of(WorkPackagesController)
# .to receive(:send_data) do |receiver, serialized_work_packages, _opts|
# receiver.render plain: serialized_work_packages
# end
# end
if wait_for_downloads
# Wait for the file to download
:: DownloadedFile . wait_for_download
:: DownloadedFile . wait_for_download_content
end
end
after do
DownloadedFile :: clear_downloads
end
context 'with default filter' do
before do
work_packages_page . visit_index
filters . expect_filter_count 1
filters . open
end
context 'CSV export' do
context 'with default filter' do
before do
work_packages_page . visit_index
filters . expect_filter_count 1
filters . open
end
it 'shows all work packages with the default filters' , js : true , retry : 2 do
export!
it 'shows all work packages with the default filters' , js : true , retry : 2 do
export!
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
expect ( subject ) . to have_text ( wp_4 . description )
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
expect ( subject ) . to have_text ( wp_4 . description )
# results are ordered by ID (asc) and not grouped by type
expect ( subject . scan ( / Type (A|B) / ) . flatten ) . to eq %w( A A B A )
end
# results are ordered by ID (asc) and not grouped by type
expect ( subject . scan ( / Type (A|B) / ) . flatten ) . to eq %w( A A B A )
end
it 'shows all work packages grouped by ' , js : true , retry : 2 do
group_by . enable_via_menu 'Type'
it 'shows all work packages grouped by ' , js : true , retry : 2 do
group_by . enable_via_menu 'Type'
wp_table . expect_work_package_listed ( wp_1 )
wp_table . expect_work_package_listed ( wp_2 )
wp_table . expect_work_package_listed ( wp_3 )
wp_table . expect_work_package_listed ( wp_4 )
wp_table . expect_work_package_listed ( wp_1 )
wp_table . expect_work_package_listed ( wp_2 )
wp_table . expect_work_package_listed ( wp_3 )
wp_table . expect_work_package_listed ( wp_4 )
export!
export!
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
expect ( subject ) . to have_text ( wp_4 . description )
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
expect ( subject ) . to have_text ( wp_4 . description )
# grouped by type
expect ( subject . scan ( / Type (A|B) / ) . flatten ) . to eq %w( A A A B )
end
# grouped by type
expect ( subject . scan ( / Type (A|B) / ) . flatten ) . to eq %w( A A A B )
end
it 'shows only the work package with the right progress if filtered this way' ,
js : true , retry : 2 do
filters . add_filter_by 'Progress (%)' , 'is' , [ '25' ] , 'percentageDone'
it 'shows only the work package with the right progress if filtered this way' ,
js : true , retry : 2 do
filters . add_filter_by 'Progress (%)' , 'is' , [ '25' ] , 'percentageDone'
sleep 1
loading_indicator_saveguard
sleep 1
loading_indicator_saveguard
wp_table . expect_work_package_listed ( wp_1 )
wp_table . ensure_work_package_not_listed! ( wp_2 , wp_3 )
wp_table . expect_work_package_listed ( wp_1 )
wp_table . ensure_work_package_not_listed! ( wp_2 , wp_3 )
export!
export!
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . not_to have_text ( wp_2 . description )
expect ( subject ) . not_to have_text ( wp_3 . description )
end
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . not_to have_text ( wp_2 . description )
expect ( subject ) . not_to have_text ( wp_3 . description )
end
it 'shows only work packages of the filtered type' , js : true , retry : 2 do
filters . add_filter_by 'Type' , 'is' , wp_3 . type . name
it 'shows only work packages of the filtered type' , js : true , retry : 2 do
filters . add_filter_by 'Type' , 'is' , wp_3 . type . name
expect ( page ) . to have_no_content ( wp_2 . description ) # safeguard
expect ( page ) . to have_no_content ( wp_2 . description ) # safeguard
export!
export!
expect ( subject ) . not_to have_text ( wp_1 . description )
expect ( subject ) . not_to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
end
expect ( subject ) . not_to have_text ( wp_1 . description )
expect ( subject ) . not_to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
end
it 'exports selected columns' , js : true , retry : 2 do
columns . add 'Progress (%)'
it 'exports selected columns' , js : true , retry : 2 do
columns . add 'Progress (%)'
export!
export!
expect ( subject ) . to have_text ( 'Progress (%)' )
expect ( subject ) . to have_text ( '25' )
expect ( subject ) . to have_text ( 'Progress (%)' )
expect ( subject ) . to have_text ( '25' )
end
end
describe 'with a manually sorted query' , js : true do
let ( :query ) do
FactoryBot . create :query ,
user : current_user ,
project : project
end
before do
:: OrderedWorkPackage . create ( query : query , work_package : wp_4 , position : 0 )
:: OrderedWorkPackage . create ( query : query , work_package : wp_1 , position : 1 )
:: OrderedWorkPackage . create ( query : query , work_package : wp_2 , position : 2 )
:: OrderedWorkPackage . create ( query : query , work_package : wp_3 , position : 3 )
query . add_filter ( 'manual_sort' , 'ow' , [ ] )
query . sort_criteria = [ [ :manual_sorting , 'asc' ] ]
query . save!
end
it 'returns the correct number of work packages' do
wp_table . visit_query query
wp_table . expect_work_package_listed ( wp_1 , wp_2 , wp_3 , wp_4 )
wp_table . expect_work_package_order ( wp_4 , wp_1 , wp_2 , wp_3 )
export!
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
expect ( subject ) . to have_text ( wp_4 . description )
# results are ordered by ID (asc) and not grouped by type
expect ( subject . scan ( / WorkPackage No \ . \ d+, / ) ) . to eq [ wp_4 , wp_1 , wp_2 , wp_3 ] . map { | wp | wp . subject + ',' }
end
end
end
describe 'with a manually sorted query' , js : true do
context 'PDF export' , js : true do
let ( :export_type ) { 'PDF' }
let ( :query ) do
FactoryBot . create :query ,
user : current_user ,
project : project
end
before do
:: OrderedWorkPackage . create ( query : query , work_package : wp_4 , position : 0 )
:: OrderedWorkPackage . create ( query : query , work_package : wp_1 , position : 1 )
:: OrderedWorkPackage . create ( query : query , work_package : wp_2 , position : 2 )
:: OrderedWorkPackage . create ( query : query , work_package : wp_3 , position : 3 )
context 'with many columns' do
before do
query . column_names = query . available_columns . map { | c | c . name . to_s } - [ 'bcf_thumbnail' ]
query . save!
query . add_filter ( 'manual_sort' , 'ow' , [ ] )
query . sort_criteria = [ [ :manual_sorting , 'asc' ] ]
query . save!
end
# Despite attempts to provoke the error by having a lot of columns, the pdf
# is still being drawn successfully. We thus have to fake the error.
allow_any_instance_of ( WorkPackage :: PDFExport :: WorkPackageListToPdf )
. to receive ( :render! )
. and_return ( WorkPackage :: Exporter :: Result :: Error . new ( I18n . t ( :error_pdf_export_too_many_columns ) ) )
end
it 'returns the correct number of work packages' do
wp_table . visit_query query
wp_table . expect_work_package_listed ( wp_1 , wp_2 , wp_3 , wp_4 )
wp_table . expect_work_package_order ( wp_4 , wp_1 , wp_2 , wp_3 )
it 'returns the error' do
wp_table . visit_query query
export!
export! ( false )
expect ( subject ) . to have_text ( wp_1 . description )
expect ( subject ) . to have_text ( wp_2 . description )
expect ( subject ) . to have_text ( wp_3 . description )
expect ( subject ) . to have_text ( wp_4 . description )
expect ( page )
. not_to have_content I18n . t ( 'js.label_export_preparing' )
# results are ordered by ID (asc) and not grouped by type
expect ( subject . scan ( / WorkPackage No \ . \ d+, / ) ) . to eq [ wp_4 , wp_1 , wp_2 , wp_3 ] . map { | wp | wp . subject + ',' }
expect ( page )
. to have_content I18n . t ( :error_pdf_export_too_many_columns )
end
end
end
end