| @@ -26,5 +26,13 @@ namespace Discord.Tests.Framework.Mocks.Rest | |||
| Avatar = "5f0be46cea584d2225e6c15e8418fb52", | |||
| 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>() | |||
| { | |||
| ["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) | |||
| @@ -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 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) | |||
| { | |||
| 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; | |||
| else | |||
| 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.Rest; | |||
| using Routes = Discord.Tests.Framework.Routes.Users; | |||
| using Contracts = Discord.Tests.Framework.Routes.Contracts; | |||
| using Discord.Net; | |||
| namespace Discord.Tests.Rest | |||
| @@ -23,7 +24,7 @@ namespace Discord.Tests.Rest | |||
| public async Task LoginAsUser() | |||
| { | |||
| var client = fixture.Client; | |||
| await client.LoginAsync(TokenType.User, Routes.UserToken); | |||
| await client.LoginAsync(TokenType.User, Contracts.UserToken); | |||
| } | |||
| [Fact] | |||
| public async Task LoginAsUserWithInvalidToken() | |||
| @@ -35,7 +36,7 @@ namespace Discord.Tests.Rest | |||
| public async Task LoginAsBot() | |||
| { | |||
| var client = fixture.Client; | |||
| await client.LoginAsync(TokenType.Bot, Routes.BotToken); | |||
| await client.LoginAsync(TokenType.Bot, Contracts.BotToken); | |||
| } | |||
| [Fact] | |||
| public async Task LoginAsBotWithInvalidToken() | |||
| @@ -47,7 +48,7 @@ namespace Discord.Tests.Rest | |||
| public async Task LoginAsBearer() | |||
| { | |||
| var client = fixture.Client; | |||
| await client.LoginAsync(TokenType.Bearer, Routes.BearerToken); | |||
| await client.LoginAsync(TokenType.Bearer, Contracts.BearerToken); | |||
| } | |||
| [Fact] | |||
| 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); | |||
| } | |||
| } | |||
| } | |||