Browse Source

Maintenance: Port ticket_csv_import_test.rb to rspec.

Martin Gruner 2 years ago
parent
commit
3e830937b0

+ 1 - 1
spec/models/concerns/can_csv_import_examples.rb

@@ -6,7 +6,7 @@ RSpec.shared_examples 'CanCsvImport' do |unique_attributes: []|
       described_class.destroy_all
     end
 
-    context 'when no data avaiable' do
+    context 'when no data available' do
       it 'still returns the header for the csv example' do
         expect(described_class.csv_example).to include('id')
       end

+ 131 - 0
spec/models/concerns/can_csv_import_ticket_examples.rb

@@ -0,0 +1,131 @@
+# Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
+
+require 'csv'
+
+RSpec.shared_examples 'CanCsvImportTicket', :aggregate_failures do
+  describe '.csv_example' do
+    before do
+      described_class.destroy_all
+    end
+
+    context 'when no data avaiable' do
+      let(:headers) do
+        CSV.parse(described_class.csv_example).shift
+      end
+
+      it 'returns expected headers' do
+        expect(headers).to start_with('id', 'number', 'title', 'note', 'first_response_at', 'first_response_escalation_at')
+        expect(headers).to include('organization', 'priority', 'state', 'owner', 'customer')
+      end
+    end
+  end
+
+  describe '.csv_import' do
+    let(:try)    { true }
+    let(:params) { { string: csv_string, parse_params: { col_sep: ';' }, try: try } }
+    let(:result) { described_class.csv_import(**params) }
+
+    shared_examples 'fails with error' do |errors|
+      shared_examples 'checks error handling' do
+        it 'returns error(s)' do
+          expect(result).to include({ try: try, result: 'failed', errors: errors })
+        end
+
+        it 'does not import tickets' do
+          # Any single failure will cause the entire import to be aborted.
+          expect { result }.not_to change(Ticket, :count)
+        end
+      end
+      context 'with :try' do
+        include_examples 'checks error handling'
+      end
+
+      context 'without :try' do
+        let(:try) { false }
+
+        include_examples 'checks error handling'
+      end
+    end
+
+    context 'with empty string' do
+      let(:csv_string) { '' }
+
+      include_examples 'fails with error', ['Unable to parse empty file/string for Ticket.']
+    end
+
+    context 'with just CSV header line' do
+      let(:csv_string) { 'id;number;title;state;priority;' }
+
+      include_examples 'fails with error', ['No records found in file/string for Ticket.']
+    end
+
+    context 'without required lookup header' do
+      let(:csv_string) { "firstname;lastname;active;\nfirstname-simple-import1;lastname-simple-import1;;true\nfirstname-simple-import2;lastname-simple-import2;false\n" }
+
+      include_examples 'fails with error', ['No lookup column like id,number for Ticket found.']
+    end
+
+    context 'with invalid id' do
+      let(:csv_string) { "id;number;title;state;priority;owner;customer;group;note\n999999999;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;-;nicole.braun@zammad.org;Users;some note2\n" }
+
+      include_examples 'fails with error', ["Line 1: unknown Ticket with id '999999999'."]
+    end
+
+    context 'with invalid attributes' do
+      let(:csv_string) { "id;number;not_existing;state;priority;owner;customer;group;note\n;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;-;nicole.braun@zammad.org;Users;some note2\n" }
+
+      include_examples 'fails with error', [
+        "Line 1: Unable to create record - unknown attribute 'not_existing' for Ticket.",
+        "Line 2: Unable to create record - unknown attribute 'not_existing' for Ticket.",
+      ]
+    end
+
+    context 'with valid import data' do
+      let(:csv_string) { "id;number;title;state;priority;owner;customer;group;note\n;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;-;nicole.braun@zammad.org;Users;some note2\n" }
+
+      context 'with :try' do
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success' })
+          expect(result[:records].count).to be(2)
+        end
+
+        it 'does not import tickets' do
+          expect { result }.not_to change(Ticket, :count)
+        end
+      end
+
+      context 'without :try' do
+        let(:try)           { false }
+        let(:first_ticket)  { Ticket.last(2).first }
+        let(:second_ticket) { Ticket.last }
+
+        it 'returns success' do
+          expect(result).to include({ try: try, result: 'success' })
+          expect(result[:records].count).to be(2)
+        end
+
+        it 'does import tickets' do
+          expect { result }.to change(Ticket, :count).by(2)
+          expect(first_ticket).to have_attributes(
+            number:   '123456',
+            title:    'some title1',
+            note:     'some note1',
+            state:    have_attributes(name: 'new'),
+            priority: have_attributes(name: '2 normal'),
+            owner:    have_attributes(login: '-'),
+            customer: have_attributes(login: 'nicole.braun@zammad.org'),
+          )
+          expect(second_ticket).to have_attributes(
+            number:   '123457',
+            title:    'some title2',
+            note:     'some note2',
+            state:    have_attributes(name: 'closed'),
+            priority: have_attributes(name: '1 low'),
+            owner:    have_attributes(login: '-'),
+            customer: have_attributes(login: 'nicole.braun@zammad.org'),
+          )
+        end
+      end
+    end
+  end
+end

+ 2 - 0
spec/models/ticket_spec.rb

@@ -4,6 +4,7 @@ require 'rails_helper'
 require 'models/application_model_examples'
 require 'models/concerns/can_be_imported_examples'
 require 'models/concerns/can_csv_import_examples'
+require 'models/concerns/can_csv_import_ticket_examples'
 require 'models/concerns/checks_core_workflow_examples'
 require 'models/concerns/has_history_examples'
 require 'models/concerns/has_tags_examples'
@@ -24,6 +25,7 @@ RSpec.describe Ticket, type: :model do
   it_behaves_like 'ApplicationModel'
   it_behaves_like 'CanBeImported'
   it_behaves_like 'CanCsvImport'
+  it_behaves_like 'CanCsvImportTicket'
   it_behaves_like 'ChecksCoreWorkflow'
   it_behaves_like 'HasHistory', history_relation_object: ['Ticket::Article', 'Mention', 'Ticket::SharedDraftZoom']
   it_behaves_like 'HasTags'

+ 0 - 209
test/unit/ticket_csv_import_test.rb

@@ -1,209 +0,0 @@
-# Copyright (C) 2012-2023 Zammad Foundation, https://zammad-foundation.org/
-
-require 'test_helper'
-
-class TicketCsvImportTest < ActiveSupport::TestCase
-
-  test 'import example verify' do
-    csv_string = Ticket.csv_example
-
-    rows = CSV.parse(csv_string)
-    header = rows.shift
-    assert_equal('id', header[0])
-    assert_equal('number', header[1])
-    assert_equal('title', header[2])
-    assert_equal('note', header[3])
-    assert_equal('first_response_at', header[4])
-    assert_equal('first_response_escalation_at', header[5])
-    assert(header.include?('organization'))
-    assert(header.include?('priority'))
-    assert(header.include?('state'))
-    assert(header.include?('owner'))
-    assert(header.include?('customer'))
-
-  end
-
-  test 'empty payload' do
-    csv_string = ''
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          true,
-    )
-    assert_equal(true, result[:try])
-    assert_nil(result[:records])
-    assert_equal('failed', result[:result])
-    assert_equal('Unable to parse empty file/string for Ticket.', result[:errors][0])
-
-    csv_string = 'id;number;title;state;priority;'
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          true,
-    )
-    assert_equal(true, result[:try])
-    assert(result[:records].blank?)
-    assert_equal('failed', result[:result])
-    assert_equal('No records found in file/string for Ticket.', result[:errors][0])
-  end
-
-  test 'verify required lookup headers' do
-    csv_string = "firstname;lastname;active;\nfirstname-simple-import1;lastname-simple-import1;;true\nfirstname-simple-import2;lastname-simple-import2;false\n"
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          true,
-    )
-    assert_equal(true, result[:try])
-    assert_equal('failed', result[:result])
-    assert_equal('No lookup column like id,number for Ticket found.', result[:errors][0])
-  end
-
-  test 'simple import' do
-
-    csv_string = "id;number;title;state;priority;owner;customer;group;note\n;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;admin@example.com;nicole.braun@zammad.org;Users;some note2\n"
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          true,
-    )
-    assert_equal(true, result[:try])
-    assert_equal(2, result[:records].count)
-    assert_equal('success', result[:result])
-
-    assert_nil(Ticket.find_by(number: '123456'))
-    assert_nil(Ticket.find_by(number: '123457'))
-
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          false,
-    )
-
-    assert_equal(false, result[:try])
-    assert_equal(2, result[:records].count)
-    assert_equal('success', result[:result])
-
-    ticket1 = Ticket.find_by(number: '123456')
-    assert(ticket1)
-    assert_equal(ticket1.number, '123456')
-    assert_equal(ticket1.title, 'some title1')
-    assert_equal(ticket1.state.name, 'new')
-    assert_equal(ticket1.priority.name, '2 normal')
-    assert_equal(ticket1.owner.login, '-')
-    assert_equal(ticket1.customer.login, 'nicole.braun@zammad.org')
-    assert_equal(ticket1.note, 'some note1')
-    ticket2 = Ticket.find_by(number: '123457')
-    assert(ticket2)
-    assert_equal(ticket2.number, '123457')
-    assert_equal(ticket2.title, 'some title2')
-    assert_equal(ticket2.state.name, 'closed')
-    assert_equal(ticket2.priority.name, '1 low')
-    assert_equal(ticket2.owner.login, 'admin@example.com')
-    assert_equal(ticket2.customer.login, 'nicole.braun@zammad.org')
-    assert_equal(ticket2.note, 'some note2')
-
-    ticket1.destroy!
-    ticket2.destroy!
-  end
-
-  test 'simple import with invalid id' do
-
-    csv_string = "id;number;title;state;priority;owner;customer;group;note\n999999999;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;admin@example.com;nicole.braun@zammad.org;Users;some note2\n"
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          true,
-    )
-    assert_equal(true, result[:try])
-    assert_equal(1, result[:errors].count)
-    assert_equal('failed', result[:result])
-    assert_equal("Line 1: unknown Ticket with id '999999999'.", result[:errors][0])
-
-    assert_nil(Ticket.find_by(number: '123456'))
-    assert_nil(Ticket.find_by(number: '123457'))
-
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          false,
-    )
-    assert_equal(false, result[:try])
-    assert_equal(1, result[:records].count)
-    assert_equal('failed', result[:result])
-
-    assert_nil(Ticket.find_by(number: '123456'))
-
-    # any single failure will cause the entire import to be aborted
-    assert_nil(Ticket.find_by(number: '123457'))
-
-    csv_string = "id;number;title;state;priority;owner;customer;group;note\n999999999;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title22;closed;1 low;admin@example.com;nicole.braun@zammad.org;Users;some note22\n"
-
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          false,
-    )
-    assert_equal(false, result[:try])
-    assert_equal(1, result[:records].count)
-    assert_equal('failed', result[:result])
-
-    assert_nil(Ticket.find_by(number: '123456'))
-
-    # any single failure will cause the entire import to be aborted
-    assert_nil(Ticket.find_by(number: '123457'))
-  end
-
-  test 'invalid attributes' do
-
-    csv_string = "id;number;not_existing;state;priority;owner;customer;group;note\n;123456;some title1;new;2 normal;-;nicole.braun@zammad.org;Users;some note1\n;123457;some title2;closed;1 low;admin@example.com;nicole.braun@zammad.org;Users;some note2\n"
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          true,
-    )
-    assert_equal(true, result[:try])
-    assert_equal(2, result[:errors].count)
-    assert_equal('failed', result[:result])
-    assert_equal("Line 1: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][0])
-    assert_equal("Line 2: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][1])
-
-    assert_nil(Ticket.find_by(number: '123456'))
-    assert_nil(Ticket.find_by(number: '123457'))
-
-    result = Ticket.csv_import(
-      string:       csv_string,
-      parse_params: {
-        col_sep: ';',
-      },
-      try:          false,
-    )
-    assert_equal(false, result[:try])
-    assert_equal(2, result[:errors].count)
-    assert_equal('failed', result[:result])
-    assert_equal("Line 1: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][0])
-    assert_equal("Line 2: Unable to create record - unknown attribute 'not_existing' for Ticket.", result[:errors][1])
-
-    assert_nil(Ticket.find_by(number: '123456'))
-    assert_nil(Ticket.find_by(number: '123457'))
-  end
-
-end