@@ -26,5 +26,13 @@ namespace Discord.Tests.Framework.Mocks.Rest | |||||
Avatar = "5f0be46cea584d2225e6c15e8418fb52", | Avatar = "5f0be46cea584d2225e6c15e8418fb52", | ||||
Bot = true | Bot = true | ||||
}; | }; | ||||
public static User PublicUser => new User() | |||||
{ | |||||
Id = 66078337084162048, | |||||
Username = "foxbot", | |||||
Discriminator = "0282", | |||||
Avatar = "cdd7ae679ef37ce03e097221c70aeed6" | |||||
}; | |||||
} | } | ||||
} | } |
@@ -18,7 +18,9 @@ namespace Discord.Tests.Framework | |||||
internal Dictionary<string, Response> Routes = new Dictionary<string, Response>() | internal Dictionary<string, Response> Routes = new Dictionary<string, Response>() | ||||
{ | { | ||||
["GET users/@me"] = new Response(UserRoutes.Me) | |||||
["GET users/@me"] = new Response(UserRoutes.Me), | |||||
["GET users/66078337084162048"] = new Response(UserRoutes.Public), | |||||
["GET users/1"] = new Response(UserRoutes.InvalidPublic) | |||||
}; | }; | ||||
internal Stream GetMock(string method, string endpoint, string json, IReadOnlyDictionary<string, string> requestHeaders) | internal Stream GetMock(string method, string endpoint, string json, IReadOnlyDictionary<string, string> requestHeaders) | ||||
@@ -0,0 +1,24 @@ | |||||
using Discord.Net; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Net; | |||||
using System.Threading.Tasks; | |||||
namespace Discord.Tests.Framework.Routes | |||||
{ | |||||
public static class Contracts | |||||
{ | |||||
public static readonly string UserToken = "token.user"; | |||||
public static readonly string BotToken = "token.bot"; | |||||
public static readonly string BearerToken = "token.bearer"; | |||||
public static void EnsureAuthorization(IReadOnlyDictionary<string, string> requestHeaders) | |||||
{ | |||||
if (!requestHeaders.ContainsKey("authorization")) throw new HttpException(HttpStatusCode.Forbidden); | |||||
if (requestHeaders["authorization"] != UserToken | |||||
&& requestHeaders["authorization"] != $"Bot {BotToken}" | |||||
&& requestHeaders["authorization"] != $"Bearer {BearerToken}") throw new HttpException(HttpStatusCode.Forbidden); | |||||
} | |||||
} | |||||
} |
@@ -9,21 +9,29 @@ namespace Discord.Tests.Framework.Routes | |||||
{ | { | ||||
public static class Users | public static class Users | ||||
{ | { | ||||
public static readonly string UserToken = "token.user"; | |||||
public static readonly string BotToken = "token.bot"; | |||||
public static readonly string BearerToken = "token.bearer"; | |||||
public static object Me(string json, IReadOnlyDictionary<string, string> requestHeaders) | public static object Me(string json, IReadOnlyDictionary<string, string> requestHeaders) | ||||
{ | { | ||||
if (!requestHeaders.ContainsKey("authorization")) throw new HttpException(HttpStatusCode.Forbidden); | |||||
if (requestHeaders["authorization"] != UserToken | |||||
&& requestHeaders["authorization"] != $"Bot {BotToken}" | |||||
&& requestHeaders["authorization"] != $"Bearer {BearerToken}") throw new HttpException(HttpStatusCode.Forbidden); | |||||
Contracts.EnsureAuthorization(requestHeaders); | |||||
if (requestHeaders["authorization"] == UserToken || requestHeaders["authorization"] == $"Bearer {BearerToken}") | |||||
if (requestHeaders["authorization"] == Contracts.UserToken || requestHeaders["authorization"] == $"Bearer {Contracts.BearerToken}") | |||||
return UserMocks.SelfUser; | return UserMocks.SelfUser; | ||||
else | else | ||||
return UserMocks.BotSelfUser; | return UserMocks.BotSelfUser; | ||||
} | } | ||||
public static object Public(string json, IReadOnlyDictionary<string, string> requestHeaders) | |||||
{ | |||||
Contracts.EnsureAuthorization(requestHeaders); | |||||
return UserMocks.PublicUser; | |||||
} | |||||
public static object InvalidPublic(string json, IReadOnlyDictionary<string, string> requestHeaders) | |||||
{ | |||||
Contracts.EnsureAuthorization(requestHeaders); | |||||
throw new HttpException(HttpStatusCode.NotFound); | |||||
} | |||||
} | } | ||||
} | } |
@@ -6,6 +6,7 @@ using Xunit; | |||||
using Discord; | using Discord; | ||||
using Discord.Rest; | using Discord.Rest; | ||||
using Routes = Discord.Tests.Framework.Routes.Users; | using Routes = Discord.Tests.Framework.Routes.Users; | ||||
using Contracts = Discord.Tests.Framework.Routes.Contracts; | |||||
using Discord.Net; | using Discord.Net; | ||||
namespace Discord.Tests.Rest | namespace Discord.Tests.Rest | ||||
@@ -23,7 +24,7 @@ namespace Discord.Tests.Rest | |||||
public async Task LoginAsUser() | public async Task LoginAsUser() | ||||
{ | { | ||||
var client = fixture.Client; | var client = fixture.Client; | ||||
await client.LoginAsync(TokenType.User, Routes.UserToken); | |||||
await client.LoginAsync(TokenType.User, Contracts.UserToken); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public async Task LoginAsUserWithInvalidToken() | public async Task LoginAsUserWithInvalidToken() | ||||
@@ -35,7 +36,7 @@ namespace Discord.Tests.Rest | |||||
public async Task LoginAsBot() | public async Task LoginAsBot() | ||||
{ | { | ||||
var client = fixture.Client; | var client = fixture.Client; | ||||
await client.LoginAsync(TokenType.Bot, Routes.BotToken); | |||||
await client.LoginAsync(TokenType.Bot, Contracts.BotToken); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public async Task LoginAsBotWithInvalidToken() | public async Task LoginAsBotWithInvalidToken() | ||||
@@ -47,7 +48,7 @@ namespace Discord.Tests.Rest | |||||
public async Task LoginAsBearer() | public async Task LoginAsBearer() | ||||
{ | { | ||||
var client = fixture.Client; | var client = fixture.Client; | ||||
await client.LoginAsync(TokenType.Bearer, Routes.BearerToken); | |||||
await client.LoginAsync(TokenType.Bearer, Contracts.BearerToken); | |||||
} | } | ||||
[Fact] | [Fact] | ||||
public async Task LoginAsBearerWithInvalidToken() | public async Task LoginAsBearerWithInvalidToken() | ||||
@@ -0,0 +1,51 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Threading.Tasks; | |||||
using Xunit; | |||||
using Discord; | |||||
using Discord.Rest; | |||||
using Contracts = Discord.Tests.Framework.Routes.Contracts; | |||||
using Mocks = Discord.Tests.Framework.Mocks.Rest.Users; | |||||
using Discord.Net; | |||||
namespace Discord.Tests.Rest | |||||
{ | |||||
public class UserTests : IClassFixture<RestFixture> | |||||
{ | |||||
public UserTests(RestFixture fixture) | |||||
{ | |||||
_client = fixture.Client; | |||||
_client.LoginAsync(TokenType.Bot, Contracts.BotToken).GetAwaiter().GetResult(); | |||||
} | |||||
private DiscordRestClient _client; | |||||
[Fact] | |||||
public async Task GetCurrentUser() | |||||
{ | |||||
var user = await _client.GetCurrentUserAsync(); | |||||
Assert.Equal(Mocks.BotSelfUser.Id, user.Id); | |||||
Assert.Equal(Mocks.BotSelfUser.Username.GetValueOrDefault(), user.Username); | |||||
Assert.Equal(Mocks.BotSelfUser.Discriminator.GetValueOrDefault(), user.Discriminator); | |||||
Assert.Equal(Mocks.BotSelfUser.Bot.GetValueOrDefault(), user.IsBot); | |||||
Assert.Equal(Mocks.BotSelfUser.Email.GetValueOrDefault(), user.Email); | |||||
Assert.Equal(Mocks.BotSelfUser.MfaEnabled.GetValueOrDefault(), user.IsMfaEnabled); | |||||
Assert.Equal(Mocks.BotSelfUser.Verified.GetValueOrDefault(), user.IsVerified); | |||||
} | |||||
[Fact] | |||||
public async Task GetUser() | |||||
{ | |||||
var user = await _client.GetUserAsync(66078337084162048); | |||||
Assert.Equal(Mocks.PublicUser.Id, user.Id); | |||||
Assert.Equal(Mocks.PublicUser.Username.GetValueOrDefault(), user.Username); | |||||
Assert.Equal(Mocks.PublicUser.Discriminator.GetValueOrDefault(), user.Discriminator); | |||||
} | |||||
[Fact] | |||||
public async Task GetInvalidUser() | |||||
{ | |||||
var user = await _client.GetUserAsync(1); | |||||
Assert.Null(user); | |||||
} | |||||
} | |||||
} |