using System; using System.Collections.Generic; using System.Text; using Xunit; namespace Discord { public class TokenUtilsTests { /// /// Tests the usage of /// to see that when a null, empty or whitespace-only string is passed as the token, /// it will throw an ArgumentNullException. /// [Theory] [InlineData(null)] [InlineData("")] // string.Empty isn't a constant type [InlineData(" ")] [InlineData(" ")] [InlineData("\t")] public void TestNullOrWhitespaceToken(string token) { // an ArgumentNullException should be thrown, regardless of the TokenType Assert.Throws(() => TokenUtils.ValidateToken(TokenType.Bearer, token)); Assert.Throws(() => TokenUtils.ValidateToken(TokenType.Bot, token)); Assert.Throws(() => TokenUtils.ValidateToken(TokenType.Webhook, token)); } /// /// Tests the behavior of /// to see that valid Webhook tokens do not throw Exceptions. /// /// [Theory] [InlineData("123123123")] // bot token [InlineData("MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs")] // bearer token taken from discord docs [InlineData("6qrZcUqja7812RVdnEKjpzOL4CvHBFG")] // client secret [InlineData("937it3ow87i4ery69876wqire")] public void TestWebhookTokenDoesNotThrowExceptions(string token) { TokenUtils.ValidateToken(TokenType.Webhook, token); } // No tests for invalid webhook token behavior, because there is nothing there yet. /// /// Tests the behavior of /// to see that valid Webhook tokens do not throw Exceptions. /// /// [Theory] [InlineData("123123123")] // bot token [InlineData("MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs")] // bearer token taken from discord docs [InlineData("6qrZcUqja7812RVdnEKjpzOL4CvHBFG")] // client secret [InlineData("937it3ow87i4ery69876wqire")] public void TestBearerTokenDoesNotThrowExceptions(string token) { TokenUtils.ValidateToken(TokenType.Bearer, token); } // No tests for invalid bearer token behavior, because there is nothing there yet. /// /// Tests the behavior of /// to see that valid Bot tokens do not throw Exceptions. /// Valid Bot tokens can be strings of length 59 or above. /// [Theory] [InlineData("MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs")] [InlineData("This appears to be completely invalid, however the current validation rules are not very strict.")] [InlineData("MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWss")] [InlineData("MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWsMTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs")] public void TestBotTokenDoesNotThrowExceptions(string token) { // This example token is pulled from the Discord Docs // https://discordapp.com/developers/docs/reference#authentication-example-bot-token-authorization-header // should not throw any exception TokenUtils.ValidateToken(TokenType.Bot, token); } /// /// Tests the usage of with /// a Bot token that is invalid. /// [Theory] [InlineData("This is invalid")] // missing a single character from the end [InlineData("MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKW")] // bearer token [InlineData("6qrZcUqja7812RVdnEKjpzOL4CvHBFG")] // client secret [InlineData("937it3ow87i4ery69876wqire")] public void TestBotTokenInvalidThrowsArgumentException(string token) { Assert.Throws(() => TokenUtils.ValidateToken(TokenType.Bot, token)); } /// /// Tests the behavior of /// to see that an is thrown when an invalid /// is supplied as a parameter. /// /// /// The type is treated as an invalid . /// [Theory] // TokenType.User [InlineData(0)] // out of range TokenType [InlineData(4)] [InlineData(7)] public void TestUnrecognizedTokenType(int type) { Assert.Throws(() => TokenUtils.ValidateToken((TokenType)type, "MTk4NjIyNDgzNDcxOTI1MjQ4.Cl2FMQ.ZnCjm1XVW7vRze4b7Cq4se7kKWs")); } } }