# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/ require 'rails_helper' RSpec.describe Sequencer::Sequence::Import::Kayako::Post, sequencer: :sequence do context 'when importing posts from Kayako' do let(:user) { create(:user) } let(:customer) { create(:customer) } let(:ticket) { create(:ticket) } let(:resource) do { 'id' => 99_999, 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b', 'client_id' => '', 'subject' => 'Getting comfortable with Kayako: a sample conversation', 'contents' => "[img src=\"https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn\" class=\"fr-fic fr-dii\" style=\"width: 127px; height: 96.3263px;\" width=\"127\" height=\"96.3263\"]\n\nA Test with a inline image.\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' => [ { 'id' => 3, 'name' => 'example.json', 'size' => 100, 'width' => 0, 'height' => 0, 'type' => 'application/json', 'content_id' => nil, 'alt' => nil, 'url' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/3/url', 'url_download' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/3/download', 'thumbnails' => [], 'created_at' => '2021-08-16T08:43:46+00:00', 'resource_type' => 'attachment', }, { 'id' => 2, 'name' => 'example.log', 'size' => 1909, 'width' => 0, 'height' => 0, 'type' => 'text/plain', 'content_id' => nil, 'alt' => nil, 'url' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/url', 'url_download' => 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/download', 'thumbnails' => [], 'created_at' => '2021-08-16T08:43:46+00:00', 'resource_type' => 'attachment', }, ], 'original' => { 'id' => 4, 'uuid' => '179a033a-7582-4def-ae57-b8f077eaee5b', 'subject' => 'Getting comfortable with Kayako: a sample conversation', 'body_text' => "[img src=\"https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn\" class=\"fr-fic fr-dii\" style=\"width: 127px; height: 96.3263px;\" width=\"127\" height=\"96.3263\"]\n\nA Test with a inline image.\n", 'body_html' => '

A Test with a inline image.
', '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(:used_urls) do [ 'https://yours.kayako.com/media/url/UB6tba5kStQ7pL1i247kJ2blopDsywfn', 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/2/download' ] end let(:id_map) do { 'Ticket' => { 1001 => ticket.id, }, 'User' => { 80_014_400_745 => user.id, 80_014_400_777 => customer.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, instance: ticket, default_language: 'en-us', } end let(:imported_ticket_article_attachment) do { filename: 'example.log', size: '3', preferences: { 'Content-Type': 'text/plain' } } end let(:imported_ticket_article_attachment_json) do { filename: 'example.json', size: '12', preferences: { 'Content-Type': 'application/json' } } end before do # Mock the attachment and inline image download requests. used_urls.each do |used_url| stub_request(:get, used_url).to_return(status: 200, body: '123', headers: {}) end # Special handling for json situation stub_request(:get, 'https://yours.kayako.com/api/v1/cases/9999/notes/99999/attachments/3/download').to_return(status: 200, body: '{test: 123,}', headers: { 'content-type': 'application/json' }) end it 'adds article with inline image' do expect { process(process_payload) }.to change(Ticket::Article, :count).by(1) end it 'correct attributes for added article' do process(process_payload) attachment_list = Store.list( object: 'Ticket::Article', o_id: Ticket::Article.last.id, ) expect(Ticket::Article.last).to have_attributes( to: 'info@zammad.org', body: "

A Test with a inline image.
", ) end it 'updates already existing article' do expect do process(process_payload) process(process_payload) end.to change(Ticket::Article, :count).by(1) end it 'adds correct number of attachments' do process(process_payload) expect(Ticket::Article.last.attachments.size).to eq 3 end it 'adds attachment content' do process(process_payload) expect(Ticket::Article.last.attachments).to include(have_attributes(imported_ticket_article_attachment)) .and include(have_attributes(imported_ticket_article_attachment_json)) end end end