| @@ -1,47 +0,0 @@ | |||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | |||||
| using System.Linq; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.Net.Tests | |||||
| { | |||||
| [TestClass] | |||||
| public class ChannelTests | |||||
| { | |||||
| private DiscordClient _bot1, _bot2; | |||||
| [TestInitialize] | |||||
| public void Initialize() | |||||
| { | |||||
| _bot1 = new DiscordClient(); | |||||
| _bot2 = new DiscordClient(); | |||||
| _bot1.Connect(Settings.Test1_Username, Settings.Test1_Password).Wait(); | |||||
| _bot2.Connect(Settings.Test2_Username, Settings.Test2_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()); | |||||
| } | |||||
| [TestMethod] | |||||
| public async Task DoNothing() | |||||
| { | |||||
| Server server = await _bot1.CreateServer("Discord.Net Testbed", Region.US_East); | |||||
| Invite invite = await _bot1.CreateInvite(server, 60, 1, false, false); | |||||
| await _bot2.AcceptInvite(invite); | |||||
| await _bot2.LeaveServer(server); | |||||
| } | |||||
| [TestCleanup] | |||||
| public 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(); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -50,7 +50,7 @@ | |||||
| </Otherwise> | </Otherwise> | ||||
| </Choose> | </Choose> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <Compile Include="ChannelTests.cs" /> | |||||
| <Compile Include="Tests.cs" /> | |||||
| <Compile Include="Credentials.cs" /> | <Compile Include="Credentials.cs" /> | ||||
| <Compile Include="Properties\AssemblyInfo.cs" /> | <Compile Include="Properties\AssemblyInfo.cs" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| @@ -0,0 +1,103 @@ | |||||
| using Microsoft.VisualStudio.TestTools.UnitTesting; | |||||
| using System; | |||||
| using System.Linq; | |||||
| using System.Threading; | |||||
| using System.Threading.Tasks; | |||||
| namespace Discord.Net.Tests | |||||
| { | |||||
| [TestClass] | |||||
| public class Tests | |||||
| { | |||||
| private DiscordClient _bot1, _bot2; | |||||
| private Server _testServer; | |||||
| private Channel _testServerChannel; | |||||
| private Random _random; | |||||
| [TestInitialize] | |||||
| public void Initialize() | |||||
| { | |||||
| _random = new Random(); | |||||
| _bot1 = new DiscordClient(); | |||||
| _bot2 = new DiscordClient(); | |||||
| _bot1.Connect(Settings.Test1_Username, Settings.Test1_Password).Wait(); | |||||
| _bot2.Connect(Settings.Test2_Username, Settings.Test2_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()); | |||||
| _testServer = _bot1.CreateServer("Discord.Net Testbed", Region.US_East).Result; | |||||
| _testServerChannel = _testServer.DefaultChannel; | |||||
| Invite invite = _bot1.CreateInvite(_testServer, 60, 1, false, false).Result; | |||||
| _bot2.AcceptInvite(invite).Wait(); | |||||
| } | |||||
| [TestMethod] | |||||
| public void TestSendMessage() | |||||
| { | |||||
| string text = $"test_{_random.Next()}"; | |||||
| AssertEvent<DiscordClient.MessageEventArgs>( | |||||
| "MessageCreated event never received", | |||||
| () => _bot1.SendMessage(_testServerChannel, text), | |||||
| x => _bot2.MessageCreated += x, | |||||
| x => _bot2.MessageCreated -= x, | |||||
| (s, e) => e.Message.Text == text); | |||||
| } | |||||
| [TestMethod] | |||||
| public void TestCreateRoom() | |||||
| { | |||||
| Channel channel; | |||||
| string name = $"test_{_random.Next()}"; | |||||
| AssertEvent<DiscordClient.ChannelEventArgs>( | |||||
| "ChannelCreated event never received", | |||||
| () => channel = _bot1.CreateChannel(_testServerChannel, name), | |||||
| x => _bot2.ChannelCreated += x, | |||||
| x => _bot2.ChannelCreated -= x, | |||||
| (s, e) => e.Channel.Name == name); | |||||
| AssertEvent<DiscordClient.ChannelEventArgs>( | |||||
| "ChannelDestroyed event never received", | |||||
| () => _bot1.DestroyChannel(channel), | |||||
| x => _bot2.ChannelDestroyed += x, | |||||
| x => _bot2.ChannelDestroyed -= x, | |||||
| (s, e) => e.Channel.Name == name); | |||||
| } | |||||
| [TestCleanup] | |||||
| public 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(); | |||||
| } | |||||
| private void AssertEvent<TArgs>(string msg, Action action, Action<EventHandler<TArgs>> addEvent, Action<EventHandler<TArgs>> removeEvent, Func<object, TArgs, bool> test = null) | |||||
| { | |||||
| ManualResetEvent trigger = new ManualResetEvent(false); | |||||
| bool result = false; | |||||
| EventHandler<TArgs> handler = (s, e) => | |||||
| { | |||||
| if (test != null) | |||||
| result = test(s, e); | |||||
| else | |||||
| result = true; | |||||
| }; | |||||
| addEvent(handler); | |||||
| action(); | |||||
| trigger.WaitOne(5000); | |||||
| removeEvent(handler); | |||||
| Assert.AreEqual(true, result, msg); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -4,6 +4,7 @@ using Discord.Helpers; | |||||
| using System; | using System; | ||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||
| using System.Linq; | using System.Linq; | ||||
| using System.Net; | |||||
| using System.Reflection; | using System.Reflection; | ||||
| using System.Threading; | using System.Threading; | ||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
| @@ -51,7 +52,12 @@ namespace Discord | |||||
| (server, model) => | (server, model) => | ||||
| { | { | ||||
| server.Name = model.Name; | server.Name = model.Name; | ||||
| if (model is ExtendedServerInfo) | |||||
| if (!server.Channels.Any()) //Assume a default channel exists with the same id as the server. Not sure if this is safe? | |||||
| { | |||||
| var defaultChannel = new ChannelReference() { Id = server.DefaultChannelId, GuildId = server.Id }; | |||||
| _channels.Update(defaultChannel.Id, defaultChannel.GuildId, defaultChannel); | |||||
| } | |||||
| if (model is ExtendedServerInfo) | |||||
| { | { | ||||
| var extendedModel = model as ExtendedServerInfo; | var extendedModel = model as ExtendedServerInfo; | ||||
| server.AFKChannelId = extendedModel.AFKChannelId; | server.AFKChannelId = extendedModel.AFKChannelId; | ||||
| @@ -422,7 +428,12 @@ namespace Discord | |||||
| public async Task<Server> LeaveServer(string id) | public async Task<Server> LeaveServer(string id) | ||||
| { | { | ||||
| CheckReady(); | CheckReady(); | ||||
| await DiscordAPI.LeaveServer(id, _httpOptions); | |||||
| try | |||||
| { | |||||
| await DiscordAPI.LeaveServer(id, _httpOptions); | |||||
| } | |||||
| //Happens if the room was destroyed as we try to leave it | |||||
| catch (WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound) {} | |||||
| return _servers.Remove(id); | return _servers.Remove(id); | ||||
| } | } | ||||