PageRenderTime 23ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/TwitterFeedApplication/TwitterFeedManager.Tests/TwitterFeedEngineTests.cs

https://bitbucket.org/nesanpather/twitterfeedrepo
C# | 478 lines | 424 code | 45 blank | 9 comment | 0 complexity | 237226b4f1e92b5fb3c5a43c48ac6897 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using DataManager.Interfaces;
  5. using NSubstitute;
  6. using NUnit.Framework;
  7. using TwitterFeedManager.Interfaces;
  8. using TwitterFeedModels;
  9. namespace TwitterFeedManager.Tests
  10. {
  11. [TestFixture]
  12. public class TwitterFeedEngineTests
  13. {
  14. [Test]
  15. public async Task GetTwitterFeedAsync_Given_ValidInput1_ValidInput2_3Users_3Tweets_Returns_ValidIEnumerableTwitterFeed_Count2()
  16. {
  17. // Arrange.
  18. var dataManager = Substitute.For<IDataManager>();
  19. var twitterUsersBuilder = Substitute.For<ITwitterUsersBuilder>();
  20. var twitterFeedBuilder = Substitute.For<ITweetBuilder>();
  21. dataManager.GetTwitterUsersAsync(Arg.Any<string>())
  22. .Returns(info => Task.FromResult<IEnumerable<TwitterUser>>(
  23. new List<TwitterUser>
  24. {
  25. new TwitterUser
  26. {
  27. User = new User {UserName = "Ward"},
  28. Followers = new List<User>
  29. {
  30. new User {UserName = "Alan"}
  31. }
  32. },
  33. new TwitterUser
  34. {
  35. User = new User {UserName = "Alan"},
  36. Followers = new List<User>
  37. {
  38. new User {UserName = "Martin"}
  39. }
  40. },
  41. new TwitterUser
  42. {
  43. User = new User {UserName = "Ward"},
  44. Followers = new List<User>
  45. {
  46. new User {UserName = "Martin"},
  47. new User {UserName = "Alan"}
  48. }
  49. }
  50. }));
  51. dataManager.GetTweetsAsync(Arg.Any<string>())
  52. .Returns(info => Task.FromResult<IEnumerable<Tweet>>(new List<Tweet>
  53. {
  54. new Tweet
  55. {
  56. Id = 1,
  57. TwitterUser = new User {UserName = "Alan"},
  58. Message = "If you have a procedure with 10 parameters, you probably missed some."
  59. },
  60. new Tweet
  61. {
  62. Id = 2,
  63. TwitterUser = new User {UserName = "Ward"},
  64. Message = "There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors."
  65. },
  66. new Tweet
  67. {
  68. Id = 3,
  69. TwitterUser = new User {UserName = "Alan"},
  70. Message = "Random numbers should not be generated with a method chosen at random."
  71. }
  72. }));
  73. twitterUsersBuilder.UnionDuplicateUsers(Arg.Any<IEnumerable<TwitterUser>>())
  74. .Returns(info => new List<TwitterUser>
  75. {
  76. new TwitterUser
  77. {
  78. User = new User {UserName = "Ward"},
  79. Followers = new List<User>
  80. {
  81. new User {UserName = "Alan"},
  82. new User {UserName = "Martin"}
  83. }
  84. },
  85. new TwitterUser
  86. {
  87. User = new User {UserName = "Alan"},
  88. Followers = new List<User>
  89. {
  90. new User {UserName = "Martin"}
  91. }
  92. }
  93. });
  94. twitterUsersBuilder.SortUsers(Arg.Any<IEnumerable<TwitterUser>>())
  95. .Returns(info => new List<TwitterUser>
  96. {
  97. new TwitterUser
  98. {
  99. User = new User {UserName = "Alan"},
  100. Followers = new List<User>
  101. {
  102. new User {UserName = "Martin"}
  103. }
  104. },
  105. new TwitterUser
  106. {
  107. User = new User {UserName = "Ward"},
  108. Followers = new List<User>
  109. {
  110. new User {UserName = "Alan"},
  111. new User {UserName = "Martin"}
  112. }
  113. }
  114. });
  115. twitterUsersBuilder.SortFollowers(Arg.Any<IEnumerable<TwitterUser>>())
  116. .Returns(info => new List<TwitterUser>
  117. {
  118. new TwitterUser
  119. {
  120. User = new User {UserName = "Alan"},
  121. Followers = new List<User>
  122. {
  123. new User {UserName = "Martin"}
  124. }
  125. },
  126. new TwitterUser
  127. {
  128. User = new User {UserName = "Ward"},
  129. Followers = new List<User>
  130. {
  131. new User {UserName = "Alan"},
  132. new User {UserName = "Martin"}
  133. }
  134. }
  135. });
  136. twitterFeedBuilder.SortTweets(Arg.Any<IEnumerable<TwitterFeed>>()).Returns(info => new List<TwitterFeed>
  137. {
  138. new TwitterFeed
  139. {
  140. User = new User {UserName = "Alan"},
  141. Followers = new List<User>
  142. {
  143. new User {UserName = "Martin"}
  144. },
  145. Tweets = new List<Tweet>
  146. {
  147. new Tweet
  148. {
  149. Id = 1,
  150. TwitterUser = new User {UserName = "Alan"},
  151. Message = "If you have a procedure with 10 parameters, you probably missed some."
  152. },
  153. new Tweet
  154. {
  155. Id = 3,
  156. TwitterUser = new User {UserName = "Alan"},
  157. Message = "Random numbers should not be generated with a method chosen at random."
  158. }
  159. }
  160. },
  161. new TwitterFeed
  162. {
  163. User = new User {UserName = "Ward"},
  164. Followers = new List<User>
  165. {
  166. new User {UserName = "Alan"},
  167. new User {UserName = "Martin"}
  168. },
  169. Tweets = new List<Tweet>
  170. {
  171. new Tweet
  172. {
  173. Id = 1,
  174. TwitterUser = new User {UserName = "Alan"},
  175. Message = "If you have a procedure with 10 parameters, you probably missed some."
  176. },
  177. new Tweet
  178. {
  179. Id = 2,
  180. TwitterUser = new User {UserName = "Ward"},
  181. Message = "There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors."
  182. },
  183. new Tweet
  184. {
  185. Id = 3,
  186. TwitterUser = new User {UserName = "Alan"},
  187. Message = "Random numbers should not be generated with a method chosen at random."
  188. }
  189. }
  190. }
  191. });
  192. var twitterFeedEngine = new TwitterFeedEngine(dataManager, twitterUsersBuilder, twitterFeedBuilder);
  193. // Act.
  194. var actual = await twitterFeedEngine.GetTwitterFeedAsync("test1.txt", "test2.txt");
  195. // Assert.
  196. var twitterFeeds = actual as IList<TwitterFeed> ?? actual.ToList();
  197. Assert.AreEqual(2, twitterFeeds.Count);
  198. Assert.AreEqual("Alan", twitterFeeds.ToList()[0].User.UserName);
  199. Assert.AreEqual("Alan", twitterFeeds.ToList()[0].Tweets.ToList()[0].TwitterUser.UserName);
  200. Assert.AreEqual("If you have a procedure with 10 parameters, you probably missed some.", twitterFeeds.ToList()[0].Tweets.ToList()[0].Message);
  201. Assert.AreEqual("Alan", twitterFeeds.ToList()[0].Tweets.ToList()[1].TwitterUser.UserName);
  202. Assert.AreEqual("Random numbers should not be generated with a method chosen at random.", twitterFeeds.ToList()[0].Tweets.ToList()[1].Message);
  203. Assert.AreEqual("Martin", twitterFeeds.ToList()[0].Followers.ToList()[0].UserName);
  204. Assert.AreEqual("Ward", twitterFeeds.ToList()[1].User.UserName);
  205. Assert.AreEqual("Alan", twitterFeeds.ToList()[1].Tweets.ToList()[0].TwitterUser.UserName);
  206. Assert.AreEqual("If you have a procedure with 10 parameters, you probably missed some.", twitterFeeds.ToList()[1].Tweets.ToList()[0].Message);
  207. Assert.AreEqual("Ward", twitterFeeds.ToList()[1].Tweets.ToList()[1].TwitterUser.UserName);
  208. Assert.AreEqual("There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors.", twitterFeeds.ToList()[1].Tweets.ToList()[1].Message);
  209. Assert.AreEqual("Alan", twitterFeeds.ToList()[1].Tweets.ToList()[2].TwitterUser.UserName);
  210. Assert.AreEqual("Random numbers should not be generated with a method chosen at random.", twitterFeeds.ToList()[1].Tweets.ToList()[2].Message);
  211. Assert.AreEqual("Alan", twitterFeeds.ToList()[1].Followers.ToList()[0].UserName);
  212. Assert.AreEqual("Martin", twitterFeeds.ToList()[1].Followers.ToList()[1].UserName);
  213. }
  214. [Test]
  215. public async Task GetTwitterFeedAsync_Given_ValidInput1_ValidInput2_1User1Follower_3Tweets_Returns_ValidIEnumerableTwitterFeed_Count1()
  216. {
  217. // Arrange.
  218. var dataManager = Substitute.For<IDataManager>();
  219. var twitterUsersBuilder = Substitute.For<ITwitterUsersBuilder>();
  220. var twitterFeedBuilder = Substitute.For<ITweetBuilder>();
  221. dataManager.GetTwitterUsersAsync(Arg.Any<string>())
  222. .Returns(info => Task.FromResult<IEnumerable<TwitterUser>>(
  223. new List<TwitterUser>
  224. {
  225. new TwitterUser
  226. {
  227. User = new User {UserName = "Ward"},
  228. Followers = new List<User>
  229. {
  230. new User {UserName = "Alan"}
  231. }
  232. }
  233. }));
  234. dataManager.GetTweetsAsync(Arg.Any<string>())
  235. .Returns(info => Task.FromResult<IEnumerable<Tweet>>(new List<Tweet>
  236. {
  237. new Tweet
  238. {
  239. Id = 1,
  240. TwitterUser = new User {UserName = "Alan"},
  241. Message = "If you have a procedure with 10 parameters, you probably missed some."
  242. },
  243. new Tweet
  244. {
  245. Id = 2,
  246. TwitterUser = new User {UserName = "Ward"},
  247. Message = "There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors."
  248. },
  249. new Tweet
  250. {
  251. Id = 3,
  252. TwitterUser = new User {UserName = "Alan"},
  253. Message = "Random numbers should not be generated with a method chosen at random."
  254. }
  255. }));
  256. twitterUsersBuilder.UnionDuplicateUsers(Arg.Any<IEnumerable<TwitterUser>>())
  257. .Returns(info => new List<TwitterUser>
  258. {
  259. new TwitterUser
  260. {
  261. User = new User {UserName = "Ward"},
  262. Followers = new List<User>
  263. {
  264. new User {UserName = "Alan"}
  265. }
  266. }
  267. });
  268. twitterUsersBuilder.SortUsers(Arg.Any<IEnumerable<TwitterUser>>())
  269. .Returns(info => new List<TwitterUser>
  270. {
  271. new TwitterUser
  272. {
  273. User = new User {UserName = "Ward"},
  274. Followers = new List<User>
  275. {
  276. new User {UserName = "Alan"}
  277. }
  278. }
  279. });
  280. twitterUsersBuilder.SortFollowers(Arg.Any<IEnumerable<TwitterUser>>())
  281. .Returns(info => new List<TwitterUser>
  282. {
  283. new TwitterUser
  284. {
  285. User = new User {UserName = "Ward"},
  286. Followers = new List<User>
  287. {
  288. new User {UserName = "Alan"}
  289. }
  290. }
  291. });
  292. twitterFeedBuilder.SortTweets(Arg.Any<IEnumerable<TwitterFeed>>()).Returns(info => new List<TwitterFeed>
  293. {
  294. new TwitterFeed
  295. {
  296. User = new User {UserName = "Ward"},
  297. Followers = new List<User>
  298. {
  299. new User {UserName = "Alan"}
  300. },
  301. Tweets = new List<Tweet>
  302. {
  303. new Tweet
  304. {
  305. Id = 1,
  306. TwitterUser = new User {UserName = "Alan"},
  307. Message = "If you have a procedure with 10 parameters, you probably missed some."
  308. },
  309. new Tweet
  310. {
  311. Id = 2,
  312. TwitterUser = new User {UserName = "Ward"},
  313. Message = "There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors."
  314. },
  315. new Tweet
  316. {
  317. Id = 3,
  318. TwitterUser = new User {UserName = "Alan"},
  319. Message = "Random numbers should not be generated with a method chosen at random."
  320. }
  321. }
  322. }
  323. });
  324. var twitterFeedEngine = new TwitterFeedEngine(dataManager, twitterUsersBuilder, twitterFeedBuilder);
  325. // Act.
  326. var actual = await twitterFeedEngine.GetTwitterFeedAsync("test1.txt", "test2.txt");
  327. // Assert.
  328. var twitterFeeds = actual as IList<TwitterFeed> ?? actual.ToList();
  329. Assert.AreEqual(1, twitterFeeds.Count);
  330. Assert.AreEqual("Ward", twitterFeeds.ToList()[0].User.UserName);
  331. Assert.AreEqual("Alan", twitterFeeds.ToList()[0].Tweets.ToList()[0].TwitterUser.UserName);
  332. Assert.AreEqual("If you have a procedure with 10 parameters, you probably missed some.", twitterFeeds.ToList()[0].Tweets.ToList()[0].Message);
  333. Assert.AreEqual("Ward", twitterFeeds.ToList()[0].Tweets.ToList()[1].TwitterUser.UserName);
  334. Assert.AreEqual("There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors.", twitterFeeds.ToList()[0].Tweets.ToList()[1].Message);
  335. Assert.AreEqual("Alan", twitterFeeds.ToList()[0].Tweets.ToList()[2].TwitterUser.UserName);
  336. Assert.AreEqual("Random numbers should not be generated with a method chosen at random.", twitterFeeds.ToList()[0].Tweets.ToList()[2].Message);
  337. Assert.AreEqual("Alan", twitterFeeds.ToList()[0].Followers.ToList()[0].UserName);
  338. }
  339. [Test]
  340. public async Task GetTwitterFeedAsync_Given_ValidInput1_ValidInput2_1User0Follower_3Tweets_Returns_ValidIEnumerableTwitterFeed_Count1_Tweet()
  341. {
  342. // Arrange.
  343. var dataManager = Substitute.For<IDataManager>();
  344. var twitterUsersBuilder = Substitute.For<ITwitterUsersBuilder>();
  345. var twitterFeedBuilder = Substitute.For<ITweetBuilder>();
  346. dataManager.GetTwitterUsersAsync(Arg.Any<string>())
  347. .Returns(info => Task.FromResult<IEnumerable<TwitterUser>>(
  348. new List<TwitterUser>
  349. {
  350. new TwitterUser
  351. {
  352. User = new User {UserName = "Ward"}
  353. }
  354. }));
  355. dataManager.GetTweetsAsync(Arg.Any<string>())
  356. .Returns(info => Task.FromResult<IEnumerable<Tweet>>(new List<Tweet>
  357. {
  358. new Tweet
  359. {
  360. Id = 1,
  361. TwitterUser = new User {UserName = "Alan"},
  362. Message = "If you have a procedure with 10 parameters, you probably missed some."
  363. },
  364. new Tweet
  365. {
  366. Id = 2,
  367. TwitterUser = new User {UserName = "Ward"},
  368. Message = "There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors."
  369. },
  370. new Tweet
  371. {
  372. Id = 3,
  373. TwitterUser = new User {UserName = "Alan"},
  374. Message = "Random numbers should not be generated with a method chosen at random."
  375. }
  376. }));
  377. twitterUsersBuilder.UnionDuplicateUsers(Arg.Any<IEnumerable<TwitterUser>>())
  378. .Returns(info => new List<TwitterUser>
  379. {
  380. new TwitterUser
  381. {
  382. User = new User {UserName = "Ward"},
  383. Followers = new List<User>()
  384. }
  385. });
  386. twitterUsersBuilder.SortUsers(Arg.Any<IEnumerable<TwitterUser>>())
  387. .Returns(info => new List<TwitterUser>
  388. {
  389. new TwitterUser
  390. {
  391. User = new User {UserName = "Ward"},
  392. Followers = new List<User>()
  393. }
  394. });
  395. twitterUsersBuilder.SortFollowers(Arg.Any<IEnumerable<TwitterUser>>())
  396. .Returns(info => new List<TwitterUser>
  397. {
  398. new TwitterUser
  399. {
  400. User = new User {UserName = "Ward"},
  401. Followers = new List<User>()
  402. }
  403. });
  404. twitterFeedBuilder.SortTweets(Arg.Any<IEnumerable<TwitterFeed>>()).Returns(info => new List<TwitterFeed>
  405. {
  406. new TwitterFeed
  407. {
  408. User = new User {UserName = "Ward"},
  409. Followers = new List<User>(),
  410. Tweets = new List<Tweet>
  411. {
  412. new Tweet
  413. {
  414. Id = 2,
  415. TwitterUser = new User {UserName = "Ward"},
  416. Message = "There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors."
  417. }
  418. }
  419. }
  420. });
  421. var twitterFeedEngine = new TwitterFeedEngine(dataManager, twitterUsersBuilder, twitterFeedBuilder);
  422. // Act.
  423. var actual = await twitterFeedEngine.GetTwitterFeedAsync("test1.txt", "test2.txt");
  424. // Assert.
  425. var twitterFeeds = actual as IList<TwitterFeed> ?? actual.ToList();
  426. Assert.AreEqual(1, twitterFeeds.Count);
  427. Assert.AreEqual("Ward", twitterFeeds.ToList()[0].User.UserName);
  428. Assert.AreEqual("Ward", twitterFeeds.ToList()[0].Tweets.ToList()[0].TwitterUser.UserName);
  429. Assert.AreEqual("There are only two hard things in Computer Science: cache invalidation, naming things and off-by-1 errors.", twitterFeeds.ToList()[0].Tweets.ToList()[0].Message);
  430. Assert.AreEqual(0, twitterFeeds.ToList()[0].Followers.Count());
  431. }
  432. }
  433. }