facebook_test.rb 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. # encoding: utf-8
  2. require 'integration_test_helper'
  3. class FacebookTest < ActiveSupport::TestCase
  4. self.test_order = :sorted
  5. self.use_transactional_tests = false
  6. # set system mode to done / to activate
  7. Setting.set('system_init_done', true)
  8. # needed to check correct behavior
  9. group = Group.create_if_not_exists(
  10. name: 'Facebook',
  11. note: 'All Facebook feed posts.',
  12. updated_by_id: 1,
  13. created_by_id: 1
  14. )
  15. # account config
  16. if !ENV['FACEBOOK_USER']
  17. raise "ERROR: Need FACEBOOK_USER - hint FACEBOOK_USER='name:1234:access_token'"
  18. end
  19. user_name = ENV['FACEBOOK_USER'].split(':')[0]
  20. user_id = ENV['FACEBOOK_USER'].split(':')[1]
  21. user_access_token = ENV['FACEBOOK_USER'].split(':')[2]
  22. if !ENV['FACEBOOK_PAGE']
  23. raise "ERROR: Need FACEBOOK_PAGE - hint FACEBOOK_PAGE='name:1234:access_token'"
  24. end
  25. page_name = ENV['FACEBOOK_PAGE'].split(':')[0]
  26. page_id = ENV['FACEBOOK_PAGE'].split(':')[1]
  27. page_access_token = ENV['FACEBOOK_PAGE'].split(':')[2]
  28. if !ENV['FACEBOOK_CUSTOMER']
  29. raise "ERROR: Need FACEBOOK_CUSTOMER - hint FACEBOOK_CUSTOMER='name:1234:access_token'"
  30. end
  31. customer_name = ENV['FACEBOOK_CUSTOMER'].split(':')[0]
  32. customer_id = ENV['FACEBOOK_CUSTOMER'].split(':')[1]
  33. customer_access_token = ENV['FACEBOOK_CUSTOMER'].split(':')[2]
  34. provider_options = {
  35. adapter: 'facebook',
  36. auth: {
  37. access_token: user_access_token
  38. },
  39. user: {
  40. name: user_name,
  41. id: user_id,
  42. },
  43. pages: [
  44. {
  45. 'id' => page_id,
  46. 'name' => page_name,
  47. 'access_token' => page_access_token,
  48. }
  49. ],
  50. sync: {
  51. pages: {
  52. page_id => { 'group_id' => group.id.to_s },
  53. }
  54. }
  55. }
  56. # add channel
  57. current = Channel.where(area: 'Facebook::Account')
  58. current.each(&:destroy)
  59. Channel.create(
  60. area: 'Facebook::Account',
  61. options: provider_options,
  62. active: true,
  63. created_by_id: 1,
  64. updated_by_id: 1,
  65. )
  66. # check users account
  67. test 'a - user account' do
  68. client = Facebook.new(user_access_token)
  69. current_user = client.current_user
  70. assert_equal(user_id, current_user['id'])
  71. assert_equal(user_name, current_user['name'])
  72. end
  73. # check available pages
  74. test 'b - available pages' do
  75. client = Facebook.new(user_access_token)
  76. page_found = false
  77. client.pages.each do |page|
  78. next if page[:name] != page_name
  79. page_found = true
  80. assert_equal(page_id, page[:id])
  81. assert_equal(page_name, page[:name])
  82. end
  83. assert(page_found, "Page lookup for '#{page_name}'")
  84. end
  85. # check access to pages
  86. test 'c - page access' do
  87. page_found = false
  88. provider_options[:pages].each do |page|
  89. client = Facebook.new(page['access_token'])
  90. current_user = client.current_user
  91. next if page['name'] != page_name
  92. page_found = true
  93. assert_equal(page_id, current_user['id'])
  94. assert_equal(page_name, current_user['name'])
  95. end
  96. assert(page_found, "Page lookup for '#{page_name}'")
  97. end
  98. # check page account
  99. test 'd - page account' do
  100. client = Facebook.new(page_access_token)
  101. current_user = client.current_user
  102. assert_equal(page_id, current_user['id'])
  103. assert_equal(page_name, current_user['name'])
  104. end
  105. test 'e - feed post to ticket' do
  106. customer_client = Koala::Facebook::API.new(customer_access_token)
  107. message = "I've got an issue with my hat, serial number ##{rand(99_999)}"
  108. post = customer_client.put_wall_post(message, {}, page_id)
  109. sleep 8
  110. # fetch check system account
  111. Channel.fetch
  112. # check if first article has been created
  113. article = Ticket::Article.find_by(message_id: post['id'])
  114. assert_equal('new', article.ticket.state.name)
  115. assert(article, "article post '#{post['id']}' imported")
  116. assert_equal(article.from, customer_name, 'ticket article inbound body')
  117. assert_equal(article.to, page_name, 'ticket article inbound body')
  118. assert_equal(article.body, message, 'ticket article inbound body')
  119. assert_equal(1, article.ticket.articles.count, 'ticket article inbound count')
  120. assert_equal(message, article.ticket.articles.last.body, 'ticket article inbound body')
  121. # check customer
  122. customer = article.ticket.customer
  123. assert_equal('Bernd', customer.firstname)
  124. assert_equal('Hofbecker', customer.lastname)
  125. post_comment = "Any updates yet? It's urgent. I love my hat."
  126. comment = customer_client.put_comment(post['id'], post_comment)
  127. sleep 8
  128. # fetch check system account
  129. Channel.fetch
  130. # check if second article has been created
  131. article = Ticket::Article.find_by(message_id: comment['id'])
  132. assert_equal('new', article.ticket.reload.state.name)
  133. assert(article, "article comment '#{comment['id']}' imported")
  134. assert_equal(article.from, customer_name, 'ticket article inbound body')
  135. assert_equal(article.body, post_comment, 'ticket article inbound body')
  136. assert_equal(2, article.ticket.articles.count, 'ticket article inbound count')
  137. assert_equal(post_comment, article.ticket.articles.last.body, 'ticket article inbound body')
  138. end
  139. test 'f - feed post and comment reply' do
  140. customer_client = Koala::Facebook::API.new(customer_access_token)
  141. feed_post = "I've got an issue with my hat, serial number ##{rand(99_999)}"
  142. post = customer_client.put_wall_post(feed_post, {}, page_id)
  143. sleep 8
  144. # fetch check system account
  145. Channel.fetch
  146. article = Ticket::Article.find_by(message_id: post['id'])
  147. ticket = article.ticket
  148. assert_equal('new', ticket.state.name)
  149. assert(article, "article post '#{post['id']}' imported")
  150. # check customer
  151. customer = ticket.customer
  152. assert_equal(customer_name, "#{customer.firstname} #{customer.lastname}")
  153. # reply via ticket
  154. reply_text = "What's your issue Bernd?"
  155. outbound_article = Ticket::Article.create(
  156. ticket_id: ticket.id,
  157. body: reply_text,
  158. in_reply_to: post['id'],
  159. type: Ticket::Article::Type.find_by(name: 'facebook feed comment'),
  160. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  161. internal: false,
  162. updated_by_id: 1,
  163. created_by_id: 1,
  164. )
  165. Scheduler.worker(true)
  166. assert_equal('open', ticket.reload.state.name)
  167. outbound_article = Ticket::Article.find(outbound_article.id)
  168. assert(outbound_article, 'outbound article created')
  169. assert_equal(outbound_article.from, page_name, 'ticket article outbound count')
  170. assert_equal(outbound_article.ticket.articles.count, 2, 'ticket article outbound count')
  171. ticket = Ticket.find(outbound_article.ticket_id)
  172. ticket.state = Ticket::State.find_by(name: 'closed')
  173. ticket.save!
  174. post_comment = 'The peacock feather is fallen off.'
  175. comment = customer_client.put_comment(post['id'], post_comment)
  176. sleep 8
  177. # fetch check system account
  178. Channel.fetch
  179. article = Ticket::Article.find_by(message_id: comment['id'])
  180. assert(article, "article comment '#{comment['id']}' imported")
  181. assert_equal('open', ticket.reload.state.name)
  182. # reply via ticket
  183. reply_text = "Please send it to our address and add the ticket number #{article.ticket.number}."
  184. outbound_article = Ticket::Article.create(
  185. ticket_id: ticket.id,
  186. body: reply_text,
  187. in_reply_to: comment['id'],
  188. type: Ticket::Article::Type.find_by(name: 'facebook feed comment'),
  189. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  190. internal: false,
  191. updated_by_id: 1,
  192. created_by_id: 1,
  193. )
  194. Scheduler.worker(true)
  195. outbound_article = Ticket::Article.find(outbound_article.id)
  196. assert(outbound_article, 'outbound article created')
  197. assert_equal(outbound_article.from, page_name, 'ticket article outbound count')
  198. assert_equal(outbound_article.ticket.articles.count, 4, 'ticket article outbound count')
  199. end
  200. end