123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- require 'rails_helper'
- require 'lib/sequencer/sequence/import/kayako/examples/object_custom_field_values_examples'
- RSpec.describe Sequencer::Sequence::Import::Kayako::Case, db_strategy: :reset, sequencer: :sequence do
- context 'when importing cases from Kayako' do
- let(:group) { create(:group) }
- let(:owner) { create(:agent, group_ids: [group.id]) }
- let(:organization) { create(:organization) }
- let(:customer) { create(:customer, organization: organization) }
- let(:resource) do
- {
- 'id' => 9999,
- 'legacy_id' => nil,
- 'subject' => 'Getting comfortable with Kayako: a sample conversation',
- 'portal' => 'SETUP',
- 'source_channel' => {
- 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
- 'type' => 'MAIL',
- 'character_limit' => nil,
- 'resource_type' => 'channel'
- },
- 'requester' => {
- 'id' => 80_014_400_777,
- 'organization' => {
- 'id' => 80_014_400_111,
- 'resource_type' => 'organization'
- },
- 'resource_type' => 'user',
- },
- 'creator' => {
- 'id' => 80_014_400_777,
- 'resource_type' => 'user',
- },
- 'identity' => {
- 'id' => 80_014_400_777,
- 'resource_type' => 'identity_email'
- },
- 'assigned_agent' => {
- 'id' => 80_014_400_475,
- 'resource_type' => 'user',
- },
- 'assigned_team' => {
- 'id' => 80_000_374_718,
- 'resource_type' => 'team'
- },
- 'status' => {
- 'id' => 2,
- 'label' => 'Open',
- 'type' => 'OPEN',
- 'sort_order' => 2,
- 'is_sla_active' => true,
- 'is_deleted' => false,
- 'created_at' => '2021-08-12T11:48:51+00:00',
- 'updated_at' => '2021-08-12T11:48:51+00:00',
- 'resource_type' => 'case_status',
- },
- 'priority' => {
- 'id' => 1,
- 'label' => 'Low',
- 'level' => 1,
- 'created_at' => '2021-08-12T11:48:51+00:00',
- 'updated_at' => '2021-08-12T11:48:51+00:00',
- 'resource_type' => 'case_priority',
- },
- 'type' => {
- 'id' => 1,
- 'label' => 'Question',
- 'type' => 'QUESTION',
- 'created_at' => '2021-08-12T11:48:51+00:00',
- 'updated_at' => '2021-08-12T11:48:51+00:00',
- },
- 'last_updated_by' => {
- 'id' => 80_000_374_718,
- 'resource_type' => 'user',
- },
- 'state' => 'ACTIVE',
- 'tags' => [
- {
- 'id' => 1,
- 'name' => 'example',
- 'resource_type' => 'tag'
- },
- {
- 'id' => 2,
- 'name' => 'test',
- 'resource_type' => 'tag'
- }
- ],
- 'created_at' => '2018-08-18T12:00:00+00:00',
- 'updated_at' => '2021-08-24T06:30:00+00:00',
- 'resource_type' => 'case',
- }
- end
- let(:id_map) do
- {
- 'Organization' => {
- 80_014_400_111 => organization.id,
- },
- 'User' => {
- 80_014_400_475 => owner.id,
- 80_014_400_777 => customer.id,
- },
- 'Group' => {
- 80_000_374_718 => group.id,
- },
- }
- end
- let(:process_payload) do
- {
- import_job: build_stubbed(:import_job, name: 'Import::Kayako', payload: {}),
- dry_run: false,
- resource: resource,
- field_map: {},
- id_map: id_map,
- default_language: 'en-us',
- }
- end
- let(:posts_response_payload) do
- {
- 'data' => [
- {
- 'id' => 99_999,
- 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b',
- 'client_id' => '',
- 'subject' => 'Getting comfortable with Kayako: a sample conversation',
- 'contents' => 'Some text conent\n',
- 'creator' => {
- 'id' => 80_014_400_777,
- 'resource_type' => 'user'
- },
- 'identity' => {
- 'id' => 80_014_400_777,
- 'email' => customer.email,
- 'resource_type' => 'identity_email',
- },
- 'source_channel' => {
- 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
- 'type' => 'MAIL',
- 'character_limit' => nil,
- 'account' => {
- 'id' => 1,
- 'resource_type' => 'mailbox'
- },
- 'resource_type' => 'channel'
- },
- 'attachments' => [],
- 'original' => {
- 'id' => 4,
- 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b',
- 'subject' => 'Getting comfortable with Kayako: a sample conversation',
- 'body_text' => 'Some text conent\n',
- 'body_html' => '<div dir=\'ltr\'>Some text conent<br></div>',
- 'recipients' => [],
- 'fullname' => customer.fullname,
- 'email' => customer.email,
- 'creator' => {
- 'id' => 80_014_400_777,
- 'resource_type' => 'user'
- },
- 'identity' => {
- 'id' => 80_014_400_777,
- 'email' => customer.email,
- 'resource_type' => 'identity_email',
- },
- 'mailbox' => {
- 'id' => 1,
- 'uuid' => 'e955e374-8324-4637-97a5-763cd4010997',
- 'address' => 'info@zammad.org',
- 'resource_type' => 'mailbox',
- },
- 'attachments' => [],
- 'download_all' => nil,
- 'locale' => nil,
- 'response_time' => 0,
- 'created_at' => '2021-08-16T08:19:40+00:00',
- 'updated_at' => '2021-08-16T08:19:40+00:00',
- 'resource_type' => 'case_message',
- },
- 'is_requester' => true,
- 'created_at' => '2021-08-16T08:19:40+00:00',
- 'updated_at' => '2021-08-16T08:30:11+00:00',
- 'resource_type' => 'post',
- }
- ]
- }
- end
- let(:imported_ticket) do
- {
- title: 'Getting comfortable with Kayako: a sample conversation',
- note: nil,
- create_article_type_id: 1,
- create_article_sender_id: 2,
- article_count: 1,
- state_id: 2,
- group_id: group.id,
- priority_id: 1,
- owner_id: owner.id,
- customer_id: customer.id,
- organization_id: organization.id,
- type: 'Question'
- }
- end
- before do
- # Mock the posts get request (Import::Kayako::Case::Posts).
- stub_request(:get, 'https://yours.kayako.com/api/v1/cases/9999/posts?include=mailbox,message_recipient,channel,attachment,case_message,note,chat_message,identity_email,identity_twitter,identity_facebook,facebook_message,facebook_post,facebook_post_comment,twitter_message,twitter_tweet&limit=100').to_return(status: 200, body: JSON.generate(posts_response_payload), headers: {})
- end
- it 'adds tickets' do
- expect { process(process_payload) }.to change(Ticket, :count).by(1)
- end
- it 'correct attributes for added ticket' do
- process(process_payload)
- expect(Ticket.last).to have_attributes(imported_ticket)
- end
- it 'correct tags for added ticket' do
- process(process_payload)
- expect(Ticket.last.tag_list).to eq(%w[example test])
- end
- it 'adds article' do
- expect { process(process_payload) }.to change(Ticket::Article, :count).by(1)
- end
- it 'correct attributes for added article' do
- process(process_payload)
- expect(Ticket::Article.last).to have_attributes(
- to: 'info@zammad.org',
- body: "<div dir=\"ltr\">Some text conent<br>\n</div>",
- )
- end
- context 'when ticket is imported twice' do
- let(:ticket) { Ticket.last }
- before do
- process(process_payload)
- # Get imported ticket after first import
- ticket
- end
- it 'updates first article for already existing ticket' do
- expect { process(process_payload) }.not_to change(Ticket::Article, :count)
- end
- it 'updates ticket data' do
- resource['subject'] = 'Different title test'
- process(process_payload)
- imported_ticket[:title] = 'Different title test'
- expect(ticket.reload).to have_attributes(imported_ticket)
- end
- end
- context 'when importing without a type' do
- before do
- resource['type'] = nil
- imported_ticket[:type] = nil
- end
- it 'correct attributes for added ticket' do
- process(process_payload)
- expect(Ticket.last).to have_attributes(imported_ticket)
- end
- end
- context "when status is 'PENDING'" do
- before do
- resource['status'] = {
- 'id' => 3,
- 'label' => 'Pending',
- 'type' => 'PENDING',
- 'sort_order' => 3,
- 'is_sla_active' => false,
- 'is_deleted' => false,
- 'created_at' => '2021-08-12T11:48:51+00:00',
- 'updated_at' => '2021-08-12T11:48:51+00:00',
- }
- imported_ticket[:state_id] = 3
- end
- it 'correct attributes for added ticket' do
- process(process_payload)
- expect(Ticket.last).to have_attributes(imported_ticket)
- end
- end
- context 'when importing custom fields' do
- include_examples 'Object custom field values', object_name: 'Ticket', klass: Ticket
- end
- end
- end
|