debian-mirror-gitlab/spec/support/helpers/dropzone_helper.rb

79 lines
2.7 KiB
Ruby
Raw Normal View History

2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
module DropzoneHelper
# Provides a way to perform `attach_file` for a Dropzone-based file input
#
# This is accomplished by creating a standard HTML file input on the page,
# performing `attach_file` on that field, and then triggering the appropriate
# Dropzone events to perform the actual upload.
#
# This method waits for the upload to complete before returning.
2017-09-10 17:25:29 +05:30
# max_file_size is an optional parameter.
# If it's not 0, then it used in dropzone.maxFilesize parameter.
# wait_for_queuecomplete is an optional parameter.
# If it's 'false', then the helper will NOT wait for backend response
# It lets to test behaviors while AJAX is processing.
def dropzone_file(files, max_file_size = 0, wait_for_queuecomplete = true)
2017-08-17 22:00:37 +05:30
# Generate a fake file input that Capybara can attach to
page.execute_script <<-JS.strip_heredoc
2017-09-10 17:25:29 +05:30
$('#fakeFileInput').remove();
2017-08-17 22:00:37 +05:30
var fakeFileInput = window.$('<input/>').attr(
2017-09-10 17:25:29 +05:30
{id: 'fakeFileInput', type: 'file', multiple: true}
2017-08-17 22:00:37 +05:30
).appendTo('body');
window._dropzoneComplete = false;
JS
2017-09-10 17:25:29 +05:30
# Attach files to the fake input selector with Capybara
attach_file('fakeFileInput', files)
2017-08-17 22:00:37 +05:30
# Manually trigger a Dropzone "drop" event with the fake input's file list
page.execute_script <<-JS.strip_heredoc
var dropzone = $('.div-dropzone')[0].dropzone;
2017-09-10 17:25:29 +05:30
dropzone.options.autoProcessQueue = false;
if (#{max_file_size} > 0) {
dropzone.options.maxFilesize = #{max_file_size};
}
2017-08-17 22:00:37 +05:30
dropzone.on('queuecomplete', function() {
window._dropzoneComplete = true;
});
2017-09-10 17:25:29 +05:30
var fileList = [$('#fakeFileInput')[0].files];
$.map(fileList, function(file){
var e = jQuery.Event('drop', { dataTransfer : { files : file } });
dropzone.listeners[0].events.drop(e);
});
dropzone.processQueue();
2017-08-17 22:00:37 +05:30
JS
2017-09-10 17:25:29 +05:30
if wait_for_queuecomplete
# Wait until Dropzone's fired `queuecomplete`
loop until page.evaluate_script('window._dropzoneComplete === true')
end
end
def drop_in_dropzone(file_path)
# Generate a fake input selector
page.execute_script <<-JS
var fakeFileInput = window.$('<input/>').attr(
{id: 'fakeFileInput', type: 'file'}
).appendTo('body');
JS
# Attach the file to the fake input selector with Capybara
attach_file('fakeFileInput', file_path)
# Add the file to a fileList array and trigger the fake drop event
page.execute_script <<-JS
var fileList = [$('#fakeFileInput')[0].files[0]];
var e = jQuery.Event('drop', { dataTransfer : { files : fileList } });
$('.dropzone')[0].dropzone.listeners[0].events.drop(e);
JS
2017-08-17 22:00:37 +05:30
end
end