Browse Source

Maintenance: Add test factory for Telegram tickets and articles.

Dusan Vuckovic 2 years ago
parent
commit
5b2662d6e4

+ 28 - 1
spec/factories/channel.rb

@@ -229,7 +229,34 @@ FactoryBot.define do
       transient do
         custom_options      { {} }
         external_credential { create(:sms_message_bird_credential) }
-        webhook_token       { '0dc0aa647f509fc89a0aad8d3e86dcae' }
+        webhook_token       { Faker::Crypto.md5 }
+      end
+    end
+
+    factory :telegram_channel do
+      area { 'Telegram::Bot' }
+
+      options do
+        {
+          bot:            {
+            id:         bid,
+            username:   "#{Faker::Internet.username}bot",
+            first_name: Faker::Name.first_name,
+            last_name:  Faker::Name.last_name,
+          },
+          callback_token: callback_token,
+          callback_url:   "http://localhost:3000/api/v1/channels_telegram_webhook/#{callback_token}?bid=#{bid}",
+          api_token:      "#{bid}:#{external_credential.credentials['api_token']}",
+          welcome:        Faker::Lorem.sentence,
+          goodbye:        Faker::Lorem.sentence,
+        }.deep_merge(custom_options)
+      end
+
+      transient do
+        custom_options      { {} }
+        external_credential { create(:telegram_credential) }
+        bid { Faker::Number.number(digits: 10) }
+        callback_token { Faker::Alphanumeric.alphanumeric(number: 14) }
       end
     end
   end

+ 6 - 1
spec/factories/external_credential.rb

@@ -55,7 +55,12 @@ FactoryBot.define do
 
     factory :sms_message_bird_credential do
       name        { 'message_bird' }
-      credentials { { token: 'nJC9GLTRXNHgMBCsbb1Rjy105' } }
+      credentials { { token: Faker::Alphanumeric.alphanumeric(number: 25) } }
+    end
+
+    factory :telegram_credential do
+      name        { 'telegram' }
+      credentials { { api_token: "#{Faker::Alphanumeric.alphanumeric(number: 7)}-#{Faker::Alphanumeric.alphanumeric(number: 13)}_#{Faker::Alphanumeric.alphanumeric(number: 7)}_#{Faker::Alphanumeric.alphanumeric(number: 5)}" } }
     end
   end
 end

+ 12 - 0
spec/factories/ticket.rb

@@ -40,5 +40,17 @@ FactoryBot.define do
         }
       end
     end
+
+    factory :telegram_ticket do
+      transient do
+        channel { create(:telegram_channel) }
+      end
+
+      preferences do
+        {
+          channel_id: channel.id,
+        }
+      end
+    end
   end
 end

+ 80 - 0
spec/factories/ticket/article.rb

@@ -204,5 +204,85 @@ FactoryBot.define do
         end
       end
     end
+
+    factory :telegram_article do
+      inbound
+
+      transient do
+        type_name { 'telegram personal-message' }
+        channel { Channel.find(ticket.preferences[:channel_id]) }
+        username { Faker::Internet.username }
+      end
+
+      association :ticket, factory: :telegram_ticket
+      to { "@#{channel[:options][:bot][:username]}" }
+      subject { nil }
+      body { Faker::Lorem.sentence }
+      message_id { "#{Faker::Number.decimal(l_digits: 1, r_digits: 10)}@telegram" }
+      content_type { 'text/plain' }
+
+      after(:create) do |article, context|
+        pp article, context
+        context.ticket.preferences.tap do |p|
+          p['telegram'] = {
+            bid:     context.channel[:options][:bot][:id],
+            chat_id: (article.preferences[:telegram] && article.preferences[:telegram][:chat_id]) || Faker::Number.number(digits: 10),
+          }
+        end
+
+        context.ticket.save!
+      end
+
+      trait :inbound do
+        transient do
+          sender_name { 'Customer' }
+        end
+
+        created_by_id { ticket.customer_id } # NB: influences the value for the from field!
+
+        preferences do
+          {
+            message:   {
+              created_at: Time.current.to_i,
+              message_id: message_id,
+              from:       ActionController::Parameters.new(
+                'id'            => Faker::Number.number,
+                'is_bot'        => false,
+                'first_name'    => Faker::Name.first_name,
+                'last_name'     => Faker::Name.last_name,
+                'username'      => username,
+                'language_code' => 'en',
+              ),
+            },
+            update_id: Faker::Number.number(digits: 8),
+          }
+        end
+      end
+
+      trait :outbound do
+        transient do
+          sender_name { 'Agent' }
+        end
+
+        to { "@#{username}" }
+        created_by_id { create(:agent).id } # NB: influences the value for the from field!
+        in_reply_to { "#{Faker::Number.decimal(l_digits: 1, r_digits: 10)}@telegram" }
+
+        preferences do
+          {
+            delivery_retry:          1,
+            telegram:                {
+              date:       Time.current.to_i,
+              from_id:    Faker::Number.number(digits: 10),
+              chat_id:    Faker::Number.number(digits: 10),
+              message_id: Faker::Number.number,
+            },
+            delivery_status_message: nil,
+            delivery_status:         'success',
+            delivery_status_date:    Time.current,
+          }
+        end
+      end
+    end
   end
 end