@@ -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); | ||||
} | } | ||||