|
@@ -1,40 +1,75 @@
|
|
# encoding: utf-8
|
|
# encoding: utf-8
|
|
require 'test_helper'
|
|
require 'test_helper'
|
|
require 'rexml/document'
|
|
require 'rexml/document'
|
|
|
|
+require 'webmock/minitest'
|
|
|
|
|
|
class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
setup do
|
|
setup do
|
|
@headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
|
|
@headers = { 'ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ test 'basic call' do
|
|
|
|
+ Ticket.destroy_all
|
|
|
|
|
|
# configure telegram channel
|
|
# configure telegram channel
|
|
- token = ENV['TELEGRAM_TOKEN']
|
|
|
|
|
|
+ token = 'valid_token'
|
|
|
|
+ bot_id = 123_456_789
|
|
group_id = Group.find_by(name: 'Users').id
|
|
group_id = Group.find_by(name: 'Users').id
|
|
- #bot = Telegram.check_token(token)
|
|
|
|
- #Setting.set('http_type', 'http')
|
|
|
|
- Setting.set('http_type', 'https')
|
|
|
|
- Setting.set('fqdn', 'me.zammad.com')
|
|
|
|
- Channel.where(area: 'Telegram::Bot').destroy_all
|
|
|
|
|
|
+
|
|
UserInfo.current_user_id = 1
|
|
UserInfo.current_user_id = 1
|
|
- @channel = Telegram.create_or_update_channel(token, { group_id: group_id, welcome: 'hi!' })
|
|
|
|
-
|
|
|
|
- groups = Group.where(name: 'Users')
|
|
|
|
- roles = Role.where(name: %w(Agent))
|
|
|
|
- agent = User.create_or_update(
|
|
|
|
- login: 'telegram-agent@example.com',
|
|
|
|
- firstname: 'E',
|
|
|
|
- lastname: 'S',
|
|
|
|
- email: 'telegram-agent@example.com',
|
|
|
|
- password: 'agentpw',
|
|
|
|
- active: true,
|
|
|
|
- roles: roles,
|
|
|
|
- groups: groups,
|
|
|
|
- )
|
|
|
|
- UserInfo.current_user_id = nil
|
|
|
|
|
|
+ Channel.where(area: 'Telegram::Bot').destroy_all
|
|
|
|
|
|
- end
|
|
|
|
|
|
+ # try with invalid token
|
|
|
|
+ stub_request(:get, 'https://api.telegram.org/botnot_existing/getMe')
|
|
|
|
+ .to_return(status: 404, body: '{"ok":false,"error_code":404,"description":"Not Found"}', headers: {})
|
|
|
|
|
|
- test 'basic call' do
|
|
|
|
- Ticket.destroy_all
|
|
|
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
|
+ Telegram.check_token('not_existing')
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # try valid token
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getMe")
|
|
|
|
+ .to_return(status: 200, body: "{\"ok\":true,\"result\":{\"id\":#{bot_id},\"first_name\":\"Chrispresso Customer Service\",\"username\":\"ChrispressoBot\"}}", headers: {})
|
|
|
|
+
|
|
|
|
+ bot = Telegram.check_token(token)
|
|
|
|
+ assert_equal(bot_id, bot['id'])
|
|
|
|
+
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getMe")
|
|
|
|
+ .to_return(status: 200, body: "{\"ok\":true,\"result\":{\"id\":#{bot_id},\"first_name\":\"Chrispresso Customer Service\",\"username\":\"ChrispressoBot\"}}", headers: {})
|
|
|
|
+
|
|
|
|
+ Setting.set('http_type', 'http')
|
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
|
+ Telegram.create_or_update_channel(token, { group_id: group_id, welcome: 'hi!' })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # try invalid port
|
|
|
|
+ stub_request(:get, "https://api.telegram.org:443/bot#{token}/getMe")
|
|
|
|
+ .to_return(status: 200, body: "{\"ok\":true,\"result\":{\"id\":#{bot_id},\"first_name\":\"Chrispresso Customer Service\",\"username\":\"ChrispressoBot\"}}", headers: {})
|
|
|
|
+ stub_request(:get, "https://api.telegram.org:443/bot#{token}/setWebhook?url=https://somehost.example.com:12345/api/v1/channels_telegram_webhook/callback_token?bid=#{bot_id}")
|
|
|
|
+ .to_return(status: 400, body: '{"ok":false,"error_code":400,"description":"Bad Request: bad webhook: Webhook can be set up only on ports 80, 88, 443 or 8443"}', headers: {})
|
|
|
|
+
|
|
|
|
+ Setting.set('http_type', 'https')
|
|
|
|
+ Setting.set('fqdn', 'somehost.example.com:12345')
|
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
|
+ Telegram.create_or_update_channel(token, { group_id: group_id, welcome: 'hi!' })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # try invalid host
|
|
|
|
+ stub_request(:get, "https://api.telegram.org:443/bot#{token}/setWebhook?url=https://somehost.example.com/api/v1/channels_telegram_webhook/callback_token?bid=#{bot_id}")
|
|
|
|
+ .to_return(status: 400, body: '{"ok":false,"error_code":400,"description":"Bad Request: bad webhook: getaddrinfo: Name or service not known"}', headers: {})
|
|
|
|
+
|
|
|
|
+ Setting.set('fqdn', 'somehost.example.com')
|
|
|
|
+ assert_raises(RuntimeError) {
|
|
|
|
+ Telegram.create_or_update_channel(token, { group_id: group_id, welcome: 'hi!' })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # valid token, host and port
|
|
|
|
+ stub_request(:get, "https://api.telegram.org:443/bot#{token}/setWebhook?url=https://example.com/api/v1/channels_telegram_webhook/callback_token?bid=#{bot_id}")
|
|
|
|
+ .to_return(status: 200, body: '{"ok":true,"result":true,"description":"Webhook was set"}', headers: {})
|
|
|
|
+
|
|
|
|
+ Setting.set('fqdn', 'example.com')
|
|
|
|
+ channel = Telegram.create_or_update_channel(token, { group_id: group_id, welcome: 'hi!' })
|
|
|
|
+ UserInfo.current_user_id = nil
|
|
|
|
|
|
# start communication #1
|
|
# start communication #1
|
|
post '/api/v1/channels/telegram_webhook', read_messaage('personal1_message_start'), @headers
|
|
post '/api/v1/channels/telegram_webhook', read_messaage('personal1_message_start'), @headers
|
|
@@ -46,13 +81,13 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
result = JSON.parse(@response.body)
|
|
result = JSON.parse(@response.body)
|
|
assert_equal('bot param missing', result['error'])
|
|
assert_equal('bot param missing', result['error'])
|
|
|
|
|
|
- callback_url = "/api/v1/channels_telegram_webhook/not_existing?bid=#{@channel.options[:bot][:id]}"
|
|
|
|
|
|
+ callback_url = "/api/v1/channels_telegram_webhook/not_existing?bid=#{channel.options[:bot][:id]}"
|
|
post callback_url, read_messaage('personal1_message_start'), @headers
|
|
post callback_url, read_messaage('personal1_message_start'), @headers
|
|
assert_response(422)
|
|
assert_response(422)
|
|
result = JSON.parse(@response.body)
|
|
result = JSON.parse(@response.body)
|
|
assert_equal('invalid callback token', result['error'])
|
|
assert_equal('invalid callback token', result['error'])
|
|
|
|
|
|
- callback_url = "/api/v1/channels_telegram_webhook/#{@channel.options[:callback_token]}?bid=#{@channel.options[:bot][:id]}"
|
|
|
|
|
|
+ callback_url = "/api/v1/channels_telegram_webhook/#{channel.options[:callback_token]}?bid=#{channel.options[:bot][:id]}"
|
|
post callback_url, read_messaage('personal1_message_start'), @headers
|
|
post callback_url, read_messaage('personal1_message_start'), @headers
|
|
assert_response(200)
|
|
assert_response(200)
|
|
|
|
|
|
@@ -139,6 +174,11 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
assert_equal('text/plain', ticket.articles.last.content_type)
|
|
assert_equal('text/plain', ticket.articles.last.content_type)
|
|
|
|
|
|
# send message2
|
|
# send message2
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=ABC-123VabcOcv123w0ABHywrcPqfrbAYIABC")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123VabcOcv123w0ABHywrcPqfrbAYIABC","file_path":"abc123"}}', headers: {})
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/file/bot#{token}/abc123")
|
|
|
|
+ .to_return(status: 200, body: 'ABC1', headers: {})
|
|
|
|
+
|
|
post callback_url, read_messaage('personal3_message_content2'), @headers
|
|
post callback_url, read_messaage('personal3_message_content2'), @headers
|
|
assert_response(200)
|
|
assert_response(200)
|
|
assert_equal(3, Ticket.count)
|
|
assert_equal(3, Ticket.count)
|
|
@@ -150,6 +190,13 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
assert_equal('text/html', ticket.articles.last.content_type)
|
|
assert_equal('text/html', ticket.articles.last.content_type)
|
|
|
|
|
|
# send message3
|
|
# send message3
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=AAQCABO0I4INAATATQAB5HWPq4XgxQACAg")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123AAQCABO0I4INAATATQAB5HWPq4XgxQACAg","file_path":"abc123"}}', headers: {})
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/file/bot#{token}/abc123")
|
|
|
|
+ .to_return(status: 200, body: 'ABC2', headers: {})
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=BQADAgADDgAD7x6ZSC_-1LMkOEmoAg")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123BQADAgADDgAD7x6ZSC_-1LMkOEmoAg","file_path":"abc123"}}', headers: {})
|
|
|
|
+
|
|
post callback_url, read_messaage('personal3_message_content3'), @headers
|
|
post callback_url, read_messaage('personal3_message_content3'), @headers
|
|
assert_response(200)
|
|
assert_response(200)
|
|
assert_equal(3, Ticket.count)
|
|
assert_equal(3, Ticket.count)
|
|
@@ -177,6 +224,9 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
assert_equal('text/plain', ticket.articles.first.content_type)
|
|
assert_equal('text/plain', ticket.articles.first.content_type)
|
|
|
|
|
|
# send voice5
|
|
# send voice5
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=AwADAgADVQADCEIYSZwyOmSZK9iZAg")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123AwADAgADVQADCEIYSZwyOmSZK9iZAg","file_path":"abc123"}}', headers: {})
|
|
|
|
+
|
|
post callback_url, read_messaage('personal3_message_content5'), @headers
|
|
post callback_url, read_messaage('personal3_message_content5'), @headers
|
|
assert_response(200)
|
|
assert_response(200)
|
|
assert_equal(3, Ticket.count)
|
|
assert_equal(3, Ticket.count)
|
|
@@ -188,11 +238,20 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
assert_equal(1, ticket.articles.last.attachments.count)
|
|
assert_equal(1, ticket.articles.last.attachments.count)
|
|
|
|
|
|
# start communication #4 - with sticker
|
|
# start communication #4 - with sticker
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=AAQDABO3-e4qAASs6ZOjJUT7tQ4lAAIC")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123AAQDABO3-e4qAASs6ZOjJUT7tQ4lAAIC","file_path":"abc123"}}', headers: {})
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=BQADAwAD0QIAAqbJWAAB8OkQqgtDQe0C")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123BQADAwAD0QIAAqbJWAAB8OkQqgtDQe0C","file_path":"abc123"}}', headers: {})
|
|
|
|
+
|
|
post callback_url, read_messaage('personal4_message_content1'), @headers
|
|
post callback_url, read_messaage('personal4_message_content1'), @headers
|
|
assert_response(200)
|
|
assert_response(200)
|
|
assert_equal(4, Ticket.count)
|
|
assert_equal(4, Ticket.count)
|
|
ticket = Ticket.last
|
|
ticket = Ticket.last
|
|
- assert_equal('💻', ticket.title)
|
|
|
|
|
|
+ if Rails.application.config.db_4bytes_utf8
|
|
|
|
+ assert_equal('💻', ticket.title)
|
|
|
|
+ else
|
|
|
|
+ assert_equal('', ticket.title)
|
|
|
|
+ end
|
|
assert_equal('new', ticket.state.name)
|
|
assert_equal('new', ticket.state.name)
|
|
assert_equal(1, ticket.articles.count)
|
|
assert_equal(1, ticket.articles.count)
|
|
assert_match(/<img style="/i, ticket.articles.last.body)
|
|
assert_match(/<img style="/i, ticket.articles.last.body)
|
|
@@ -200,6 +259,9 @@ class TelegramControllerTest < ActionDispatch::IntegrationTest
|
|
assert_equal(1, ticket.articles.last.attachments.count)
|
|
assert_equal(1, ticket.articles.last.attachments.count)
|
|
|
|
|
|
# start communication #5 - with photo
|
|
# start communication #5 - with photo
|
|
|
|
+ stub_request(:get, "https://api.telegram.org/bot#{token}/getFile?file_id=AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABNQoaI8BwR_z_2MFAAEC")
|
|
|
|
+ .to_return(status: 200, body: '{"result":{"file_size":123,"file_id":"ABC-123AgADAgADwacxGxk5MUmim45lijOwsKk1Sw0ABNQoaI8BwR_z_2MFAAEC","file_path":"abc123"}}', headers: {})
|
|
|
|
+
|
|
post callback_url, read_messaage('personal5_message_content1'), @headers
|
|
post callback_url, read_messaage('personal5_message_content1'), @headers
|
|
assert_response(200)
|
|
assert_response(200)
|
|
assert_equal(5, Ticket.count)
|
|
assert_equal(5, Ticket.count)
|