tests/SboxSuperuser.Contracts.Tests/ConfiguredStoreTests.cs

Unit tests for ConfiguredAdminStore behavior. It defines a fake backend and tests write/read behavior, cancellation, provider absence, payload validation, and backup metadata validation.

File Access
using SboxSuperuser.Engine.Storage;
using Xunit;

namespace SboxSuperuser.Contracts.Tests;

public sealed class ConfiguredStoreTests
{
	private sealed class Backend : IAdminStorageBackend
	{
		internal Func<Task<StoreWriteResult>> Write;
		internal StoreReadResult Read = new( StoreReadStatus.Missing );
		internal int Calls;
		public Task<StoreReadResult> ReadAsync( StoreKey key, int schema, CancellationToken cancellation ) => Task.FromResult( Read );
		public Task<StoreWriteResult> WriteAsync( StoreWriteRequest request, CancellationToken cancellation ) { Calls++; return Write(); }
		public Task<StoreBackupList> GetBackupsAsync( StoreKey key, CancellationToken cancellation )
			=> Task.FromResult( new StoreBackupList( StoreReadStatus.Missing, 0, Array.Empty<StoreBackup>(), false ) );
		public Task<StoreWriteResult> RecoverAsync( StoreKey key, Guid generation, long revision, AuditIntent intent, CancellationToken cancellation ) => Write();
		public Task<StoreRetentionResult> PruneAuditHistoryAsync( long revision, CancellationToken cancellation )
			=> Task.FromResult( new StoreRetentionResult( StoreWriteStatus.Committed ) );
	}

	private static StoreWriteRequest Request()
	{
		var intent = new AuditIntent( Guid.NewGuid(), Guid.NewGuid(), ActorKind.Player, DispatcherRig.OwnerId,
			CommandOrigin.Interface, "test.write", DateTimeOffset.UtcNow );
		return new PolicyTransaction( "{}", new[] { intent } ).CreateWriteRequest( new StoreKey( "example", "state" ), 0 );
	}

	[Theory]
	[InlineData( StoreWriteStatus.Committed )]
	[InlineData( StoreWriteStatus.Unknown )]
	[InlineData( StoreWriteStatus.Conflict )]
	[InlineData( StoreWriteStatus.Corrupt )]
	public async Task UncertainOrSuccessfulCustomWritesInvalidateCachedAuthority( StoreWriteStatus status )
	{
		var backend = new Backend { Write = () => Task.FromResult( new StoreWriteResult( status, status == StoreWriteStatus.Committed ? 1 : null ) ) };
		var store = new ConfiguredAdminStore( backend, () => true, _ => { } );
		var changes = 0;
		store.StorageChanged += _ => changes++;
		Assert.Equal( status, (await store.WriteAsync( Request(), default )).Status );
		Assert.Equal( 1, changes );
	}

	[Fact]
	public async Task ProviderExceptionOrWrongRevisionNeverClaimsCommit()
	{
		var backend = new Backend { Write = () => throw new OperationCanceledException() };
		var store = new ConfiguredAdminStore( backend, () => true, _ => { } );
		Assert.Equal( StoreWriteStatus.Unknown, (await store.WriteAsync( Request(), default )).Status );
		backend.Write = () => Task.FromResult( new StoreWriteResult( StoreWriteStatus.Committed, 9 ) );
		Assert.Equal( StoreWriteStatus.Unknown, (await store.WriteAsync( Request(), default )).Status );
	}

	[Fact]
	public async Task RetiredRuntimeAndPrecancelledWritesNeverCallBackend()
	{
		var backend = new Backend();
		var active = false;
		var store = new ConfiguredAdminStore( backend, () => active, _ => { } );
		Assert.Equal( StoreWriteStatus.Unavailable, (await store.WriteAsync( Request(), default )).Status );
		active = true;
		Assert.Equal( StoreWriteStatus.Cancelled, (await store.WriteAsync( Request(), new CancellationToken( true ) )).Status );
		Assert.Equal( 0, backend.Calls );
	}

	[Fact]
	public async Task NullProviderAndInvalidPayloadFailClosed()
	{
		var missing = new ConfiguredAdminStore( null, () => true, _ => { } );
		Assert.Equal( StoreReadStatus.Unavailable, (await missing.ReadAsync( new StoreKey( "security", "policy" ), 1, default )).Status );
		var backend = new Backend { Read = new StoreReadResult( StoreReadStatus.Found, new VersionedStoreDocument( 1, 1, "not json" ) ) };
		var store = new ConfiguredAdminStore( backend, () => true, _ => { } );
		Assert.Equal( StoreReadStatus.Corrupt, (await store.ReadAsync( new StoreKey( "security", "policy" ), 1, default )).Status );
	}

	[Fact]
	public void BackupResultsRequireBoundedValidMetadata()
	{
		Assert.Throws<ArgumentException>( () => new StoreBackup( Guid.Empty, 1, 1 ) );
		Assert.Throws<ArgumentException>( () => new StoreBackupList( StoreReadStatus.Found, 1, new[] { new StoreBackup( Guid.NewGuid(), 2, 1 ) }, false ) );
	}
}