diff --git a/spec/lib/notification_factory/slack_spec.rb b/spec/lib/notification_factory/slack_spec.rb new file mode 100644 index 000000000..c59d25d20 --- /dev/null +++ b/spec/lib/notification_factory/slack_spec.rb @@ -0,0 +1,95 @@ +require 'rails_helper' + +RSpec.describe NotificationFactory::Slack do + describe '.template' do + subject(:template) do + NotificationFactory::Slack.template( + template: action, + locale: 'en-us', + timezone: 'Europe/Berlin', + objects: { + ticket: ticket, + article: article, + recipient: agent, + current_user: current_user, + changes: changes, + } + ) + end + + let(:ticket) { article.ticket } + let(:article) { create(:ticket_article) } + let(:agent) { create(:agent_user) } + let(:current_user) { create(:agent_user) } + + context 'for "ticket_create", with an empty "changes" hash' do + let(:action) { 'ticket_create' } + + let(:changes) { {} } + + it 'returns a hash with subject: (as Markdown heading)' do + expect(template).to include(subject: "# #{ticket.title}") + end + + it 'returns a hash with body:
' do + expect(template[:body]) + .to match(/Created by #{current_user.fullname}/) + .and match(/#{article.body}\z/) + end + end + + context 'for "ticket_update", with a populated "changes" hash' do + let(:action) { 'ticket_update' } + + let(:changes) do + { + state: %w[aaa bbb], + group: %w[xxx yyy], + pending_time: [Time.zone.parse('2019-04-01T10:00:00Z0'), Time.zone.parse('2019-04-01T23:00:00Z0')], + } + end + + it 'returns a hash with subject: (as Markdown heading)' do + expect(template).to include(subject: "# #{ticket.title}") + end + + it 'returns a hash with body:
' do + expect(template[:body]) + .to match(/Updated by #{current_user.fullname}/) + .and match(/state: aaa -> bbb/) + .and match(/group: xxx -> yyy/) + .and match(%r{pending_time: 04/01/2019 12:00 \(Europe/Berlin\) -> 04/02/2019 01:00 \(Europe/Berlin\)}) + .and match(/#{article.body}\z/) + end + end + + context 'for "ticket_escalate"' do + before { ticket.escalation_at = escalation_time } + let(:escalation_time) { Time.zone.parse('2019-04-01T10:00:00Z') } + + subject(:template) do + NotificationFactory::Slack.template( + template: 'ticket_escalation', + locale: 'en-us', + timezone: 'Europe/Berlin', + objects: { + ticket: ticket, + article: article, + recipient: agent, + } + ) + end + + it 'returns a hash with subject: (as Markdown heading)' do + expect(template).to include(subject: "# #{ticket.title}") + end + + it 'returns a hash with body: ' do + expect(template[:body]) + .to match(/A ticket \(#{ticket.title}\) from "#{ticket.customer.fullname}"/) + .and match(%r{is escalated since "04/01/2019 12:00 \(Europe/Berlin\)"!}) + .and match(/#{article.body}\z/) + end + end + end +end diff --git a/test/unit/notification_factory_slack_template_test.rb b/test/unit/notification_factory_slack_template_test.rb deleted file mode 100644 index 411b7e806..000000000 --- a/test/unit/notification_factory_slack_template_test.rb +++ /dev/null @@ -1,144 +0,0 @@ -require 'test_helper' - -class NotificationFactorySlackTemplateTest < ActiveSupport::TestCase - - test 'notifications template' do - - Translation.load('de-de') - - groups = Group.where(name: 'Users') - roles = Role.where(name: 'Agent') - agent1 = User.create_or_update( - login: 'notification-template-agent1@example.com', - firstname: 'Notificationxxx', - lastname: 'Agent1yyy', - email: 'notification-template-agent1@example.com', - password: 'agentpw', - active: true, - roles: roles, - groups: groups, - preferences: { - locale: 'de-de', - }, - updated_by_id: 1, - created_by_id: 1, - ) - - agent_current_user = User.create_or_update( - login: 'notification-template-current_user@example.com', - firstname: 'Notification Current', - lastname: 'Userxxx', - email: 'notification-template-current_user@example.com', - password: 'agentpw', - active: true, - roles: roles, - groups: groups, - preferences: { - locale: 'de-de', - }, - updated_by_id: 1, - created_by_id: 1, - ) - - ticket = Ticket.create( - group_id: Group.lookup(name: 'Users').id, - customer_id: User.lookup(email: 'nicole.braun@zammad.org').id, - owner_id: User.lookup(login: '-').id, - title: 'Welcome to Zammad!', - state_id: Ticket::State.lookup(name: 'new').id, - priority_id: Ticket::Priority.lookup(name: '2 normal').id, - updated_by_id: 1, - created_by_id: 1, - ) - article = Ticket::Article.create( - ticket_id: ticket.id, - type_id: Ticket::Article::Type.lookup(name: 'phone').id, - sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id, - from: 'Zammad Feedback ', - content_type: 'text/plain', - body: 'Welcome! -test123', - internal: false, - updated_by_id: 1, - created_by_id: 1, - ) - - changes = {} - result = NotificationFactory::Slack.template( - template: 'ticket_create', - locale: 'en-us', - timezone: 'Europe/Berlin', - objects: { - ticket: ticket, - article: article, - recipient: agent1, - current_user: agent_current_user, - changes: changes, - }, - ) - - assert_match('# Welcome to Zammad!', result[:subject]) - assert_match('Userxxx', result[:body]) - assert_match('Created by', result[:body]) - assert_match('test123', result[:body]) - assert_no_match('Dein', result[:body]) - assert_no_match('longname', result[:body]) - assert_match('Current User', result[:body]) - - article = Ticket::Article.create( - ticket_id: ticket.id, - type_id: Ticket::Article::Type.lookup(name: 'phone').id, - sender_id: Ticket::Article::Sender.lookup(name: 'Customer').id, - from: 'Zammad Feedback ', - content_type: 'text/html', - body: 'Welcome! -test123', - internal: false, - updated_by_id: 1, - created_by_id: 1, - ) - changes = { - state: %w[aaa bbb], - group: %w[xxx yyy], - pending_time: [Time.zone.parse('2019-04-01T10:00:00Z0'), Time.zone.parse('2019-04-01T23:00:00Z0')], - } - result = NotificationFactory::Slack.template( - template: 'ticket_update', - locale: 'en-us', - timezone: 'Europe/Berlin', - objects: { - ticket: ticket, - article: article, - recipient: agent1, - current_user: agent_current_user, - changes: changes, - }, - ) - - assert_match('# Welcome to Zammad!', result[:subject]) - assert_match('Userxxx', result[:body]) - assert_match('state: aaa -> bbb', result[:body]) - assert_match('group: xxx -> yyy', result[:body]) - assert_match('pending_time: 04/01/2019 12:00 (Europe/Berlin) -> 04/02/2019 01:00 (Europe/Berlin)', result[:body]) - assert_no_match('Dein', result[:body]) - assert_no_match('longname', result[:body]) - assert_match('Current User', result[:body]) - - # en notification - ticket.escalation_at = Time.zone.parse('2019-04-01T10:00:00Z') - result = NotificationFactory::Slack.template( - template: 'ticket_escalation', - locale: 'en-us', - timezone: 'Europe/Berlin', - objects: { - ticket: ticket, - article: article, - recipient: agent1, - } - ) - - assert_match('# Welcome to Zammad!', result[:subject]) - assert_match('is escalated since "04/01/2019 12:00 (Europe/Berlin)"!', result[:body]) - end - -end