From 7ebd7a731d5612677a034c323fc06af3d0a51a35 Mon Sep 17 00:00:00 2001 From: Thorsten Eckel Date: Thu, 30 Apr 2020 17:38:57 +0200 Subject: [PATCH] - Refactoring: Ticket create capybara system test is not idiomatic. - DX: Extract Ticket create view template selection into dedicated common action capybara helper. --- spec/factories/template.rb | 22 +++++++++++++++++++ spec/support/capybara/common_actions.rb | 20 +++++++++++++++++ spec/system/ticket/create_spec.rb | 29 ++++++------------------- 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/spec/factories/template.rb b/spec/factories/template.rb index 59eec72f1..f0072428a 100644 --- a/spec/factories/template.rb +++ b/spec/factories/template.rb @@ -4,5 +4,27 @@ FactoryBot.define do options { {} } updated_by_id { 1 } created_by_id { 1 } + + transient do + title { 'Title dummy.' } + body { 'Content dummy.' } + sender_type { 'email-out' } + customer { create(:customer_user) } + group { Group.first } + owner { create(:agent_user) } + end + + trait :dummy_data do + options do + { + 'formSenderType' => sender_type, + 'title' => title, + 'body' => body, + 'customer_id' => customer.id, + 'group_id' => group.id, + 'owner_id' => owner.id, + } + end + end end end diff --git a/spec/support/capybara/common_actions.rb b/spec/support/capybara/common_actions.rb index 39265c883..1df10e7dd 100644 --- a/spec/support/capybara/common_actions.rb +++ b/spec/support/capybara/common_actions.rb @@ -183,6 +183,26 @@ module CommonActions click '.js-openDropdownMacro' end + def use_template(template) + wait(4).until do + field = find('#form-template select[name="id"]') + option = field.find(:option, template.name) + option.select_option + click '.sidebar-content .js-apply' + + # this is a workaround for a race condition where + # the template selection get's re-rendered after + # a selection was made. The selection is lost and + # the apply click has no effect. + template.options.any? do |attribute, value| + selector = %([name="#{attribute}"]) + next if !page.has_css?(selector, wait: 0) + + find(selector, wait: 0, visible: false).value == value + end + end + end + # Checks if modal is ready # # @param timeout [Integer] seconds to wait diff --git a/spec/system/ticket/create_spec.rb b/spec/system/ticket/create_spec.rb index 4a7baa24d..2acf01134 100644 --- a/spec/system/ticket/create_spec.rb +++ b/spec/system/ticket/create_spec.rb @@ -4,31 +4,16 @@ require 'system/examples/text_modules_examples' RSpec.describe 'Ticket Create', type: :system do context 'when applying ticket templates' do + let(:agent) { create(:agent_user, groups: [permitted_group]) } + let(:permitted_group) { create(:group) } + let(:unpermitted_group) { create(:group) } + let!(:template) { create(:template, :dummy_data, group: unpermitted_group, owner: agent) } + # Regression test for issue #2424 - Unavailable ticket template attributes get applied - it 'unavailable attributes do not get applied', authenticated: false do - user = create(:agent_user, password: 'test') - permitted_group = create(:group) - unpermitted_group = create(:group) - - user.group_names_access_map = { - permitted_group.name => 'full', - } - - template = create :template, options: { - 'title' => 'Template Title', - 'group_id' => unpermitted_group.id, - 'owner_id' => '2', - } - - login( - username: user.email, - password: 'test', - ) + it 'unavailable attributes do not get applied', authenticated: -> { agent } do visit 'ticket/create' - # apply the ticket template and confirm that the group_id dropdown does not appear - find('#form-template select[name="id"]').find(:option, template.name).select_option - click '.sidebar-content .js-apply' + use_template(template) expect(page).not_to have_selector 'select[name="group_id"]' end end