Add feature specs for three types of user uploads
This commit is contained in:
parent
a8c62dfe5c
commit
2858bc2037
5 changed files with 112 additions and 29 deletions
|
@ -1,6 +1,7 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe 'Issues', feature: true do
|
describe 'Issues', feature: true do
|
||||||
|
include DropzoneHelper
|
||||||
include IssueHelpers
|
include IssueHelpers
|
||||||
include SortingHelper
|
include SortingHelper
|
||||||
include WaitForAjax
|
include WaitForAjax
|
||||||
|
@ -570,19 +571,13 @@ describe 'Issues', feature: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'uploads file when dragging into textarea' do
|
it 'uploads file when dragging into textarea' do
|
||||||
drop_in_dropzone test_image_file
|
dropzone_file Rails.root.join('spec', 'fixtures', 'banana_sample.gif')
|
||||||
|
|
||||||
# Wait for the file to upload
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
expect(page.find_field("issue_description").value).to have_content 'banana_sample'
|
expect(page.find_field("issue_description").value).to have_content 'banana_sample'
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'adds double newline to end of attachment markdown' do
|
it 'adds double newline to end of attachment markdown' do
|
||||||
drop_in_dropzone test_image_file
|
dropzone_file Rails.root.join('spec', 'fixtures', 'banana_sample.gif')
|
||||||
|
|
||||||
# Wait for the file to upload
|
|
||||||
sleep 1
|
|
||||||
|
|
||||||
expect(page.find_field("issue_description").value).to match /\n\n$/
|
expect(page.find_field("issue_description").value).to match /\n\n$/
|
||||||
end
|
end
|
||||||
|
@ -665,25 +660,4 @@ describe 'Issues', feature: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
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 } });
|
|
||||||
$('.div-dropzone')[0].dropzone.listeners[0].events.drop(e);
|
|
||||||
JS
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_image_file
|
|
||||||
File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
26
spec/features/uploads/user_uploads_avatar_to_group_spec.rb
Normal file
26
spec/features/uploads/user_uploads_avatar_to_group_spec.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
feature 'User uploads avatar to group', feature: true do
|
||||||
|
scenario 'they see the new avatar' do
|
||||||
|
user = create(:user)
|
||||||
|
group = create(:group)
|
||||||
|
group.add_owner(user)
|
||||||
|
login_as(user)
|
||||||
|
|
||||||
|
visit edit_group_path(group)
|
||||||
|
attach_file(
|
||||||
|
'group_avatar',
|
||||||
|
Rails.root.join('spec', 'fixtures', 'dk.png'),
|
||||||
|
visible: false
|
||||||
|
)
|
||||||
|
|
||||||
|
click_button 'Save group'
|
||||||
|
|
||||||
|
visit group_path(group)
|
||||||
|
|
||||||
|
expect(page).to have_selector(%Q(img[src$="/uploads/group/avatar/#{group.id}/dk.png"]))
|
||||||
|
|
||||||
|
# Cheating here to verify something that isn't user-facing, but is important
|
||||||
|
expect(group.reload.avatar.file).to exist
|
||||||
|
end
|
||||||
|
end
|
24
spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
Normal file
24
spec/features/uploads/user_uploads_avatar_to_profile_spec.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
feature 'User uploads avatar to profile', feature: true do
|
||||||
|
scenario 'they see their new avatar' do
|
||||||
|
user = create(:user)
|
||||||
|
login_as(user)
|
||||||
|
|
||||||
|
visit profile_path
|
||||||
|
attach_file(
|
||||||
|
'user_avatar',
|
||||||
|
Rails.root.join('spec', 'fixtures', 'dk.png'),
|
||||||
|
visible: false
|
||||||
|
)
|
||||||
|
|
||||||
|
click_button 'Update profile settings'
|
||||||
|
|
||||||
|
visit user_path(user)
|
||||||
|
|
||||||
|
expect(page).to have_selector(%Q(img[src$="/uploads/user/avatar/#{user.id}/dk.png"]))
|
||||||
|
|
||||||
|
# Cheating here to verify something that isn't user-facing, but is important
|
||||||
|
expect(user.reload.avatar.file).to exist
|
||||||
|
end
|
||||||
|
end
|
22
spec/features/uploads/user_uploads_file_to_note_spec.rb
Normal file
22
spec/features/uploads/user_uploads_file_to_note_spec.rb
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
feature 'User uploads file to note', feature: true do
|
||||||
|
include DropzoneHelper
|
||||||
|
|
||||||
|
let(:user) { create(:user) }
|
||||||
|
let(:project) { create(:empty_project, creator: user, namespace: user.namespace) }
|
||||||
|
|
||||||
|
scenario 'they see the attached file', js: true do
|
||||||
|
issue = create(:issue, project: project, author: user)
|
||||||
|
|
||||||
|
login_as(user)
|
||||||
|
visit namespace_project_issue_path(project.namespace, project, issue)
|
||||||
|
|
||||||
|
dropzone_file(Rails.root.join('spec', 'fixtures', 'dk.png'))
|
||||||
|
click_button 'Comment'
|
||||||
|
wait_for_ajax
|
||||||
|
|
||||||
|
expect(find('a.no-attachment-icon img[alt="dk"]')['src'])
|
||||||
|
.to match(%r{/#{project.full_path}/uploads/\h{32}/dk\.png$})
|
||||||
|
end
|
||||||
|
end
|
37
spec/support/dropzone_helper.rb
Normal file
37
spec/support/dropzone_helper.rb
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
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.
|
||||||
|
def dropzone_file(file_path)
|
||||||
|
# Generate a fake file input that Capybara can attach to
|
||||||
|
page.execute_script <<-JS.strip_heredoc
|
||||||
|
var fakeFileInput = window.$('<input/>').attr(
|
||||||
|
{id: 'fakeFileInput', type: 'file'}
|
||||||
|
).appendTo('body');
|
||||||
|
|
||||||
|
window._dropzoneComplete = false;
|
||||||
|
JS
|
||||||
|
|
||||||
|
# Attach the file to the fake input selector with Capybara
|
||||||
|
attach_file('fakeFileInput', file_path)
|
||||||
|
|
||||||
|
# Manually trigger a Dropzone "drop" event with the fake input's file list
|
||||||
|
page.execute_script <<-JS.strip_heredoc
|
||||||
|
var fileList = [$('#fakeFileInput')[0].files[0]];
|
||||||
|
var e = jQuery.Event('drop', { dataTransfer : { files : fileList } });
|
||||||
|
|
||||||
|
var dropzone = $('.div-dropzone')[0].dropzone;
|
||||||
|
dropzone.on('queuecomplete', function() {
|
||||||
|
window._dropzoneComplete = true;
|
||||||
|
});
|
||||||
|
dropzone.listeners[0].events.drop(e);
|
||||||
|
JS
|
||||||
|
|
||||||
|
# Wait until Dropzone's fired `queuecomplete`
|
||||||
|
loop until page.evaluate_script('window._dropzoneComplete === true')
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue