Browse Source

- Refactoring: Ticket create capybara system test is not idiomatic.
- DX: Extract Ticket create view template selection into dedicated common action capybara helper.

Thorsten Eckel 4 years ago
parent
commit
7ebd7a731d

+ 22 - 0
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

+ 20 - 0
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

+ 7 - 22
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
-    # 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',
-      }
+    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) }
 
-      template = create :template, options: {
-        'title'    => 'Template Title',
-        'group_id' => unpermitted_group.id,
-        'owner_id' => '2',
-      }
-
-      login(
-        username: user.email,
-        password: 'test',
-      )
+    # Regression test for issue #2424 - Unavailable ticket template attributes get applied
+    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