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 18 KiB

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