NEO-135: validate faction before player gate in in-memory store
Match PostgresFactionStandingStore check order so unknown faction ids return unknown_faction even when the player is not writable.pull/174/head
parent
d5f16f4cf4
commit
2ac804ed6c
|
|
@ -118,6 +118,21 @@ public sealed class InMemoryFactionStandingStoreTests
|
||||||
Assert.Equal(0, store.TryGetStanding(PlayerId, GridFactionId).Standing);
|
Assert.Equal(0, store.TryGetStanding(PlayerId, GridFactionId).Standing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void TryGetStanding_ShouldPreferUnknownFaction_WhenPlayerNotWritableAndFactionUnknown()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var store = CreateStore();
|
||||||
|
// Act
|
||||||
|
var read = store.TryGetStanding(UnknownPlayerId, "not_a_real_faction");
|
||||||
|
var write = store.TryApplyStandingDelta(UnknownPlayerId, "not_a_real_faction", 5);
|
||||||
|
// Assert
|
||||||
|
Assert.False(read.Success);
|
||||||
|
Assert.Equal(FactionStandingReasonCodes.UnknownFaction, read.ReasonCode);
|
||||||
|
Assert.False(write.Success);
|
||||||
|
Assert.Equal(FactionStandingReasonCodes.UnknownFaction, write.ReasonCode);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void TryApplyStandingDelta_ShouldDenyNonWritablePlayer()
|
public void TryApplyStandingDelta_ShouldDenyNonWritablePlayer()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -48,16 +48,16 @@ public sealed class InMemoryFactionStandingStore(
|
||||||
return DenyRead(FactionStandingReasonCodes.UnknownFaction);
|
return DenyRead(FactionStandingReasonCodes.UnknownFaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CanWritePlayer(player))
|
|
||||||
{
|
|
||||||
return DenyRead(FactionStandingReasonCodes.PlayerNotWritable);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!factionRegistry.TryGetDefinition(faction, out var definition) || definition is null)
|
if (!factionRegistry.TryGetDefinition(faction, out var definition) || definition is null)
|
||||||
{
|
{
|
||||||
return DenyRead(FactionStandingReasonCodes.UnknownFaction);
|
return DenyRead(FactionStandingReasonCodes.UnknownFaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!CanWritePlayer(player))
|
||||||
|
{
|
||||||
|
return DenyRead(FactionStandingReasonCodes.PlayerNotWritable);
|
||||||
|
}
|
||||||
|
|
||||||
var key = FactionStandingIds.MakeStandingKey(player, faction);
|
var key = FactionStandingIds.MakeStandingKey(player, faction);
|
||||||
var raw = standingByKey.GetValueOrDefault(key, 0);
|
var raw = standingByKey.GetValueOrDefault(key, 0);
|
||||||
return new FactionStandingReadOutcome(true, null, FactionStandingIds.ClampStanding(raw, definition));
|
return new FactionStandingReadOutcome(true, null, FactionStandingIds.ClampStanding(raw, definition));
|
||||||
|
|
@ -78,16 +78,16 @@ public sealed class InMemoryFactionStandingStore(
|
||||||
return DenyMutation(FactionStandingReasonCodes.UnknownFaction);
|
return DenyMutation(FactionStandingReasonCodes.UnknownFaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CanWritePlayer(player))
|
|
||||||
{
|
|
||||||
return DenyMutation(FactionStandingReasonCodes.PlayerNotWritable);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!factionRegistry.TryGetDefinition(faction, out var definition) || definition is null)
|
if (!factionRegistry.TryGetDefinition(faction, out var definition) || definition is null)
|
||||||
{
|
{
|
||||||
return DenyMutation(FactionStandingReasonCodes.UnknownFaction);
|
return DenyMutation(FactionStandingReasonCodes.UnknownFaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!CanWritePlayer(player))
|
||||||
|
{
|
||||||
|
return DenyMutation(FactionStandingReasonCodes.PlayerNotWritable);
|
||||||
|
}
|
||||||
|
|
||||||
var key = FactionStandingIds.MakeStandingKey(player, faction);
|
var key = FactionStandingIds.MakeStandingKey(player, faction);
|
||||||
lock (keyLocks.GetOrAdd(key, _ => new object()))
|
lock (keyLocks.GetOrAdd(key, _ => new object()))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue