| @@ -196,5 +196,5 @@ FakesAssemblies/ | |||||
| *.opt | *.opt | ||||
| #Custom | #Custom | ||||
| Credentials.cs | |||||
| project.lock.json | |||||
| project.lock.json | |||||
| /test/Discord.Net.Tests/config.json | |||||
| @@ -22,11 +22,11 @@ namespace Discord.Helpers | |||||
| static Http() | static Http() | ||||
| { | { | ||||
| _client = new HttpClient(); | _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); | 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; | private static string _token; | ||||
| @@ -36,7 +36,9 @@ namespace Discord.Helpers | |||||
| set | set | ||||
| { | { | ||||
| _token = value; | _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 | #if DEBUG | ||||
| private static void CheckResponse<T>(string json, T obj) | private static void CheckResponse<T>(string json, T obj) | ||||
| { | { | ||||
| @@ -26,8 +26,8 @@ namespace Discord | |||||
| { | { | ||||
| ServerId = serverId; | ServerId = serverId; | ||||
| UserId = userId; | UserId = userId; | ||||
| _client = client; | |||||
| JoinedAt = joinedAt; | JoinedAt = joinedAt; | ||||
| } | |||||
| _client = client; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -8,7 +8,7 @@ | |||||
| <AppDesignerFolder>Properties</AppDesignerFolder> | <AppDesignerFolder>Properties</AppDesignerFolder> | ||||
| <RootNamespace>Discord.Net.Tests</RootNamespace> | <RootNamespace>Discord.Net.Tests</RootNamespace> | ||||
| <AssemblyName>Discord.Net.Tests</AssemblyName> | <AssemblyName>Discord.Net.Tests</AssemblyName> | ||||
| <TargetFrameworkVersion>v4.6</TargetFrameworkVersion> | |||||
| <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> | |||||
| <FileAlignment>512</FileAlignment> | <FileAlignment>512</FileAlignment> | ||||
| <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | ||||
| <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> | <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> | ||||
| @@ -36,6 +36,10 @@ | |||||
| <WarningLevel>4</WarningLevel> | <WarningLevel>4</WarningLevel> | ||||
| </PropertyGroup> | </PropertyGroup> | ||||
| <ItemGroup> | <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" /> | <Reference Include="System" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <Choose> | <Choose> | ||||
| @@ -52,7 +56,7 @@ | |||||
| </Choose> | </Choose> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| <Compile Include="Tests.cs" /> | <Compile Include="Tests.cs" /> | ||||
| <Compile Include="Credentials.cs" /> | |||||
| <Compile Include="Settings.cs" /> | |||||
| <Compile Include="Properties\AssemblyInfo.cs" /> | <Compile Include="Properties\AssemblyInfo.cs" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | <ItemGroup> | ||||
| @@ -61,6 +65,9 @@ | |||||
| <Name>Discord.Net</Name> | <Name>Discord.Net</Name> | ||||
| </ProjectReference> | </ProjectReference> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <None Include="packages.config" /> | |||||
| </ItemGroup> | |||||
| <Choose> | <Choose> | ||||
| <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'"> | <When Condition="'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'"> | ||||
| <ItemGroup> | <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 | public class Tests | ||||
| { | { | ||||
| private const int EventTimeout = 5000; //Max time in milliseconds to wait for an event response from our test actions | 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(); | _random = new Random(); | ||||
| _bot1 = new DiscordClient(); | _bot1 = new DiscordClient(); | ||||
| _bot2 = 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 | //Cleanup existing servers | ||||
| Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); | Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); | ||||
| @@ -58,10 +61,10 @@ namespace Discord.Net.Tests | |||||
| private void TestCreateRoom(string type) | private void TestCreateRoom(string type) | ||||
| { | { | ||||
| Channel channel = null; | Channel channel = null; | ||||
| string name = $"test_{_random.Next()}"; | |||||
| string name = $"#test_{_random.Next()}"; | |||||
| AssertEvent<DiscordClient.ChannelEventArgs>( | AssertEvent<DiscordClient.ChannelEventArgs>( | ||||
| "ChannelCreated event never received", | "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, | ||||
| x => _bot2.ChannelCreated -= x, | x => _bot2.ChannelCreated -= x, | ||||
| (s, e) => e.Channel.Name == name); | (s, e) => e.Channel.Name == name); | ||||
| @@ -74,8 +77,8 @@ namespace Discord.Net.Tests | |||||
| (s, e) => e.Channel.Name == name); | (s, e) => e.Channel.Name == name); | ||||
| } | } | ||||
| [TestCleanup] | |||||
| public void Cleanup() | |||||
| [ClassCleanup] | |||||
| public static void Cleanup() | |||||
| { | { | ||||
| if (_bot1.IsConnected) | if (_bot1.IsConnected) | ||||
| Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); | Task.WaitAll(_bot1.Servers.Select(x => _bot1.LeaveServer(x)).ToArray()); | ||||
| @@ -86,22 +89,25 @@ namespace Discord.Net.Tests | |||||
| _bot2.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) | |||||
| 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; | bool result = false; | ||||
| EventHandler<TArgs> handler = (s, e) => | EventHandler<TArgs> handler = (s, e) => | ||||
| { | { | ||||
| if (test != null) | if (test != null) | ||||
| { | |||||
| result |= test(s, e); | result |= test(s, e); | ||||
| trigger.Set(); | |||||
| } | |||||
| else | else | ||||
| result = true; | result = true; | ||||
| }; | }; | ||||
| addEvent(handler); | addEvent(handler); | ||||
| action(); | action(); | ||||
| trigger.WaitOne(EventTimeout); | |||||
| trigger.Wait(EventTimeout); | |||||
| removeEvent(handler); | removeEvent(handler); | ||||
| Assert.AreEqual(true, result, msg); | 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> | |||||