@@ -196,5 +196,5 @@ FakesAssemblies/ | |||
*.opt | |||
#Custom | |||
Credentials.cs | |||
project.lock.json | |||
project.lock.json | |||
/test/Discord.Net.Tests/config.json |
@@ -22,11 +22,11 @@ namespace Discord.Helpers | |||
static Http() | |||
{ | |||
_client = new HttpClient(); | |||
_client.DefaultRequestHeaders.Add("Accept", "*/*"); | |||
_client.DefaultRequestHeaders.Add("Accept-language", "en-US;q=0.8"); | |||
_client.DefaultRequestHeaders.Add("accept", "*/*"); | |||
_client.DefaultRequestHeaders.Add("accept-language", "en-US;q=0.8"); | |||
string version = typeof(Http).GetTypeInfo().Assembly.GetName().Version.ToString(2); | |||
_client.DefaultRequestHeaders.Add("User-agent", $"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)"); | |||
_client.DefaultRequestHeaders.Add("user-agent", $"Discord.Net/{version} (https://github.com/RogueException/Discord.Net)"); | |||
} | |||
private static string _token; | |||
@@ -36,7 +36,9 @@ namespace Discord.Helpers | |||
set | |||
{ | |||
_token = value; | |||
_client.DefaultRequestHeaders.Add("Authorization", _token); | |||
_client.DefaultRequestHeaders.Remove("authorization"); | |||
if (_token != null) | |||
_client.DefaultRequestHeaders.Add("authorization", _token); | |||
} | |||
} | |||
@@ -132,19 +134,6 @@ namespace Discord.Helpers | |||
} | |||
} | |||
private static Stream GetDecoder(string contentEncoding, MemoryStream encodedStream) | |||
{ | |||
switch (contentEncoding) | |||
{ | |||
case "gzip": | |||
return new GZipStream(encodedStream, CompressionMode.Decompress, true); | |||
case "deflate": | |||
return new DeflateStream(encodedStream, CompressionMode.Decompress, true); | |||
default: | |||
throw new ArgumentOutOfRangeException("Unknown encoding: " + contentEncoding); | |||
} | |||
} | |||
#if DEBUG | |||
private static void CheckResponse<T>(string json, T obj) | |||
{ | |||
@@ -26,8 +26,8 @@ namespace Discord | |||
{ | |||
ServerId = serverId; | |||
UserId = userId; | |||
_client = client; | |||
JoinedAt = joinedAt; | |||
} | |||
_client = client; | |||
} | |||
} | |||
} |
@@ -8,7 +8,7 @@ | |||
<AppDesignerFolder>Properties</AppDesignerFolder> | |||
<RootNamespace>Discord.Net.Tests</RootNamespace> | |||
<AssemblyName>Discord.Net.Tests</AssemblyName> | |||
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion> | |||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion> | |||
<FileAlignment>512</FileAlignment> | |||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | |||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> | |||
@@ -36,6 +36,10 @@ | |||
<WarningLevel>4</WarningLevel> | |||
</PropertyGroup> | |||
<ItemGroup> | |||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> | |||
<HintPath>..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> | |||
<Private>True</Private> | |||
</Reference> | |||
<Reference Include="System" /> | |||
</ItemGroup> | |||
<Choose> | |||
@@ -52,7 +56,7 @@ | |||
</Choose> | |||
<ItemGroup> | |||
<Compile Include="Tests.cs" /> | |||
<Compile Include="Credentials.cs" /> | |||
<Compile Include="Settings.cs" /> | |||
<Compile Include="Properties\AssemblyInfo.cs" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
@@ -61,6 +65,9 @@ | |||
<Name>Discord.Net</Name> | |||
</ProjectReference> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<None Include="packages.config" /> | |||
</ItemGroup> | |||
<Choose> | |||
<When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'"> | |||
<ItemGroup> | |||
@@ -0,0 +1,29 @@ | |||
using Newtonsoft.Json; | |||
using System.IO; | |||
namespace Discord.Net.Tests | |||
{ | |||
internal class Settings | |||
{ | |||
private const string path = "../../config.json"; | |||
public static Settings Load() | |||
{ | |||
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<Settings>(File.ReadAllText(path)); | |||
} | |||
public class Account | |||
{ | |||
[JsonProperty("email")] | |||
public string Email { get; set; } | |||
[JsonProperty("password")] | |||
public string Password { get; set; } | |||
} | |||
[JsonProperty("user1")] | |||
public Account User1 { get; set; } | |||
[JsonProperty("user2")] | |||
public Account User2 { get; set; } | |||
} | |||
} |
@@ -10,21 +10,24 @@ 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 DiscordClient _bot1, _bot2; | |||
private Server _testServer; | |||
private Channel _testServerChannel; | |||
private Random _random; | |||
[TestInitialize] | |||
public void Initialize() | |||
private static Settings _settings; | |||
private static DiscordClient _bot1, _bot2; | |||
private static Server _testServer; | |||
private static Channel _testServerChannel; | |||
private static Random _random; | |||
[ClassInitialize] | |||
public static void Initialize(TestContext testContext) | |||
{ | |||
_settings = Settings.Load(); | |||
_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(); | |||
_bot1.Connect(_settings.User1.Email, _settings.User1.Password).Wait(); | |||
_bot2.Connect(_settings.User2.Email, _settings.User2.Password).Wait(); | |||
//Cleanup existing servers | |||
Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); | |||
@@ -58,10 +61,10 @@ namespace Discord.Net.Tests | |||
private void TestCreateRoom(string type) | |||
{ | |||
Channel channel = null; | |||
string name = $"test_{_random.Next()}"; | |||
string name = $"#test_{_random.Next()}"; | |||
AssertEvent<DiscordClient.ChannelEventArgs>( | |||
"ChannelCreated event never received", | |||
() => channel = _bot1.CreateChannel(_testServer, name, type).Result, | |||
() => channel = _bot1.CreateChannel(_testServer, name.Substring(1), type).Result, | |||
x => _bot2.ChannelCreated += x, | |||
x => _bot2.ChannelCreated -= x, | |||
(s, e) => e.Channel.Name == name); | |||
@@ -74,8 +77,8 @@ namespace Discord.Net.Tests | |||
(s, e) => e.Channel.Name == name); | |||
} | |||
[TestCleanup] | |||
public void Cleanup() | |||
[ClassCleanup] | |||
public static void Cleanup() | |||
{ | |||
if (_bot1.IsConnected) | |||
Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); | |||
@@ -86,22 +89,25 @@ namespace Discord.Net.Tests | |||
_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) | |||
private static 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); | |||
ManualResetEventSlim trigger = new ManualResetEventSlim(false); | |||
bool result = false; | |||
EventHandler<TArgs> handler = (s, e) => | |||
{ | |||
if (test != null) | |||
{ | |||
result |= test(s, e); | |||
trigger.Set(); | |||
} | |||
else | |||
result = true; | |||
}; | |||
addEvent(handler); | |||
action(); | |||
trigger.WaitOne(EventTimeout); | |||
trigger.Wait(EventTimeout); | |||
removeEvent(handler); | |||
Assert.AreEqual(true, result, msg); | |||
@@ -0,0 +1,10 @@ | |||
{ | |||
"user1": { | |||
"email": "user1@example.com", | |||
"password": "password123" | |||
}, | |||
"user2": { | |||
"email": "user2@example.com", | |||
"password": "password456" | |||
} | |||
} |
@@ -0,0 +1,4 @@ | |||
<?xml version="1.0" encoding="utf-8"?> | |||
<packages> | |||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net46" /> | |||
</packages> |