You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Tests.cs 19 kB

9 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace Discord.Tests
  8. {
  9. //TODO: Tests are massively incomplete and out of date, needing a full rewrite
  10. [TestClass]
  11. public class Tests
  12. {
  13. private const int EventTimeout = 10000; //Max time in milliseconds to wait for an event response from our test actions
  14. private static DiscordClient _hostClient, _targetBot, _observerBot;
  15. private static Server _testServer;
  16. private static Channel _testServerChannel;
  17. private static Random _random;
  18. private static Invite _testServerInvite;
  19. private static TestContext _context;
  20. private static string HostBotToken;
  21. private static string ObserverBotToken;
  22. private static string TargetEmail;
  23. private static string TargetPassword;
  24. public static string RandomText => $"test_{_random.Next()}";
  25. #region Initialization
  26. [ClassInitialize]
  27. public static void Initialize(TestContext testContext)
  28. {
  29. _context = testContext;
  30. HostBotToken = Environment.GetEnvironmentVariable("discord-unit-host_token");
  31. ObserverBotToken = Environment.GetEnvironmentVariable("discord-unit-observer_token");
  32. TargetEmail = Environment.GetEnvironmentVariable("discord-unit-target_email");
  33. TargetPassword = Environment.GetEnvironmentVariable("discord-unit-target_pass");
  34. }
  35. [TestMethod]
  36. [Priority(1)]
  37. public async Task TestInitialize()
  38. {
  39. _context.WriteLine("Initializing.");
  40. _random = new Random();
  41. _hostClient = new DiscordClient();
  42. _targetBot = new DiscordClient();
  43. _observerBot = new DiscordClient();
  44. await _hostClient.Connect(HostBotToken, TokenType.Bot);
  45. await Task.Delay(3000);
  46. //Cleanup existing servers
  47. _hostClient.Servers.Select(x => x.IsOwner ? x.Delete() : x.Leave());
  48. //Create new server and invite the other bots to it
  49. _testServer = await _hostClient.CreateServer("Discord.Net Testing", _hostClient.Regions.First());
  50. await Task.Delay(1000);
  51. Invite invite = await _testServer.CreateInvite(60, 3, false, false);
  52. _testServerInvite = invite;
  53. _context.WriteLine($"Host: {_hostClient.CurrentUser.Name} in {_hostClient.Servers.Count()}");
  54. }
  55. [TestMethod]
  56. [Priority(2)]
  57. public async Task TestTokenLogin_Ready()
  58. {
  59. AssertEvent(
  60. "READY never received",
  61. async () => await _observerBot.Connect(ObserverBotToken, TokenType.Bot),
  62. x => _observerBot.Ready += x,
  63. x => _observerBot.Ready -= x,
  64. null,
  65. true);
  66. _observerBot.Servers.Select(x => x.IsOwner ? x.Delete() : x.Leave());
  67. await (await _observerBot.GetInvite(_testServerInvite.Code)).Accept();
  68. }
  69. [TestMethod]
  70. [Priority(2)]
  71. public void TestReady()
  72. {
  73. AssertEvent(
  74. "READY never received",
  75. async () => await _targetBot.Connect(TargetEmail, TargetPassword),
  76. x => _targetBot.Ready += x,
  77. x => _targetBot.Ready -= x,
  78. null,
  79. true);
  80. _targetBot.Servers.Select(x => x.IsOwner ? x.Delete() : x.Leave());
  81. _testServerChannel = _testServer.DefaultChannel;
  82. }
  83. #endregion
  84. // Servers
  85. #region Server Tests
  86. [TestMethod]
  87. [Priority(3)]
  88. public void TestJoinedServer()
  89. {
  90. AssertEvent<ServerEventArgs>(
  91. "Never Got JoinedServer",
  92. async () => await (await _targetBot.GetInvite(_testServerInvite.Code)).Accept(),
  93. x => _targetBot.JoinedServer += x,
  94. x => _targetBot.JoinedServer -= x);
  95. }
  96. #endregion
  97. #region Channel Tests
  98. //Channels
  99. [TestMethod]
  100. public void TestCreateTextChannel()
  101. => TestCreateChannel(ChannelType.Text);
  102. [TestMethod]
  103. public void TestCreateVoiceChannel()
  104. => TestCreateChannel(ChannelType.Voice);
  105. private void TestCreateChannel(ChannelType type)
  106. {
  107. _context.WriteLine($"Host: {_hostClient.CurrentUser.Name} in {_hostClient.Servers.Count()}");
  108. _context.WriteLine($"Target: {_targetBot.CurrentUser.Name} in {_targetBot.Servers.Count()}");
  109. _context.WriteLine($"Observer: {_observerBot.CurrentUser.Name} in {_observerBot.Servers.Count()}");
  110. Channel channel = null;
  111. string name = $"test_{_random.Next()}";
  112. AssertEvent<ChannelEventArgs>(
  113. "ChannelCreated event never received",
  114. async () => channel = await _testServer.CreateChannel(name, type),
  115. x => _targetBot.ChannelCreated += x,
  116. x => _targetBot.ChannelCreated -= x,
  117. (s, e) => e.Channel.Name == name);
  118. AssertEvent<ChannelEventArgs>(
  119. "ChannelDestroyed event never received",
  120. async () => await channel.Delete(),
  121. x => _targetBot.ChannelDestroyed += x,
  122. x => _targetBot.ChannelDestroyed -= x,
  123. (s, e) => e.Channel.Name == name);
  124. }
  125. [TestMethod]
  126. [ExpectedException(typeof(Net.HttpException))]
  127. public async Task TestCreateChannel_NoName()
  128. {
  129. await _testServer.CreateChannel($"", ChannelType.Text);
  130. }
  131. [TestMethod]
  132. [ExpectedException(typeof(Net.HttpException))]
  133. public async Task TestCreateChannel_NoType()
  134. {
  135. string name = $"#test_{_random.Next()}";
  136. await _testServer.CreateChannel($"", ChannelType.FromString(""));
  137. }
  138. [TestMethod]
  139. [ExpectedException(typeof(Net.HttpException))]
  140. public async Task TestCreateChannel_BadType()
  141. {
  142. string name = $"#test_{_random.Next()}";
  143. await _testServer.CreateChannel($"", ChannelType.FromString("badtype"));
  144. }
  145. [TestMethod]
  146. public async Task Test_CreateGetChannel()
  147. {
  148. var name = $"test_{_random.Next()}";
  149. var channel = await _testServer.CreateChannel(name, ChannelType.Text);
  150. var get_channel = _testServer.GetChannel(channel.Id);
  151. Assert.AreEqual(channel.Id, get_channel.Id, "ID of Channel and GetChannel were not equal.");
  152. }
  153. [TestMethod]
  154. public void TestSendTyping()
  155. {
  156. var channel = _testServerChannel;
  157. AssertEvent<ChannelUserEventArgs>(
  158. "UserUpdated event never fired.",
  159. async () => await channel.SendIsTyping(),
  160. x => _targetBot.UserIsTyping += x,
  161. x => _targetBot.UserIsTyping -= x);
  162. }
  163. [TestMethod]
  164. public void TestEditChannel()
  165. {
  166. var channel = _testServerChannel;
  167. AssertEvent<ChannelUpdatedEventArgs>(
  168. "ChannelUpdated Never Received",
  169. async () => await channel.Edit(RandomText, $"topic - {RandomText}", 26),
  170. x => _targetBot.ChannelUpdated += x,
  171. x => _targetBot.ChannelUpdated -= x);
  172. }
  173. [TestMethod]
  174. public void TestChannelMention()
  175. {
  176. var channel = _testServerChannel;
  177. Assert.AreEqual($"<#{channel.Id}>", channel.Mention, "Generated channel mention was not the expected channel mention.");
  178. }
  179. [TestMethod]
  180. public void TestChannelUserCount()
  181. {
  182. Assert.AreEqual(3, _testServerChannel.Users.Count(), "Read an incorrect number of users in a channel");
  183. }
  184. #endregion
  185. #region Message Tests
  186. //Messages
  187. [TestMethod]
  188. public void TestMessageEvents()
  189. {
  190. string name = $"test_{_random.Next()}";
  191. var channel = _testServer.CreateChannel(name, ChannelType.Text).Result;
  192. _context.WriteLine($"Channel Name: {channel.Name} / {channel.Server.Name}");
  193. string text = $"test_{_random.Next()}";
  194. Message message = null;
  195. AssertEvent<MessageEventArgs>(
  196. "MessageCreated event never received",
  197. async () => message = await channel.SendMessage(text),
  198. x => _targetBot.MessageReceived += x,
  199. x => _targetBot.MessageReceived -= x,
  200. (s, e) => e.Message.Text == text);
  201. AssertEvent<MessageUpdatedEventArgs>(
  202. "MessageUpdated event never received",
  203. async () => await message.Edit(text + " updated"),
  204. x => _targetBot.MessageUpdated += x,
  205. x => _targetBot.MessageUpdated -= x,
  206. (s, e) => e.Before.Text == text && e.After.Text == text + " updated");
  207. AssertEvent<MessageEventArgs>(
  208. "MessageDeleted event never received",
  209. async () => await message.Delete(),
  210. x => _targetBot.MessageDeleted += x,
  211. x => _targetBot.MessageDeleted -= x,
  212. (s, e) => e.Message.Id == message.Id);
  213. }
  214. [TestMethod]
  215. public async Task TestDownloadMessages_WithCache()
  216. {
  217. string name = $"test_{_random.Next()}";
  218. var channel = await _testServer.CreateChannel(name, ChannelType.Text);
  219. for (var i = 0; i < 10; i++) await channel.SendMessage(RandomText);
  220. while (channel.Client.MessageQueue.Count > 0) await Task.Delay(100);
  221. var messages = await channel.DownloadMessages(10);
  222. Assert.AreEqual(10, messages.Count(), "Expected 10 messages in downloaded array, did not see 10.");
  223. }
  224. [TestMethod]
  225. public async Task TestDownloadMessages_WithoutCache()
  226. {
  227. string name = $"test_{_random.Next()}";
  228. var channel = await _testServer.CreateChannel(name, ChannelType.Text);
  229. for (var i = 0; i < 10; i++) await channel.SendMessage(RandomText);
  230. while (channel.Client.MessageQueue.Count > 0) await Task.Delay(100);
  231. var messages = await channel.DownloadMessages(10, useCache: false);
  232. Assert.AreEqual(10, messages.Count(), "Expected 10 messages in downloaded array, did not see 10.");
  233. }
  234. [TestMethod]
  235. public async Task TestSendTTSMessage()
  236. {
  237. var channel = await _testServer.CreateChannel(RandomText, ChannelType.Text);
  238. AssertEvent<MessageEventArgs>(
  239. "MessageCreated event never fired",
  240. async () => await channel.SendTTSMessage(RandomText),
  241. x => _targetBot.MessageReceived += x,
  242. x => _targetBot.MessageReceived -= x,
  243. (s, e) => e.Message.IsTTS);
  244. }
  245. #endregion
  246. #region User Tests
  247. [TestMethod]
  248. public void TestUserMentions()
  249. {
  250. var user = _targetBot.GetServer(_testServer.Id).CurrentUser;
  251. Assert.AreEqual($"<@{user.Id}>", user.Mention);
  252. }
  253. [TestMethod]
  254. public void TestUserEdit()
  255. {
  256. var user = _testServer.GetUser(_targetBot.CurrentUser.Id);
  257. AssertEvent<UserUpdatedEventArgs>(
  258. "UserUpdated never fired",
  259. async () => await user.Edit(true, true, null, null),
  260. x => _targetBot.UserUpdated += x,
  261. x => _targetBot.UserUpdated -= x);
  262. }
  263. [TestMethod]
  264. public void TestEditSelf()
  265. {
  266. var name = $"test_{_random.Next()}";
  267. AssertEvent<UserUpdatedEventArgs>(
  268. "UserUpdated never fired",
  269. async () => await _targetBot.CurrentUser.Edit(TargetPassword, name),
  270. x => _observerBot.UserUpdated += x,
  271. x => _observerBot.UserUpdated -= x,
  272. (s, e) => e.After.Name == name);
  273. }
  274. [TestMethod]
  275. public void TestSetStatus()
  276. {
  277. AssertEvent<UserUpdatedEventArgs>(
  278. "UserUpdated never fired",
  279. async () => await SetStatus(_targetBot, UserStatus.Idle),
  280. x => _observerBot.UserUpdated += x,
  281. x => _observerBot.UserUpdated -= x,
  282. (s, e) => e.After.Status == UserStatus.Idle);
  283. }
  284. private async Task SetStatus(DiscordClient _client, UserStatus status)
  285. {
  286. _client.SetStatus(status);
  287. await Task.Delay(50);
  288. }
  289. [TestMethod]
  290. public void TestSetGame()
  291. {
  292. AssertEvent<UserUpdatedEventArgs>(
  293. "UserUpdated never fired",
  294. async () => await SetGame(_targetBot, "test game"),
  295. x => _observerBot.UserUpdated += x,
  296. x => _observerBot.UserUpdated -= x,
  297. (s, e) => _targetBot.CurrentGame.Name == "test game");
  298. }
  299. private async Task SetGame(DiscordClient _client, string game)
  300. {
  301. _client.SetGame(game);
  302. await Task.Delay(5);
  303. }
  304. #endregion
  305. #region Permission Tests
  306. // Permissions
  307. [TestMethod]
  308. public async Task Test_AddGet_PermissionsRule()
  309. {
  310. var channel = await _testServer.CreateChannel($"test_{_random.Next()}", ChannelType.Text);
  311. var user = _testServer.GetUser(_targetBot.CurrentUser.Id);
  312. var perms = new ChannelPermissionOverrides(sendMessages: PermValue.Deny);
  313. await channel.AddPermissionsRule(user, perms);
  314. var resultPerms = channel.GetPermissionsRule(user);
  315. Assert.IsNotNull(resultPerms, "Perms retrieved from server were null.");
  316. }
  317. [TestMethod]
  318. public async Task Test_AddRemove_PermissionsRule()
  319. {
  320. var channel = await _testServer.CreateChannel($"test_{_random.Next()}", ChannelType.Text);
  321. var user = _testServer.GetUser(_targetBot.CurrentUser.Id);
  322. var perms = new ChannelPermissionOverrides(sendMessages: PermValue.Deny);
  323. await channel.AddPermissionsRule(user, perms);
  324. await channel.RemovePermissionsRule(user);
  325. await Task.Delay(200);
  326. Assert.AreEqual(PermValue.Inherit, channel.GetPermissionsRule(user).SendMessages);
  327. }
  328. [TestMethod]
  329. public async Task Test_Permissions_Event()
  330. {
  331. var channel = await _testServer.CreateChannel($"test_{_random.Next()}", ChannelType.Text);
  332. var user = _testServer.GetUser(_targetBot.CurrentUser.Id);
  333. var perms = new ChannelPermissionOverrides(sendMessages: PermValue.Deny);
  334. AssertEvent<ChannelUpdatedEventArgs>
  335. ("ChannelUpdatedEvent never fired.",
  336. async () => await channel.AddPermissionsRule(user, perms),
  337. x => _targetBot.ChannelUpdated += x,
  338. x => _targetBot.ChannelUpdated -= x,
  339. (s, e) => e.After.PermissionOverwrites.Count() != e.Before.PermissionOverwrites.Count());
  340. }
  341. [TestMethod]
  342. [ExpectedException(typeof(Net.HttpException))]
  343. public async Task Test_Affect_Permissions_Invalid_Channel()
  344. {
  345. var channel = await _testServer.CreateChannel($"test_{_random.Next()}", ChannelType.Text);
  346. var user = _testServer.GetUser(_targetBot.CurrentUser.Id);
  347. var perms = new ChannelPermissionOverrides(sendMessages: PermValue.Deny);
  348. await channel.Delete();
  349. await channel.AddPermissionsRule(user, perms);
  350. }
  351. #endregion
  352. [ClassCleanup]
  353. public static void Cleanup()
  354. {
  355. WaitMany(
  356. _hostClient.State == ConnectionState.Connected ? _hostClient.Servers.Select(x => x.IsOwner ? x.Delete() : x.Leave()) : null,
  357. _targetBot.State == ConnectionState.Connected ? _targetBot.Servers.Select(x => x.IsOwner ? x.Delete() : x.Leave()) : null,
  358. _observerBot.State == ConnectionState.Connected ? _observerBot.Servers.Select(x => x.IsOwner ? x.Delete() : x.Leave()) : null);
  359. WaitAll(
  360. _hostClient.Disconnect(),
  361. _targetBot.Disconnect(),
  362. _observerBot.Disconnect());
  363. }
  364. #region Helpers
  365. // Task Helpers
  366. private static void AssertEvent<TArgs>(string msg, Func<Task> action, Action<EventHandler<TArgs>> addEvent, Action<EventHandler<TArgs>> removeEvent, Func<object, TArgs, bool> test = null)
  367. {
  368. AssertEvent(msg, action, addEvent, removeEvent, test, true);
  369. }
  370. private static void AssertNoEvent<TArgs>(string msg, Func<Task> action, Action<EventHandler<TArgs>> addEvent, Action<EventHandler<TArgs>> removeEvent, Func<object, TArgs, bool> test = null)
  371. {
  372. AssertEvent(msg, action, addEvent, removeEvent, test, false);
  373. }
  374. private static void AssertEvent<TArgs>(string msg, Func<Task> action, Action<EventHandler<TArgs>> addEvent, Action<EventHandler<TArgs>> removeEvent, Func<object, TArgs, bool> test, bool assertTrue)
  375. {
  376. ManualResetEventSlim trigger = new ManualResetEventSlim(false);
  377. bool result = false;
  378. EventHandler<TArgs> handler = (s, e) =>
  379. {
  380. if (test != null)
  381. {
  382. result |= test(s, e);
  383. trigger.Set();
  384. }
  385. else
  386. result = true;
  387. };
  388. addEvent(handler);
  389. var task = action();
  390. trigger.Wait(EventTimeout);
  391. task.Wait();
  392. removeEvent(handler);
  393. Assert.AreEqual(assertTrue, result, msg);
  394. }
  395. private static void AssertEvent(string msg, Func<Task> action, Action<EventHandler> addEvent, Action<EventHandler> removeEvent, Func<object, bool> test, bool assertTrue)
  396. {
  397. ManualResetEventSlim trigger = new ManualResetEventSlim(false);
  398. bool result = false;
  399. EventHandler handler = (s, e) =>
  400. {
  401. if (test != null)
  402. {
  403. result |= test(s);
  404. trigger.Set();
  405. }
  406. else
  407. result = true;
  408. };
  409. addEvent(handler);
  410. var task = action();
  411. trigger.Wait(EventTimeout);
  412. task.Wait();
  413. removeEvent(handler);
  414. Assert.AreEqual(assertTrue, result, msg);
  415. }
  416. private static void WaitAll(params Task[] tasks)
  417. {
  418. Task.WaitAll(tasks);
  419. }
  420. private static void WaitAll(IEnumerable<Task> tasks)
  421. {
  422. Task.WaitAll(tasks.ToArray());
  423. }
  424. private static void WaitMany(params IEnumerable<Task>[] tasks)
  425. {
  426. Task.WaitAll(tasks.Where(x => x != null).SelectMany(x => x).ToArray());
  427. }
  428. #endregion
  429. }
  430. }