Merge pull request #8 from isbeorn/main
change query so only one query has to be sent in MareHub.OnDisconnectedAsync
This commit is contained in:
@@ -98,16 +98,23 @@ namespace MareSynchronosServer.Hubs
|
|||||||
|
|
||||||
_logger.LogInformation("Disconnect from " + AuthenticatedUserId);
|
_logger.LogInformation("Disconnect from " + AuthenticatedUserId);
|
||||||
|
|
||||||
var otherUsers = await _dbContext.ClientPairs.AsNoTracking()
|
var query =
|
||||||
.Include(u => u.OtherUser)
|
from userToOther in _dbContext.ClientPairs
|
||||||
.Where(self => self.UserUID == user.UID && !self.IsPaused && self.OtherUser.CharacterIdentification != null)
|
join otherToUser in _dbContext.ClientPairs
|
||||||
.Select(e => e.OtherUserUID)
|
on new {
|
||||||
.ToListAsync();
|
user = userToOther.UserUID,
|
||||||
|
other = userToOther.OtherUserUID
|
||||||
|
|
||||||
var otherEntries = await _dbContext.ClientPairs.AsNoTracking()
|
} equals new {
|
||||||
.Where(other => otherUsers.Contains(other.UserUID) && other.OtherUserUID == user.UID && !other.IsPaused)
|
user = otherToUser.OtherUserUID,
|
||||||
.Select(u => u.UserUID)
|
other = otherToUser.UserUID
|
||||||
.ToListAsync();
|
}
|
||||||
|
where
|
||||||
|
userToOther.UserUID == user.UID
|
||||||
|
&& !userToOther.IsPaused
|
||||||
|
&& !otherToUser.IsPaused
|
||||||
|
select otherToUser.UserUID;
|
||||||
|
var otherEntries = await query.ToListAsync();
|
||||||
|
|
||||||
await Clients.Users(otherEntries).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification);
|
await Clients.Users(otherEntries).SendAsync(Api.OnUserRemoveOnlinePairedPlayer, user.CharacterIdentification);
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace MareSynchronosServerTest.Discord {
|
|||||||
[TestCase("https://eu.finalfantasyxiv.com/lodestone/character/1234?myurlparameter=500", 1234)]
|
[TestCase("https://eu.finalfantasyxiv.com/lodestone/character/1234?myurlparameter=500", 1234)]
|
||||||
[TestCase("https://de.finalfantasyxiv.com/lodestone/character/1234/whatever/3456", 1234)]
|
[TestCase("https://de.finalfantasyxiv.com/lodestone/character/1234/whatever/3456", 1234)]
|
||||||
[TestCase("https://na.finalfantasyxiv.com/lodestone/character/1234abcd4321/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<string, string> {
|
var inMemorySettings = new Dictionary<string, string> {
|
||||||
{"DiscordBotToken", "1234"}
|
{"DiscordBotToken", "1234"}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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<MareDbContext>()
|
||||||
|
.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 = false });
|
||||||
|
context.ClientPairs.Add(new ClientPair() { UserUID = "User3", OtherUserUID = "User2", IsPaused = false });
|
||||||
|
|
||||||
|
context.SaveChanges();
|
||||||
|
|
||||||
|
var clientContextMock = new Mock<HubCallerContext>();
|
||||||
|
var claimMock = new Mock<ClaimsPrincipal>();
|
||||||
|
var claim = new Claim(ClaimTypes.NameIdentifier, "User1");
|
||||||
|
claimMock.SetupGet(x => x.Claims).Returns(new List<Claim>() { claim });
|
||||||
|
clientContextMock.SetupGet(x => x.User).Returns(claimMock.Object);
|
||||||
|
|
||||||
|
var clientsMock = new Mock<IHubCallerClients>();
|
||||||
|
var clientProxyMock = new Mock<IClientProxy>();
|
||||||
|
clientsMock.Setup(x => x.Users(It.IsAny<IReadOnlyList<string>>())).Returns(clientProxyMock.Object);
|
||||||
|
|
||||||
|
var hub = new MareHub(context, new Mock<ILogger<MareHub>>().Object, null, new Mock<IConfiguration>().Object, new Mock<IHttpContextAccessor>().Object);
|
||||||
|
|
||||||
|
|
||||||
|
hub.Clients = clientsMock.Object;
|
||||||
|
hub.Context = clientContextMock.Object;
|
||||||
|
|
||||||
|
await hub.OnDisconnectedAsync(new Exception("Test Exception"));
|
||||||
|
|
||||||
|
clientsMock.Verify(x => x.Users(It.Is<IReadOnlyList<string>>(x => x.Count() == 2 && x[0] == "User2" && x[1] == "User3")), Times.Once);
|
||||||
|
clientProxyMock.Verify(x => x.SendCoreAsync(It.IsAny<string>(), It.Is<object[]>(o => (string)o[0] == "Ident1"), It.IsAny<CancellationToken>()), Times.Once);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentAssertions" Version="6.7.0" />
|
<PackageReference Include="FluentAssertions" Version="6.7.0" />
|
||||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.8" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
|
||||||
<PackageReference Include="Moq" Version="4.18.2" />
|
<PackageReference Include="Moq" Version="4.18.2" />
|
||||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||||
|
|||||||
Reference in New Issue
Block a user