From 32ad6f2b381e4acb01fdd7f7f32cca5a1c0bfec7 Mon Sep 17 00:00:00 2001 From: Stefan Berg Date: Wed, 3 Aug 2022 22:46:47 +0200 Subject: [PATCH 1/4] Rename test --- .../MareSynchronosServerTest/Discord/DiscordBotTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs b/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs index fe66a66..6a6cb47 100644 --- a/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs +++ b/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs @@ -31,7 +31,7 @@ namespace MareSynchronosServerTest.Discord { [TestCase("https://eu.finalfantasyxiv.com/lodestone/character/1234?myurlparameter=500", 1234)] [TestCase("https://de.finalfantasyxiv.com/lodestone/character/1234/whatever/3456", 1234)] [TestCase("https://na.finalfantasyxiv.com/lodestone/character/1234abcd4321/whatever/3456", 1234)] - public void Test1(string url, int? expectedId) { + public void ParseCharacterIdFromLodestoneUrl_CheckThatIdIsParsedCorrectly(string url, int? expectedId) { var inMemorySettings = new Dictionary { {"DiscordBotToken", "1234"} }; From c95d0e1d0963d4f154fb7707725a7921e8722781 Mon Sep 17 00:00:00 2001 From: Stefan Berg Date: Wed, 3 Aug 2022 22:46:47 +0200 Subject: [PATCH 2/4] Rename test --- .../MareSynchronosServerTest/Discord/DiscordBotTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs b/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs index fe66a66..6a6cb47 100644 --- a/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs +++ b/MareSynchronosServer/MareSynchronosServerTest/Discord/DiscordBotTest.cs @@ -31,7 +31,7 @@ namespace MareSynchronosServerTest.Discord { [TestCase("https://eu.finalfantasyxiv.com/lodestone/character/1234?myurlparameter=500", 1234)] [TestCase("https://de.finalfantasyxiv.com/lodestone/character/1234/whatever/3456", 1234)] [TestCase("https://na.finalfantasyxiv.com/lodestone/character/1234abcd4321/whatever/3456", 1234)] - public void Test1(string url, int? expectedId) { + public void ParseCharacterIdFromLodestoneUrl_CheckThatIdIsParsedCorrectly(string url, int? expectedId) { var inMemorySettings = new Dictionary { {"DiscordBotToken", "1234"} }; From 3a1bda96ed34233ad63ba3f4873bdcd7df42c291 Mon Sep 17 00:00:00 2001 From: Stefan Berg Date: Mon, 15 Aug 2022 12:39:55 +0200 Subject: [PATCH 3/4] change query so only one query has to be sent in MareHub.OnDisconnectedAsync --- .../MareSynchronosServer/Hubs/MareHub.cs | 28 +++++-- .../Hubs/MareHubTest.cs | 82 +++++++++++++++++++ .../MareSynchronosServerTest.csproj | 1 + 3 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs diff --git a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs index dab1b25..eb61823 100644 --- a/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs +++ b/MareSynchronosServer/MareSynchronosServer/Hubs/MareHub.cs @@ -95,16 +95,26 @@ namespace MareSynchronosServer.Hubs if (user != null && !string.IsNullOrEmpty(user.CharacterIdentification)) { MareMetrics.AuthorizedConnections.Dec(); - _logger.LogInformation("Disconnect from " + AuthenticatedUserId); + _logger.LogInformation("Disconnect from " + AuthenticatedUserId); - var otherUsers = await _dbContext.ClientPairs.AsNoTracking() - .Include(u => u.User) - .Include(u => u.OtherUser) - .Where(w => w.User.UID == user.UID && !w.IsPaused) - .Where(w => !string.IsNullOrEmpty(w.OtherUser.CharacterIdentification)) - .Select(e => e.OtherUser).ToListAsync(); - var otherEntries = await _dbContext.ClientPairs.AsNoTracking().Include(u => u.User) - .Where(u => otherUsers.Any(e => e == u.User) && u.OtherUser.UID == user.UID && !u.IsPaused).ToListAsync(); + var query = + from userToOther in _dbContext.ClientPairs + join otherToUser in _dbContext.ClientPairs + on new { + user = userToOther.UserUID, + other = userToOther.OtherUserUID + + } equals new { + user = otherToUser.OtherUserUID, + other = otherToUser.UserUID + } + where + userToOther.UserUID == user.UID + && !userToOther.IsPaused + && !otherToUser.IsPaused + select otherToUser; + var otherEntries = await query.ToListAsync(); + await Clients.Users(otherEntries.Select(e => e.User.UID)).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification); var notUploadedFiles = _dbContext.Files.Where(f => !f.Uploaded && f.Uploader.UID == user.UID).ToList(); diff --git a/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs b/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs new file mode 100644 index 0000000..52a2571 --- /dev/null +++ b/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs @@ -0,0 +1,82 @@ +using MareSynchronosServer.Data; +using MareSynchronosServer.Hubs; +using MareSynchronosServer.Models; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.SignalR; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Moq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; + +namespace MareSynchronosServerTest.Hubs { + public class MareHubTest { + + [Test] + public async Task Disconnect_QueryReturnsCorrectResult_Test() { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "mare").Options; + + using var context = new MareDbContext(options); + context.Users.Add(new User() { UID = "User1", IsModerator = false, IsAdmin = false, CharacterIdentification = "Ident1" }); + context.Users.Add(new User() { UID = "User2", IsModerator = false, IsAdmin = false, CharacterIdentification = "Ident2" }); + context.Users.Add(new User() { UID = "User3", IsModerator = false, IsAdmin = false, CharacterIdentification = "Ident3" }); + context.Users.Add(new User() { UID = "User4", IsModerator = false, IsAdmin = false, CharacterIdentification = "Ident4" }); + context.Users.Add(new User() { UID = "User5", IsModerator = false, IsAdmin = false, CharacterIdentification = "Ident5" }); + context.Users.Add(new User() { UID = "User6", IsModerator = false, IsAdmin = false, CharacterIdentification = "Ident6" }); + + // Valid pairs + context.ClientPairs.Add(new ClientPair() { UserUID = "User1", OtherUserUID = "User2", IsPaused = false }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User2", OtherUserUID = "User1", IsPaused = false }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User1", OtherUserUID = "User3", IsPaused = false }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User3", OtherUserUID = "User1", IsPaused = false }); + + // Other user paired but user not paired with current user + context.ClientPairs.Add(new ClientPair() { UserUID = "User4", OtherUserUID = "User1", IsPaused = false }); + + // Valid pair but user paused + context.ClientPairs.Add(new ClientPair() { UserUID = "User1", OtherUserUID = "User5", IsPaused = true }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User5", OtherUserUID = "User1", IsPaused = false }); + + // Valid pair but other user paused + context.ClientPairs.Add(new ClientPair() { UserUID = "User1", OtherUserUID = "User6", IsPaused = false }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User6", OtherUserUID = "User1", IsPaused = true }); + + // Non existant user + context.ClientPairs.Add(new ClientPair() { UserUID = "User99", OtherUserUID = "User1", IsPaused = false }); + + // Non-related data + context.ClientPairs.Add(new ClientPair() { UserUID = "User6", OtherUserUID = "User4", IsPaused = true }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User4", OtherUserUID = "User3", IsPaused = true }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User3", OtherUserUID = "User2", IsPaused = true }); + + context.SaveChanges(); + + var clientContextMock = new Mock(); + var claimMock = new Mock(); + var claim = new Claim(ClaimTypes.NameIdentifier, "User1"); + claimMock.SetupGet(x => x.Claims).Returns(new List() { claim }); + clientContextMock.SetupGet(x => x.User).Returns(claimMock.Object); + + var clientsMock = new Mock(); + var clientProxyMock = new Mock(); + clientsMock.Setup(x => x.Users(It.IsAny>())).Returns(clientProxyMock.Object); + + var hub = new MareHub(context, new Mock>().Object, null, new Mock().Object, new Mock().Object); + + + hub.Clients = clientsMock.Object; + hub.Context = clientContextMock.Object; + + await hub.OnDisconnectedAsync(new Exception("Test Exception")); + + clientsMock.Verify(x => x.Users(It.Is>(x => x.Count() == 2 && x[0] == "User2" && x[1] == "User3")), Times.Once); + clientProxyMock.Verify(x => x.SendCoreAsync(It.IsAny(), It.Is(o => (string)o[0] == "Ident1"), It.IsAny()), Times.Once); + } + } +} diff --git a/MareSynchronosServer/MareSynchronosServerTest/MareSynchronosServerTest.csproj b/MareSynchronosServer/MareSynchronosServerTest/MareSynchronosServerTest.csproj index 63087e2..732f04e 100644 --- a/MareSynchronosServer/MareSynchronosServerTest/MareSynchronosServerTest.csproj +++ b/MareSynchronosServer/MareSynchronosServerTest/MareSynchronosServerTest.csproj @@ -10,6 +10,7 @@ + From 8e39b8e98c7fa933bb98341abf6010fc3fc7035e Mon Sep 17 00:00:00 2001 From: Stefan Berg Date: Mon, 15 Aug 2022 12:42:04 +0200 Subject: [PATCH 4/4] Adapt scenario --- .../MareSynchronosServerTest/Hubs/MareHubTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs b/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs index 52a2571..e51407a 100644 --- a/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs +++ b/MareSynchronosServer/MareSynchronosServerTest/Hubs/MareHubTest.cs @@ -52,8 +52,8 @@ namespace MareSynchronosServerTest.Hubs { // Non-related data context.ClientPairs.Add(new ClientPair() { UserUID = "User6", OtherUserUID = "User4", IsPaused = true }); - context.ClientPairs.Add(new ClientPair() { UserUID = "User4", OtherUserUID = "User3", IsPaused = true }); - context.ClientPairs.Add(new ClientPair() { UserUID = "User3", OtherUserUID = "User2", IsPaused = true }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User4", OtherUserUID = "User3", IsPaused = false }); + context.ClientPairs.Add(new ClientPair() { UserUID = "User3", OtherUserUID = "User2", IsPaused = false }); context.SaveChanges();