diff --git a/ProjectLighthouse.Tests/LighthouseTest.cs b/ProjectLighthouse.Tests/LighthouseTest.cs index 0cacb69c..f76a6e60 100644 --- a/ProjectLighthouse.Tests/LighthouseTest.cs +++ b/ProjectLighthouse.Tests/LighthouseTest.cs @@ -1,7 +1,10 @@ -using System; +using System.IO; using System.Net.Http; +using System.Threading.Tasks; +using System.Xml.Serialization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.TestHost; +using ProjectLighthouse.Serialization; using ProjectLighthouse.Types; namespace ProjectLighthouse.Tests { @@ -12,8 +15,37 @@ namespace ProjectLighthouse.Tests { public LighthouseTest() { this.Server = new TestServer(new WebHostBuilder() .UseStartup()); + this.Client = this.Server.CreateClient(); + } + public async Task AuthenticateResponse(int number = 0) { + const char nullChar = (char)0x00; + const char sepChar = (char)0x20; + const string username = "unitTestUser"; + + string stringContent = $"{nullChar}{sepChar}{username}{number}{nullChar}"; + + HttpResponseMessage response = await this.Client.PostAsync("/LITTLEBIGPLANETPS3_XML/login", new StringContent(stringContent)); + return response; + } + + public async Task Authenticate(int number = 0) { + HttpResponseMessage response = await this.AuthenticateResponse(number); + + string responseContent = LbpSerializer.StringElement("loginResult", await response.Content.ReadAsStringAsync()); + + XmlSerializer serializer = new(typeof(LoginResult)); + return (LoginResult)serializer.Deserialize(new StringReader(responseContent))!; + } + + public Task AuthenticatedRequest(string endpoint, string mmAuth) => AuthenticatedRequest(endpoint, mmAuth, HttpMethod.Get); + + public Task AuthenticatedRequest(string endpoint, string mmAuth, HttpMethod method) { + using var requestMessage = new HttpRequestMessage(method, endpoint); + requestMessage.Headers.Add("Cookie", mmAuth); + + return this.Client.SendAsync(requestMessage); } } } \ No newline at end of file diff --git a/ProjectLighthouse.Tests/Tests/AuthenticationTest.cs b/ProjectLighthouse.Tests/Tests/AuthenticationTest.cs index e06ee7b3..2cc09083 100644 --- a/ProjectLighthouse.Tests/Tests/AuthenticationTest.cs +++ b/ProjectLighthouse.Tests/Tests/AuthenticationTest.cs @@ -1,13 +1,15 @@ +using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Threading.Tasks; +using ProjectLighthouse.Types; using Xunit; namespace ProjectLighthouse.Tests { public class AuthenticationTest : LighthouseTest { [Fact] public async Task ShouldReturnErrorOnNoPostData() { - var response = await this.Client.PostAsync("/LITTLEBIGPLANETPS3_XML/login", null!); + HttpResponseMessage response = await this.Client.PostAsync("/LITTLEBIGPLANETPS3_XML/login", null!); Assert.False(response.IsSuccessStatusCode); #if NET6_0_OR_GREATER Assert.True(response.StatusCode == HttpStatusCode.BadRequest); @@ -17,12 +19,42 @@ namespace ProjectLighthouse.Tests { } [DatabaseFact] - public async Task ShouldAuthenticateWithValidData() { - const char nullChar = (char)0x00; - const char sepChar = (char)0x20; + public async Task ShouldReturnWithValidData() { + HttpResponseMessage response = await this.AuthenticateResponse(); + Assert.True(response.IsSuccessStatusCode); + string responseContent = await response.Content.ReadAsStringAsync(); + Assert.Contains("MM_AUTH=", responseContent); + Assert.Contains(ServerSettings.ServerName, responseContent); + } + + [DatabaseFact] + public async Task CanSerializeBack() { + LoginResult loginResult = await this.Authenticate(); - var response = await this.Client.PostAsync("/LITTLEBIGPLANETPS3_XML/login", new StringContent($"{nullChar}{sepChar}jvyden{nullChar}")); - Assert.True(response.StatusCode == HttpStatusCode.OK); + Assert.NotNull(loginResult); + Assert.NotNull(loginResult.AuthTicket); + Assert.NotNull(loginResult.LbpEnvVer); + + Assert.Contains("MM_AUTH=", loginResult.AuthTicket); + Assert.Equal(ServerSettings.ServerName, loginResult.LbpEnvVer); + } + + [DatabaseFact] + public async Task CanUseToken() { + LoginResult loginResult = await this.Authenticate(); + + HttpResponseMessage response = await AuthenticatedRequest("/LITTLEBIGPLANETPS3_XML/eula", loginResult.AuthTicket); + string responseContent = await response.Content.ReadAsStringAsync(); + + Assert.True(response.IsSuccessStatusCode); + Assert.Contains("You are logged in", responseContent); + } + + [DatabaseFact] + public async Task ShouldReturnForbiddenWhenNotAuthenticated() { + HttpResponseMessage response = await this.Client.GetAsync("/LITTLEBIGPLANETPS3_XML/eula"); + Assert.False(response.IsSuccessStatusCode); + Assert.True(response.StatusCode == HttpStatusCode.Forbidden); } } } \ No newline at end of file diff --git a/ProjectLighthouse/Types/LoginResult.cs b/ProjectLighthouse/Types/LoginResult.cs index f9c20260..64bc5be0 100644 --- a/ProjectLighthouse/Types/LoginResult.cs +++ b/ProjectLighthouse/Types/LoginResult.cs @@ -1,12 +1,17 @@ using System.Collections.Generic; +using System.Xml.Serialization; using ProjectLighthouse.Serialization; namespace ProjectLighthouse.Types { /// /// Response to POST /login /// + [XmlRoot("loginResult"), XmlType("loginResult")] public class LoginResult { + [XmlElement("authTicket")] public string AuthTicket { get; set; } + + [XmlElement("lbpEnvVer")] public string LbpEnvVer { get; set; } public string Serialize() {