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);
|
||||
}
|
||||
|
||||
[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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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()))
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue