diff --git a/test/Discord.Net.Tests/Settings.cs b/test/Discord.Net.Tests/Settings.cs index 3f26096ee..9c3cc3cc3 100644 --- a/test/Discord.Net.Tests/Settings.cs +++ b/test/Discord.Net.Tests/Settings.cs @@ -6,11 +6,12 @@ namespace Discord.Net.Tests internal class Settings { private const string path = "../../config.json"; - public static Settings Load() + public static readonly Settings Instance; + static Settings() { if (!File.Exists(path)) - throw new FileNotFoundException("config.json is missing, rename config.json.example and add data for two separate unused accounts for testing."); - return JsonConvert.DeserializeObject(File.ReadAllText(path)); + throw new FileNotFoundException("config.json is missing, rename config.json.example and add credentials for three separate unused accounts for testing."); + Instance = JsonConvert.DeserializeObject(File.ReadAllText(path)); } public class Account @@ -25,5 +26,7 @@ namespace Discord.Net.Tests public Account User1 { get; set; } [JsonProperty("user2")] public Account User2 { get; set; } + [JsonProperty("user3")] + public Account User3 { get; set; } } } diff --git a/test/Discord.Net.Tests/Tests.cs b/test/Discord.Net.Tests/Tests.cs index b1899742e..f71f263a1 100644 --- a/test/Discord.Net.Tests/Tests.cs +++ b/test/Discord.Net.Tests/Tests.cs @@ -1,5 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -10,9 +11,8 @@ namespace Discord.Net.Tests public class Tests { private const int EventTimeout = 5000; //Max time in milliseconds to wait for an event response from our test actions - - private static Settings _settings; - private static DiscordClient _bot1, _bot2; + + private static DiscordClient _hostClient, _targetBot, _observerBot; private static Server _testServer; private static Channel _testServerChannel; private static Random _random; @@ -20,76 +20,115 @@ namespace Discord.Net.Tests [ClassInitialize] public static void Initialize(TestContext testContext) { - _settings = Settings.Load(); + var settings = Settings.Instance; _random = new Random(); - _bot1 = new DiscordClient(); - _bot2 = new DiscordClient(); + _hostClient = new DiscordClient(); + _targetBot = new DiscordClient(); + _observerBot = new DiscordClient(); - _bot1.Connect(_settings.User1.Email, _settings.User1.Password).Wait(); - _bot2.Connect(_settings.User2.Email, _settings.User2.Password).Wait(); + _hostClient.Connect(settings.User1.Email, settings.User1.Password).Wait(); + _targetBot.Connect(settings.User2.Email, settings.User2.Password).Wait(); + _observerBot.Connect(settings.User3.Email, settings.User3.Password).Wait(); //Cleanup existing servers - Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); - Task.WaitAll(_bot2.Servers.Select(x => _bot2.LeaveServer(x)).ToArray()); + WaitMany( + _hostClient.Servers.Select(x => _hostClient.LeaveServer(x)), + _targetBot.Servers.Select(x => _targetBot.LeaveServer(x)), + _observerBot.Servers.Select(x => _observerBot.LeaveServer(x))); - //Create new server and invite other bot to it - _testServer = _bot1.CreateServer("Discord.Net Testing", Regions.US_East).Result; + //Create new server and invite the other bots to it + _testServer = _hostClient.CreateServer("Discord.Net Testing", Regions.US_East).Result; _testServerChannel = _testServer.DefaultChannel; - Invite invite = _bot1.CreateInvite(_testServer, 60, 1, false, false).Result; - _bot2.AcceptInvite(invite).Wait(); + Invite invite = _hostClient.CreateInvite(_testServer, 60, 1, false, false).Result; + WaitAll( + _targetBot.AcceptInvite(invite), + _observerBot.AcceptInvite(invite)); } + //Channels [TestMethod] - public void TestSendMessage() - { - string text = $"test_{_random.Next()}"; - AssertEvent( - "MessageCreated event never received", - () => _bot1.SendMessage(_testServerChannel, text), - x => _bot2.MessageCreated += x, - x => _bot2.MessageCreated -= x, - (s, e) => e.Message.Text == text); - } - + public void TestCreateTextChannel() + => TestCreateChannel(ChannelTypes.Text); [TestMethod] - public void TestCreateTextRoom() - => TestCreateRoom(ChannelTypes.Text); - [TestMethod] - public void TestCreateVoiceRoom() - => TestCreateRoom(ChannelTypes.Voice); - private void TestCreateRoom(string type) + public void TestCreateVoiceChannel() + => TestCreateChannel(ChannelTypes.Voice); + private void TestCreateChannel(string type) { Channel channel = null; string name = $"#test_{_random.Next()}"; AssertEvent( "ChannelCreated event never received", - () => channel = _bot1.CreateChannel(_testServer, name.Substring(1), type).Result, - x => _bot2.ChannelCreated += x, - x => _bot2.ChannelCreated -= x, + () => channel = _hostClient.CreateChannel(_testServer, name.Substring(1), type).Result, + x => _targetBot.ChannelCreated += x, + x => _targetBot.ChannelCreated -= x, (s, e) => e.Channel.Name == name); AssertEvent( "ChannelDestroyed event never received", - () => _bot1.DestroyChannel(channel), - x => _bot2.ChannelDestroyed += x, - x => _bot2.ChannelDestroyed -= x, + () => _hostClient.DestroyChannel(channel), + x => _targetBot.ChannelDestroyed += x, + x => _targetBot.ChannelDestroyed -= x, (s, e) => e.Channel.Name == name); } + [TestMethod] + [ExpectedException(typeof(InvalidOperationException))] + public async Task TestCreateChannel_NoName() + { + await _hostClient.CreateChannel(_testServer, $"", ChannelTypes.Text); + } + [TestMethod] + [ExpectedException(typeof(InvalidOperationException))] + public async Task TestCreateChannel_NoType() + { + string name = $"#test_{_random.Next()}"; + await _hostClient.CreateChannel(_testServer, $"", ""); + } + [TestMethod] + [ExpectedException(typeof(InvalidOperationException))] + public async Task TestCreateChannel_BadType() + { + string name = $"#test_{_random.Next()}"; + await _hostClient.CreateChannel(_testServer, $"", "badtype"); + } + + //Messages + [TestMethod] + public void TestSendMessage() + { + string text = $"test_{_random.Next()}"; + AssertEvent( + "MessageCreated event never received", + () => _hostClient.SendMessage(_testServerChannel, text), + x => _targetBot.MessageCreated += x, + x => _targetBot.MessageCreated -= x, + (s, e) => e.Message.Text == text); + } + [ClassCleanup] public static void Cleanup() { - if (_bot1.IsConnected) - Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); - if (_bot2.IsConnected) - Task.WaitAll(_bot2.Servers.Select(x => _bot2.LeaveServer(x)).ToArray()); - - _bot1.Disconnect().Wait(); - _bot2.Disconnect().Wait(); + WaitMany( + _hostClient.IsConnected ? _hostClient.Servers.Select(x => _hostClient.LeaveServer(x)) : null, + _targetBot.IsConnected ? _targetBot.Servers.Select(x => _targetBot.LeaveServer(x)) : null, + _observerBot.IsConnected ? _observerBot.Servers.Select(x => _observerBot.LeaveServer(x)) : null); + + WaitAll( + _hostClient.Disconnect(), + _targetBot.Disconnect(), + _observerBot.Disconnect()); } private static void AssertEvent(string msg, Action action, Action> addEvent, Action> removeEvent, Func test = null) + { + AssertEvent(msg, action, addEvent, removeEvent, test, true); + } + private static void AssertNoEvent(string msg, Action action, Action> addEvent, Action> removeEvent, Func test = null) + { + AssertEvent(msg, action, addEvent, removeEvent, test, false); + } + private static void AssertEvent(string msg, Action action, Action> addEvent, Action> removeEvent, Func test, bool assertTrue) { ManualResetEventSlim trigger = new ManualResetEventSlim(false); bool result = false; @@ -109,8 +148,21 @@ namespace Discord.Net.Tests action(); trigger.Wait(EventTimeout); removeEvent(handler); + + Assert.AreEqual(assertTrue, result, msg); + } - Assert.AreEqual(true, result, msg); + private static void WaitAll(params Task[] tasks) + { + Task.WaitAll(tasks); + } + private static void WaitAll(IEnumerable tasks) + { + Task.WaitAll(tasks.ToArray()); + } + private static void WaitMany(params IEnumerable[] tasks) + { + Task.WaitAll(tasks.Where(x => x != null).SelectMany(x => x).ToArray()); } } } diff --git a/test/Discord.Net.Tests/config.json.example b/test/Discord.Net.Tests/config.json.example index 371dd6a5f..638d65b4d 100644 --- a/test/Discord.Net.Tests/config.json.example +++ b/test/Discord.Net.Tests/config.json.example @@ -6,5 +6,9 @@ "user2": { "email": "user2@example.com", "password": "password456" + }, + "user3": { + "email": "user3@example.com", + "password": "password789" } } \ No newline at end of file