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
VinPropane 2026-06-15 20:32:53 -04:00
parent d5f16f4cf4
commit 2ac804ed6c
2 changed files with 25 additions and 10 deletions

View File

@ -118,6 +118,21 @@ public sealed class InMemoryFactionStandingStoreTests
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]
public void TryApplyStandingDelta_ShouldDenyNonWritablePlayer()
{

View File

@ -48,16 +48,16 @@ public sealed class InMemoryFactionStandingStore(
return DenyRead(FactionStandingReasonCodes.UnknownFaction);
}
if (!CanWritePlayer(player))
{
return DenyRead(FactionStandingReasonCodes.PlayerNotWritable);
}
if (!factionRegistry.TryGetDefinition(faction, out var definition) || definition is null)
{
return DenyRead(FactionStandingReasonCodes.UnknownFaction);
}
if (!CanWritePlayer(player))
{
return DenyRead(FactionStandingReasonCodes.PlayerNotWritable);
}
var key = FactionStandingIds.MakeStandingKey(player, faction);
var raw = standingByKey.GetValueOrDefault(key, 0);
return new FactionStandingReadOutcome(true, null, FactionStandingIds.ClampStanding(raw, definition));
@ -78,16 +78,16 @@ public sealed class InMemoryFactionStandingStore(
return DenyMutation(FactionStandingReasonCodes.UnknownFaction);
}
if (!CanWritePlayer(player))
{
return DenyMutation(FactionStandingReasonCodes.PlayerNotWritable);
}
if (!factionRegistry.TryGetDefinition(faction, out var definition) || definition is null)
{
return DenyMutation(FactionStandingReasonCodes.UnknownFaction);
}
if (!CanWritePlayer(player))
{
return DenyMutation(FactionStandingReasonCodes.PlayerNotWritable);
}
var key = FactionStandingIds.MakeStandingKey(player, faction);
lock (keyLocks.GetOrAdd(key, _ => new object()))
{