twitter_test.rb 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  1. # encoding: utf-8
  2. require 'integration_test_helper'
  3. class TwitterTest < 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: 'Twitter',
  11. note: 'All Tweets.',
  12. updated_by_id: 1,
  13. created_by_id: 1
  14. )
  15. {
  16. 'TWITTER_CONSUMER_KEY' => '1234',
  17. 'TWITTER_CONSUMER_SECRET' => '1234',
  18. 'TWITTER_SYSTEM_LOGIN' => '@system',
  19. 'TWITTER_SYSTEM_ID' => '1405469528',
  20. 'TWITTER_SYSTEM_TOKEN' => '1234',
  21. 'TWITTER_SYSTEM_TOKEN_SECRET' => '1234',
  22. 'TWITTER_CUSTOMER_LOGIN' => '@customer',
  23. 'TWITTER_CUSTOMER_TOKEN' => '1234',
  24. 'TWITTER_CUSTOMER_TOKEN_SECRET' => '1234',
  25. }.each do |key, example_value|
  26. next if ENV[key]
  27. raise "ERROR: Need ENV #{key} - hint: export #{key}='#{example_value}'"
  28. end
  29. # app config
  30. consumer_key = ENV['TWITTER_CONSUMER_KEY']
  31. consumer_secret = ENV['TWITTER_CONSUMER_SECRET']
  32. # armin_theo (is system and is following marion_bauer)
  33. system_login = ENV['TWITTER_SYSTEM_LOGIN']
  34. system_id = ENV['TWITTER_SYSTEM_ID']
  35. system_login_without_at = system_login[1, system_login.length]
  36. system_token = ENV['TWITTER_SYSTEM_TOKEN']
  37. system_token_secret = ENV['TWITTER_SYSTEM_TOKEN_SECRET']
  38. hash_tag1 = "#zarepl#{rand(999)}"
  39. hash_tag2 = "#citheo#{rand(999)}"
  40. # me_bauer (is customer and is following armin_theo)
  41. customer_login = ENV['TWITTER_CUSTOMER_LOGIN']
  42. customer_login_without_at = customer_login[1, customer_login.length]
  43. customer_token = ENV['TWITTER_CUSTOMER_TOKEN']
  44. customer_token_secret = ENV['TWITTER_CUSTOMER_TOKEN_SECRET']
  45. # ensure channel configuration
  46. Channel.where(area: 'Twitter::Account').each(&:destroy)
  47. channel = Channel.create!(
  48. area: 'Twitter::Account',
  49. options: {
  50. adapter: 'twitter',
  51. auth: {
  52. consumer_key: consumer_key,
  53. consumer_secret: consumer_secret,
  54. oauth_token: system_token,
  55. oauth_token_secret: system_token_secret,
  56. },
  57. user: {
  58. screen_name: system_login,
  59. id: system_id,
  60. },
  61. sync: {
  62. track_retweets: true,
  63. search: [
  64. {
  65. term: hash_tag2,
  66. group_id: group.id,
  67. },
  68. {
  69. term: hash_tag1,
  70. group_id: 1,
  71. },
  72. ],
  73. mentions: {
  74. group_id: group.id,
  75. },
  76. direct_messages: {
  77. group_id: group.id,
  78. }
  79. }
  80. },
  81. active: true,
  82. created_by_id: 1,
  83. updated_by_id: 1,
  84. )
  85. test 'a new outbound and reply' do
  86. hash = "#{hash_tag2}#{rand(999_999)}"
  87. user = User.find(2)
  88. text = "Today the weather is really #{rand_word}... #{hash}"
  89. ticket = Ticket.create!(
  90. title: text[0, 40],
  91. customer_id: user.id,
  92. group_id: group.id,
  93. state: Ticket::State.find_by(name: 'new'),
  94. priority: Ticket::Priority.find_by(name: '2 normal'),
  95. preferences: {
  96. channel_id: channel.id,
  97. },
  98. updated_by_id: 1,
  99. created_by_id: 1,
  100. )
  101. assert(ticket, "outbound ticket created, text: #{text}")
  102. article = Ticket::Article.create!(
  103. ticket_id: ticket.id,
  104. body: text,
  105. type: Ticket::Article::Type.find_by(name: 'twitter status'),
  106. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  107. internal: false,
  108. updated_by_id: 1,
  109. created_by_id: 1,
  110. )
  111. Scheduler.worker(true)
  112. article = Ticket::Article.find(article.id)
  113. assert(article, "outbound article created, text: #{text}")
  114. assert_equal(system_login, article.from, 'ticket article from')
  115. assert_equal('', article.to, 'ticket article to')
  116. ticket = Ticket.find(article.ticket_id)
  117. ticket.state = Ticket::State.find_by(name: 'closed')
  118. ticket.save!
  119. # reply by me_bauer
  120. client = Twitter::REST::Client.new do |config|
  121. config.consumer_key = consumer_key
  122. config.consumer_secret = consumer_secret
  123. config.access_token = customer_token
  124. config.access_token_secret = customer_token_secret
  125. end
  126. tweet_found = false
  127. client.user_timeline(system_login_without_at).each do |tweet|
  128. next if tweet.id.to_s != article.message_id.to_s
  129. tweet_found = true
  130. break
  131. end
  132. assert(tweet_found, "found outbound '#{text}' tweet '#{article.message_id}'")
  133. reply_text = "#{system_login} on my side the weather is nice, too! ๐Ÿ˜๐Ÿ˜๐Ÿ˜ #weather#{rand(999_999)}"
  134. tweet = client.update(
  135. reply_text,
  136. {
  137. in_reply_to_status_id: article.message_id
  138. }
  139. )
  140. # fetch check system account
  141. sleep 10
  142. article = nil
  143. 2.times do
  144. Channel.fetch
  145. # check if follow up article has been created
  146. article = Ticket::Article.find_by(message_id: tweet.id)
  147. break if article
  148. sleep 10
  149. end
  150. assert(article, "article tweet '#{tweet.id}' imported")
  151. assert_equal(customer_login, article.from, 'ticket article from')
  152. assert_equal(system_login, article.to, 'ticket article to')
  153. assert_equal(tweet.id.to_s, article.message_id, 'ticket article inbound message_id')
  154. assert_equal(2, article.ticket.articles.count, 'ticket article inbound count')
  155. assert_equal(reply_text.utf8_to_3bytesutf8, ticket.articles.last.body, 'ticket article inbound body')
  156. assert_equal('open', ticket.reload.state.name)
  157. channel = Channel.find(channel.id)
  158. assert_equal('', channel.last_log_out)
  159. assert_equal('ok', channel.status_out)
  160. assert_equal('', channel.last_log_in)
  161. assert_equal('ok', channel.status_in)
  162. end
  163. test 'b new inbound and reply' do
  164. # new tweet by me_bauer
  165. client = Twitter::REST::Client.new do |config|
  166. config.consumer_key = consumer_key
  167. config.consumer_secret = consumer_secret
  168. config.access_token = customer_token
  169. config.access_token_secret = customer_token_secret
  170. end
  171. hash = "#{hash_tag1} ##{hash_gen}"
  172. text = "Today #{rand_word}... #{hash}"
  173. tweet = client.update(
  174. text,
  175. )
  176. # fetch check system account
  177. sleep 20
  178. article = nil
  179. 2.times do
  180. Channel.fetch
  181. # check if ticket and article has been created
  182. article = Ticket::Article.find_by(message_id: tweet.id)
  183. break if article
  184. sleep 20
  185. end
  186. assert(article, "Can't find tweet id #{tweet.id}/#{text}")
  187. assert_equal(customer_login, article.from, 'ticket article from')
  188. assert_nil(article.to, 'ticket article to')
  189. ticket = article.ticket
  190. assert_equal('new', ticket.reload.state.name)
  191. # send reply
  192. reply_text = "#{customer_login} on my side #weather#{hash_gen}"
  193. article = Ticket::Article.create!(
  194. ticket_id: ticket.id,
  195. body: reply_text,
  196. type: Ticket::Article::Type.find_by(name: 'twitter status'),
  197. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  198. internal: false,
  199. updated_by_id: 1,
  200. created_by_id: 1,
  201. )
  202. Scheduler.worker(true)
  203. assert_equal('open', ticket.reload.state.name)
  204. article = Ticket::Article.find(article.id)
  205. assert(article, "outbound article created, text: #{reply_text}")
  206. assert_equal(system_login, article.from, 'ticket article from')
  207. assert_equal(customer_login, article.to, 'ticket article to')
  208. sleep 5
  209. tweet_found = false
  210. client.user_timeline(system_login_without_at).each do |local_tweet|
  211. sleep 10
  212. next if local_tweet.id.to_s != article.message_id.to_s
  213. tweet_found = true
  214. break
  215. end
  216. assert(tweet_found, "found outbound '#{reply_text}' tweet '#{article.message_id}'")
  217. channel = Channel.find(channel.id)
  218. assert_equal('', channel.last_log_out)
  219. assert_equal('ok', channel.status_out)
  220. assert_equal('', channel.last_log_in)
  221. assert_equal('ok', channel.status_in)
  222. ticket = Ticket.find(article.ticket_id)
  223. ticket.state = Ticket::State.find_by(name: 'closed')
  224. ticket.save!
  225. # reply with zammad user directly
  226. client = Twitter::REST::Client.new do |config|
  227. config.consumer_key = consumer_key
  228. config.consumer_secret = consumer_secret
  229. config.access_token = system_token
  230. config.access_token_secret = system_token_secret
  231. end
  232. hash = "#{hash_tag1} ##{hash_gen}"
  233. text = "Today #{system_login} #{rand_word}... #{hash}"
  234. tweet = client.update(
  235. text,
  236. )
  237. # fetch check system account
  238. sleep 20
  239. article = nil
  240. 2.times do
  241. Channel.fetch
  242. # check if ticket and article has been created
  243. article = Ticket::Article.find_by(message_id: tweet.id)
  244. break if article
  245. sleep 20
  246. end
  247. assert(article, "Can't find tweet id #{tweet.id}/#{text}")
  248. assert_equal('closed', ticket.reload.state.name)
  249. end
  250. test 'c new by direct message inbound' do
  251. # cleanup direct messages of system
  252. client = Twitter::REST::Client.new do |config|
  253. config.consumer_key = consumer_key
  254. config.consumer_secret = consumer_secret
  255. config.access_token = system_token
  256. config.access_token_secret = system_token_secret
  257. end
  258. dms = client.direct_messages(count: 100)
  259. dms.each do |dm|
  260. client.destroy_direct_message(dm.id)
  261. end
  262. client = Twitter::REST::Client.new(
  263. consumer_key: consumer_key,
  264. consumer_secret: consumer_secret,
  265. access_token: customer_token,
  266. access_token_secret: customer_token_secret
  267. )
  268. dms = client.direct_messages(count: 100)
  269. dms.each do |dm|
  270. client.destroy_direct_message(dm.id)
  271. end
  272. hash = "#citheo44 #{hash_gen}"
  273. text = "How about #{rand_word} the details? #{hash} - #{'Long' * 50}"
  274. dm = client.create_direct_message(
  275. system_login_without_at,
  276. text,
  277. )
  278. assert(dm, "dm with ##{hash} created")
  279. # fetch check system account
  280. sleep 15
  281. article = nil
  282. 1.times do
  283. Channel.fetch
  284. # check if ticket and article has been created
  285. article = Ticket::Article.find_by(message_id: dm.id)
  286. break if article
  287. sleep 10
  288. end
  289. assert(article, "inbound article '#{text}' created")
  290. assert_equal(customer_login, article.from, 'ticket article from')
  291. assert_equal(text, article.body, 'ticket article body')
  292. ticket = article.ticket
  293. assert(ticket, 'ticket of inbound article exists')
  294. assert(ticket.articles, 'ticket.articles exists')
  295. assert_equal(1, ticket.articles.count, 'ticket article inbound count')
  296. assert_equal(ticket.state.name, 'new')
  297. # reply via ticket
  298. outbound_article = Ticket::Article.create!(
  299. ticket_id: ticket.id,
  300. to: customer_login,
  301. body: "Will call you later #{rand_word}!",
  302. type: Ticket::Article::Type.find_by(name: 'twitter direct-message'),
  303. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  304. internal: false,
  305. updated_by_id: 1,
  306. created_by_id: 1,
  307. )
  308. Scheduler.worker(true)
  309. outbound_article = Ticket::Article.find(outbound_article.id)
  310. assert(outbound_article, 'outbound article created')
  311. assert_equal(2, outbound_article.ticket.articles.count, 'ticket article outbound count')
  312. assert_equal(system_login, outbound_article.from, 'ticket article from')
  313. assert_equal(customer_login, outbound_article.to, 'ticket article to')
  314. ticket.state = Ticket::State.find_by(name: 'pending reminder')
  315. ticket.save
  316. text = "#{rand_word}. #{hash}"
  317. dm = client.create_direct_message(
  318. system_login_without_at,
  319. text,
  320. )
  321. assert(dm, "second dm with ##{hash} created")
  322. # fetch check system account
  323. sleep 15
  324. article = nil
  325. 1.times do
  326. Channel.fetch
  327. # check if ticket and article has been created
  328. article = Ticket::Article.find_by(message_id: dm.id)
  329. break if article
  330. sleep 10
  331. end
  332. assert(article, "inbound article '#{text}' created")
  333. assert_equal(customer_login, article.from, 'ticket article inbound from')
  334. assert_equal(system_login, article.to, 'ticket article inbound to')
  335. assert_equal(article.ticket.id, ticket.id, 'still the same ticket')
  336. ticket = article.ticket
  337. assert(ticket, 'ticket of inbound article exists')
  338. assert(ticket.articles, 'ticket.articles exists')
  339. assert_equal(3, ticket.articles.count, 'ticket article inbound count')
  340. assert_equal(ticket.state.name, 'open')
  341. # close dm ticket, next dm should open a new
  342. ticket.state = Ticket::State.find_by(name: 'closed')
  343. ticket.save
  344. text = "Thanks #{rand_word} for your call. I just have one question. #{hash}"
  345. dm = client.create_direct_message(
  346. system_login_without_at,
  347. text,
  348. )
  349. assert(dm, "third dm with ##{hash} created")
  350. # fetch check system account
  351. sleep 15
  352. article = nil
  353. 1.times do
  354. Channel.fetch
  355. # check if ticket and article has been created
  356. article = Ticket::Article.find_by(message_id: dm.id)
  357. break if article
  358. sleep 15
  359. end
  360. assert(article, "inbound article '#{text}' created with dm id #{dm.id}")
  361. assert_equal(customer_login, article.from, 'ticket article inbound from')
  362. assert_equal(system_login, article.to, 'ticket article inbound to')
  363. ticket = article.ticket
  364. assert(ticket, 'ticket of inbound article exists')
  365. assert(ticket.articles, 'ticket.articles exists')
  366. assert_equal(1, ticket.articles.count, 'ticket article inbound count')
  367. assert_equal(ticket.state.name, 'new')
  368. channel = Channel.find(channel.id)
  369. assert_equal('', channel.last_log_out)
  370. assert_equal('ok', channel.status_out)
  371. assert_equal('', channel.last_log_in)
  372. assert_equal('ok', channel.status_in)
  373. end
  374. test 'd track_retweets enabled' do
  375. # enable track_retweets
  376. channel[:options]['sync']['track_retweets'] = true
  377. channel.save!
  378. client = Twitter::REST::Client.new do |config|
  379. config.consumer_key = consumer_key
  380. config.consumer_secret = consumer_secret
  381. config.access_token = system_token
  382. config.access_token_secret = system_token_secret
  383. end
  384. hash = "#{hash_tag1} ##{hash_gen}"
  385. text = "Retweet me - I'm #{system_login} - #{rand_word}... #{hash}"
  386. tweet = client.update(text)
  387. client = Twitter::REST::Client.new(
  388. consumer_key: consumer_key,
  389. consumer_secret: consumer_secret,
  390. access_token: customer_token,
  391. access_token_secret: customer_token_secret
  392. )
  393. retweet = client.retweet(tweet).first
  394. # fetch check system account
  395. sleep 15
  396. article = nil
  397. 2.times do
  398. Channel.fetch
  399. # check if ticket and article has been created
  400. article = Ticket::Article.find_by(message_id: retweet.id)
  401. break if article
  402. sleep 10
  403. end
  404. assert(article, "retweet article '#{text}' created")
  405. end
  406. test 'e track_retweets disabled' do
  407. # disable track_retweets
  408. channel[:options]['sync']['track_retweets'] = false
  409. channel.save!
  410. client = Twitter::REST::Client.new do |config|
  411. config.consumer_key = consumer_key
  412. config.consumer_secret = consumer_secret
  413. config.access_token = system_token
  414. config.access_token_secret = system_token_secret
  415. end
  416. hash = "#{hash_tag1} ##{hash_gen}"
  417. text = "Retweet me - I'm #{system_login} - #{rand_word}... #{hash}"
  418. tweet = client.update(text)
  419. client = Twitter::REST::Client.new(
  420. consumer_key: consumer_key,
  421. consumer_secret: consumer_secret,
  422. access_token: customer_token,
  423. access_token_secret: customer_token_secret
  424. )
  425. retweet = client.retweet(tweet).first
  426. # fetch check system account
  427. sleep 15
  428. article = nil
  429. 2.times do
  430. Channel.fetch
  431. # check if ticket and article has been created
  432. article = Ticket::Article.find_by(message_id: retweet.id)
  433. break if article
  434. sleep 10
  435. end
  436. assert_nil(article, "retweet article '#{text}' not created")
  437. end
  438. test 'f streaming test' do
  439. thread = Thread.new do
  440. Channel.stream
  441. end
  442. sleep 10
  443. # new tweet I - by me_bauer
  444. client = Twitter::REST::Client.new do |config|
  445. config.consumer_key = consumer_key
  446. config.consumer_secret = consumer_secret
  447. config.access_token = customer_token
  448. config.access_token_secret = customer_token_secret
  449. end
  450. hash = "#{hash_tag1} ##{hash_gen}"
  451. text = "Today... #{rand_word} #{hash}"
  452. tweet = client.update(
  453. text,
  454. )
  455. article = nil
  456. 5.times do
  457. Scheduler.worker(true)
  458. article = Ticket::Article.find_by(message_id: tweet.id)
  459. break if article
  460. ActiveRecord::Base.clear_all_connections!
  461. ActiveRecord::Base.connection.query_cache.clear
  462. sleep 10
  463. end
  464. assert(article, "article from customer with text '#{text}' message_id '#{tweet.id}' created")
  465. assert_equal(customer_login, article.from, 'ticket article from')
  466. assert_nil(article.to, 'ticket article to')
  467. # new tweet II - by me_bauer
  468. client = Twitter::REST::Client.new do |config|
  469. config.consumer_key = consumer_key
  470. config.consumer_secret = consumer_secret
  471. config.access_token = customer_token
  472. config.access_token_secret = customer_token_secret
  473. end
  474. hash = "#{hash_tag1} ##{rand(999_999)}"
  475. text = "Today... #{rand_word} #{hash}"
  476. tweet = client.update(
  477. text,
  478. )
  479. article = nil
  480. 5.times do
  481. Scheduler.worker(true)
  482. article = Ticket::Article.find_by(message_id: tweet.id)
  483. break if article
  484. ActiveRecord::Base.clear_all_connections!
  485. ActiveRecord::Base.connection.query_cache.clear
  486. sleep 10
  487. end
  488. assert(article, "article from customer with text '#{text}' message_id '#{tweet.id}' created")
  489. assert_equal(customer_login, article.from, 'ticket article from')
  490. assert_nil(article.to, 'ticket article to')
  491. # send reply
  492. reply_text = "RE #{text}"
  493. article = Ticket::Article.create!(
  494. ticket_id: article.ticket_id,
  495. body: reply_text,
  496. type: Ticket::Article::Type.find_by(name: 'twitter status'),
  497. sender: Ticket::Article::Sender.find_by(name: 'Agent'),
  498. internal: false,
  499. updated_by_id: 1,
  500. created_by_id: 1,
  501. )
  502. Scheduler.worker(true)
  503. article = Ticket::Article.find(article.id)
  504. assert(article, "outbound article created, text: #{reply_text}")
  505. assert_equal(system_login, article.from, 'ticket article from')
  506. assert_equal('', article.to, 'ticket article to')
  507. sleep 5
  508. tweet_found = false
  509. client.user_timeline(system_login_without_at).each do |local_tweet|
  510. sleep 10
  511. next if local_tweet.id.to_s != article.message_id.to_s
  512. tweet_found = true
  513. break
  514. end
  515. assert(tweet_found, "found outbound '#{reply_text}' tweet '#{article.message_id}'")
  516. count = Ticket::Article.where(message_id: article.message_id).count
  517. assert_equal(1, count, "tweet #{article.message_id}")
  518. channel_id = article.ticket.preferences[:channel_id]
  519. assert(channel_id)
  520. channel = Channel.find(channel_id)
  521. assert_equal('', channel.last_log_out)
  522. assert_equal('ok', channel.status_out)
  523. # get dm via stream
  524. client = Twitter::REST::Client.new(
  525. consumer_key: consumer_key,
  526. consumer_secret: consumer_secret,
  527. access_token: customer_token,
  528. access_token_secret: customer_token_secret
  529. )
  530. hash = "#citheo44#{rand(999_999)}"
  531. text = "How about the #{rand_word}? #{hash}"
  532. dm = client.create_direct_message(
  533. system_login_without_at,
  534. text,
  535. )
  536. assert(dm, "dm with ##{hash} created")
  537. article = nil
  538. 5.times do
  539. Scheduler.worker(true)
  540. article = Ticket::Article.find_by(message_id: dm.id)
  541. break if article
  542. sleep 10
  543. end
  544. assert(article, "inbound article '#{text}' message_id '#{dm.id}' created")
  545. assert_equal(customer_login, article.from, 'ticket article from')
  546. assert_equal(system_login, article.to, 'ticket article to')
  547. thread.exit
  548. thread.join
  549. end
  550. test 'g streaming test retweet enabled' do
  551. thread = Thread.new do
  552. # enable track_retweets in current thread
  553. # since Threads are not spawned in the same scope
  554. # as the current test is running in .....
  555. channel_thread = Channel.find(channel.id)
  556. channel_thread[:options]['sync']['track_retweets'] = true
  557. channel_thread.save!
  558. Channel.stream
  559. end
  560. sleep 10
  561. client = Twitter::REST::Client.new do |config|
  562. config.consumer_key = consumer_key
  563. config.consumer_secret = consumer_secret
  564. config.access_token = system_token
  565. config.access_token_secret = system_token_secret
  566. end
  567. hash = "#{hash_tag1} ##{hash_gen}"
  568. text = "Retweet me - I'm #{system_login} - #{rand_word}... #{hash}"
  569. tweet = client.update(text)
  570. client = Twitter::REST::Client.new(
  571. consumer_key: consumer_key,
  572. consumer_secret: consumer_secret,
  573. access_token: customer_token,
  574. access_token_secret: customer_token_secret
  575. )
  576. retweet = client.retweet(tweet).first
  577. # fetch check system account
  578. sleep 15
  579. article = nil
  580. 2.times do
  581. Channel.fetch
  582. # check if ticket and article has been created
  583. article = Ticket::Article.find_by(message_id: retweet.id)
  584. break if article
  585. ActiveRecord::Base.clear_all_connections!
  586. ActiveRecord::Base.connection.query_cache.clear
  587. sleep 10
  588. end
  589. assert(article, "retweet article '#{text}' created")
  590. thread.exit
  591. thread.join
  592. end
  593. test 'h streaming test retweet disabled' do
  594. thread = Thread.new do
  595. # disable track_retweets in current thread
  596. # since Threads are not spawned in the same scope
  597. # as the current test is running in .....
  598. channel_thread = Channel.find(channel.id)
  599. channel_thread[:options]['sync']['track_retweets'] = false
  600. channel_thread.save!
  601. Channel.stream
  602. end
  603. sleep 10
  604. client = Twitter::REST::Client.new do |config|
  605. config.consumer_key = consumer_key
  606. config.consumer_secret = consumer_secret
  607. config.access_token = system_token
  608. config.access_token_secret = system_token_secret
  609. end
  610. hash = "#{hash_tag1} ##{hash_gen}"
  611. text = "Retweet me - I'm #{system_login} - #{rand_word}... #{hash}"
  612. tweet = client.update(text)
  613. client = Twitter::REST::Client.new(
  614. consumer_key: consumer_key,
  615. consumer_secret: consumer_secret,
  616. access_token: customer_token,
  617. access_token_secret: customer_token_secret
  618. )
  619. retweet = client.retweet(tweet).first
  620. # fetch check system account
  621. article = nil
  622. 4.times do
  623. # check if ticket and article has been created
  624. article = Ticket::Article.find_by(message_id: retweet.id)
  625. break if article
  626. sleep 10
  627. end
  628. assert_nil(article, "retweet article '#{text}' not created")
  629. thread.exit
  630. thread.join
  631. end
  632. test 'i restart stream after config of channel has changed' do
  633. hash = "#citheo#{rand(999)}"
  634. thread = Thread.new do
  635. Channel.stream
  636. sleep 10
  637. item = {
  638. term: hash,
  639. group_id: group.id,
  640. }
  641. channel_thread = Channel.find(channel.id)
  642. channel_thread[:options]['sync']['search'].push item
  643. channel_thread.save!
  644. end
  645. sleep 60
  646. # new tweet - by me_bauer
  647. client = Twitter::REST::Client.new do |config|
  648. config.consumer_key = consumer_key
  649. config.consumer_secret = consumer_secret
  650. config.access_token = customer_token
  651. config.access_token_secret = customer_token_secret
  652. end
  653. hash = "#{hash_tag1} ##{hash_gen}"
  654. text = "Today... #{rand_word} #{hash}"
  655. tweet = client.update(
  656. text,
  657. )
  658. article = nil
  659. 5.times do
  660. Scheduler.worker(true)
  661. article = Ticket::Article.find_by(message_id: tweet.id)
  662. break if article
  663. ActiveRecord::Base.clear_all_connections!
  664. ActiveRecord::Base.connection.query_cache.clear
  665. sleep 10
  666. end
  667. assert(article, "article from customer with text '#{text}' message_id '#{tweet.id}' created")
  668. assert_equal(customer_login, article.from, 'ticket article from')
  669. assert_nil(article.to, 'ticket article to')
  670. thread.exit
  671. thread.join
  672. channel_thread = Channel.find(channel.id)
  673. channel_thread[:options]['sync']['search'].pop
  674. channel_thread.save!
  675. end
  676. def hash_gen
  677. rand(999).to_s + (0...10).map { ('a'..'z').to_a[rand(26)] }.join
  678. end
  679. def rand_word
  680. [
  681. 'dog',
  682. 'cat',
  683. 'house',
  684. 'home',
  685. 'yesterday',
  686. 'tomorrow',
  687. 'new york',
  688. 'berlin',
  689. 'coffee script',
  690. 'java script',
  691. 'bob smith',
  692. 'be open',
  693. 'really nice',
  694. 'stay tuned',
  695. 'be a good boy',
  696. 'invent new things',
  697. ].sample
  698. end
  699. end