twitter_test.rb 23 KB

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