Browse Source

Maintenance: Port agent_ticket_email_reply_keep_body_test browser minitest to RSpec.

Dusan Vuckovic 2 years ago
parent
commit
6f37b874a6

+ 0 - 8
script/build/test_slice_tests.sh

@@ -22,7 +22,6 @@ if [ "$LEVEL" == '1' ]; then
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb
@@ -66,7 +65,6 @@ elif [ "$LEVEL" == '2' ]; then
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb
@@ -109,7 +107,6 @@ elif [ "$LEVEL" == '3' ]; then
   #rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   # rm test/browser/agent_ticket_create_default_type_test.rb
   # test/browser/agent_ticket_create_reset_customer_selection_test.rb
-  # test/browser/agent_ticket_email_reply_keep_body_test.rb
   # rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb
@@ -152,7 +149,6 @@ elif [ "$LEVEL" == '4' ]; then
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb
@@ -194,7 +190,6 @@ elif [ "$LEVEL" == '5' ]; then
   rm test/browser/agent_ticket_create_cc_tokenizer_test.rb
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb
@@ -238,7 +233,6 @@ elif [ "$LEVEL" == '6' ]; then
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   # rm test/browser/agent_ticket_create_template_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb
@@ -282,7 +276,6 @@ elif [ "$LEVEL" == '7' ]; then
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   # rm test/browser/agent_ticket_create_template_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   # test/browser/agent_ticket_link_test.rb
   # test/browser/agent_ticket_macro_test.rb
@@ -326,7 +319,6 @@ elif [ "$LEVEL" == '8' ]; then
   rm test/browser/agent_ticket_create_default_type_test.rb
   rm test/browser/agent_ticket_create_reset_customer_selection_test.rb
   # rm test/browser/agent_ticket_create_template_test.rb
-  rm test/browser/agent_ticket_email_reply_keep_body_test.rb
   rm test/browser/agent_ticket_email_signature_test.rb
   rm test/browser/agent_ticket_link_test.rb
   rm test/browser/agent_ticket_macro_test.rb

+ 151 - 0
spec/system/ticket/zoom/email_reply_body_spec.rb

@@ -0,0 +1,151 @@
+# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
+
+require 'rails_helper'
+
+RSpec.describe 'Ticket Zoom > Email Reply Body', type: :system, time_zone: 'Europe/London' do
+  let(:customer) { create(:customer) }
+  let(:ticket)   { create(:ticket, customer: customer, group: Group.first) }
+
+  # Create a ticket article with a specific timestamp and customer origin.
+  #   This will allow us to later compare citation header with expected format.
+  before do
+    timestamp = DateTime.parse('2022-10-06 12:40:00 UTC')
+    create(:ticket_article, :inbound_email, ticket: ticket, origin_by: customer, created_at: timestamp)
+  end
+
+  context 'when replying to a message' do
+    prepend_before do
+      Setting.set 'ui_ticket_zoom_article_email_full_quote', full_quote_setting_enabled
+      Setting.set 'ui_ticket_zoom_article_email_full_quote_header', full_quote_header_setting_enabled
+    end
+
+    before do
+      visit ticket_zoom_path
+    end
+
+    context 'without full quote' do
+      let(:full_quote_setting_enabled)        { false }
+      let(:full_quote_header_setting_enabled) { false }
+
+      it 'body keeps existing content' do
+        fill_in_body 'keep me'
+        click_reply
+        find_reset
+        expect(body).to have_text 'keep me'
+
+        # repeat
+        fill_in_body 'and me! '
+        click_reply
+        find_reset
+        expect(body).to have_text('keep me').and have_text('and me!')
+      end
+    end
+
+    context 'with full quote' do
+      let(:full_quote_setting_enabled) { true }
+
+      context 'with header' do
+        let(:full_quote_header_setting_enabled) { true }
+
+        it 'body contains citation header' do
+          click_reply
+          expect(body).to contain_citation_header("On Thursday, October 6, 2022 at 1:40:00 PM, #{customer.fullname} wrote:")
+        end
+      end
+
+      context 'without header' do
+        let(:full_quote_header_setting_enabled) { false }
+
+        it 'body does not contain citation header' do
+          click_reply
+          expect(body).not_to contain_citation_header("On Thursday, October 6, 2022 at 1:40:00 PM, #{customer.fullname} wrote:")
+        end
+      end
+
+      # Regression test for issue #2344 - Missing translation for Full-Quote-Text "on xy wrote"
+      context 'with header in German locale', authenticated_as: :agent do
+        let(:agent)                             { create(:agent, preferences: { locale: 'de-de' }, groups: [Group.first]) }
+        let(:full_quote_header_setting_enabled) { true }
+
+        it 'body contains localized citation header' do
+          click_reply
+          expect(body).to contain_citation_header("Am Donnerstag, 6. Oktober 2022 um 13:40:00, schrieb #{customer.fullname}:")
+        end
+      end
+    end
+  end
+
+  def ticket_zoom_path
+    "#ticket/zoom/#{ticket.id}"
+  end
+
+  def body
+    find(:richtext)
+  end
+
+  def fill_in_body(text)
+    body.send_keys text
+  end
+
+  def find_reset
+    find('.js-reset')
+  end
+
+  def click_reply
+    click '.js-ArticleAction[data-type=emailReply]'
+  end
+
+  define :contain_citation_header do
+    match do
+      contain_citation_header
+    end
+
+    match_when_negated do
+      contain_no_citation_header
+    end
+
+    failure_message do
+      return <<~MESSAGE
+        expected that citation:
+
+        #{citation_block}
+
+        would contain header:
+
+        #{expected_block}
+      MESSAGE
+    end
+
+    failure_message_when_negated do
+      return <<~MESSAGE
+        expected that citation:
+
+        #{citation_block}
+
+        would NOT contain header:
+
+        #{expected_block}
+      MESSAGE
+    end
+
+    def contain_citation_header
+      citation.has_text?(expected)
+    end
+
+    def contain_no_citation_header
+      citation.has_no_text?(expected)
+    end
+
+    def citation
+      actual.first('blockquote[type=cite]')
+    end
+
+    def citation_block
+      citation.text.gsub(%r{^}, '> ')
+    end
+
+    def expected_block
+      "> #{expected}"
+    end
+  end
+end

+ 0 - 238
test/browser/agent_ticket_email_reply_keep_body_test.rb

@@ -1,238 +0,0 @@
-# Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
-
-require 'browser_test_helper'
-
-class AgentTicketEmailReplyKeepBodyTest < TestCase
-  def test_reply_message_keep_body
-
-    # merge ticket with closed tab
-    @browser = browser_instance
-    login(
-      username: 'agent1@example.com',
-      password: 'test',
-      url:      browser_url,
-    )
-    tasks_close_all
-
-    # create new ticket
-    ticket_create(
-      data: {
-        customer: 'nico',
-        group:    'Users',
-        title:    'some subject 123äöü - reply test',
-        body:     'some body 123äöü - reply test',
-      },
-    )
-    sleep 1
-
-    # fill body
-    ticket_update(
-      data:          {
-        body: 'keep me',
-      },
-      do_not_submit: true,
-    )
-
-    # scroll to reply - needed for chrome
-    scroll_to(
-      position: 'botton',
-      css:      '.content.active [data-type="emailReply"]',
-    )
-
-    # click reply
-    click(css: '.content.active [data-type="emailReply"]')
-
-    # check body
-    watch_for(
-      css:      '.content.active .js-reset',
-      value:    '(Discard your unsaved changes.|Verwerfen der)',
-      no_quote: true,
-    )
-
-    # check body
-    ticket_verify(
-      data: {
-        body: 'keep me',
-      },
-    )
-
-    # scroll to reply - needed for chrome
-    sleep 5
-    scroll_to(
-      position: 'botton',
-      css:      '.content.active [data-type="emailReply"]',
-    )
-    # click reply
-    click(css: '.content.active [data-type="emailReply"]')
-
-    # check body
-    watch_for(
-      css:      '.content.active .js-reset',
-      value:    '(Discard your unsaved changes.|Verwerfen der)',
-      no_quote: true,
-    )
-
-    # check body
-    ticket_verify(
-      data: {
-        body: 'keep me',
-      },
-    )
-
-  end
-
-  def change_quote_config(params = {})
-    scroll_to(
-      position: 'botton',
-      css:      '.content.active .js-settingContainer .js-setting',
-    )
-    click(css: '.content.active .js-settingContainer .js-setting')
-    modal_ready
-    select(
-      css:   params[:css],
-      value: params[:value]
-    )
-    click(
-      css: params[:submit_css],
-    )
-    modal_close
-    modal_disappear
-  end
-
-  def test_full_quote
-    @browser = browser_instance
-    login(
-      username: 'admin@example.com',
-      password: 'test',
-      url:      browser_url,
-    )
-    tasks_close_all
-
-    ticket_open_by_title(
-      title: 'Welcome to Zammad',
-    )
-    watch_for(
-      css: '.content.active .js-settingContainer .js-setting .dropdown-icon',
-    )
-
-    # enable email full quote in the ticket zoom config page
-    change_quote_config(
-      css:        '.modal #ui_ticket_zoom_article_email_full_quote select[name="ui_ticket_zoom_article_email_full_quote"]',
-      value:      'yes',
-      submit_css: '.modal #ui_ticket_zoom_article_email_full_quote .btn[type="submit"]',
-    )
-    change_quote_config(
-      css:        '.modal #ui_ticket_zoom_article_email_full_quote_header select[name="ui_ticket_zoom_article_email_full_quote_header"]',
-      value:      'yes',
-      submit_css: '.modal #ui_ticket_zoom_article_email_full_quote_header .btn[type="submit"]',
-    )
-
-    scroll_to(
-      position: 'botton',
-      css:      '.content.active .ticket-article [data-type="emailReply"]',
-    )
-    click(css: '.content.active .ticket-article [data-type="emailReply"]')
-
-    full_text = @browser.find_element(css: '.content.active .article-new .articleNewEdit-body').text
-
-    match = full_text.match(%r{\nOn (.*?) Nicole Braun wrote:})
-    assert match
-    assert match[1]
-    assert Time.zone.parse(match[1])
-
-    # try again, but with the full quote header disabled
-    tasks_close_all
-    ticket_open_by_title(
-      title: 'Welcome to Zammad',
-    )
-    change_quote_config(
-      css:        '.modal #ui_ticket_zoom_article_email_full_quote_header select[name="ui_ticket_zoom_article_email_full_quote_header"]',
-      value:      'no',
-      submit_css: '.modal #ui_ticket_zoom_article_email_full_quote_header .btn[type="submit"]',
-    )
-
-    scroll_to(
-      position: 'botton',
-      css:      '.content.active .ticket-article [data-type="emailReply"]',
-    )
-    click(css: '.content.active .ticket-article [data-type="emailReply"]')
-
-    full_text = @browser.find_element(css: '.content.active .article-new .articleNewEdit-body').text
-
-    match = full_text.match(%r{\nOn (.*?) Nicole Braun wrote:})
-    assert_nil match
-
-    # after test, turn full quote header back on again
-    tasks_close_all
-    ticket_open_by_title(
-      title: 'Welcome to Zammad',
-    )
-    change_quote_config(
-      css:        '.modal #ui_ticket_zoom_article_email_full_quote_header select[name="ui_ticket_zoom_article_email_full_quote_header"]',
-      value:      'yes',
-      submit_css: '.modal #ui_ticket_zoom_article_email_full_quote_header .btn[type="submit"]',
-    )
-  end
-
-  # Regression test for issue #2344 - Missing translation for Full-Quote-Text "on xy wrote"
-  def test_full_quote_german_locale
-    @browser = browser_instance
-    login(
-      username: 'admin@example.com',
-      password: 'test',
-      url:      browser_url,
-    )
-    tasks_close_all
-
-    ticket_open_by_title(
-      title: 'Welcome to Zammad',
-    )
-    watch_for(
-      css: '.content.active .js-settingContainer .js-setting .dropdown-icon',
-    )
-
-    # enable email full quote in the ticket zoom config page
-    change_quote_config(
-      css:        '.modal #ui_ticket_zoom_article_email_full_quote select[name="ui_ticket_zoom_article_email_full_quote"]',
-      value:      'yes',
-      submit_css: '.modal #ui_ticket_zoom_article_email_full_quote .btn[type="submit"]',
-    )
-
-    # Suppress the modal dialog that invites to contributions for translations that are < 90% as this breaks the tests for de-de.
-    @browser.execute_script "App.LocalStorage.set('translation_support_no', true, App.Session.get('id'))"
-
-    # switch user profile language to German
-    switch_language(
-      data: {
-        language: 'Deutsch'
-      },
-    )
-
-    ticket_open_by_title(
-      title: 'Welcome to Zammad',
-    )
-
-    scroll_to(
-      position: 'botton',
-      css:      '.content.active .ticket-article [data-type="emailReply"]',
-    )
-    click(css: '.content.active .ticket-article [data-type="emailReply"]')
-
-    full_text = @browser.find_element(css: '.content.active .article-new .articleNewEdit-body').text
-
-    match = full_text.match(%r{\nAm (.*?), schrieb Nicole Braun:})
-    assert match
-
-    datestamp = match[1]
-    assert datestamp
-    day_of_week = datestamp.split(',').first
-    assert %w[Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag].include? day_of_week
-
-    # switch user profile language to English again for other tests
-    switch_language(
-      data: {
-        language: 'English (United States)'
-      },
-    )
-  end
-end