User subscription tests

This commit is contained in:
Jordan Dominion
2024-09-24 21:30:02 -04:00
parent 33c2e534b3
commit 333e896ef8
6 changed files with 36 additions and 5 deletions
@@ -0,0 +1,5 @@
subscription SubscribeUsers {
userUpdated {
id
}
}
@@ -9,8 +9,6 @@ using HotChocolate.Subscriptions;
using HotChocolate.Types;
using HotChocolate.Types.Relay;
using Microsoft.Extensions.Hosting;
using Tgstation.Server.Api.Rights;
using Tgstation.Server.Host.GraphQL.Types;
using Tgstation.Server.Host.Security;
@@ -57,13 +55,11 @@ namespace Tgstation.Server.Host.GraphQL.Subscriptions
public ValueTask<ISourceStream<User>> UserUpdatedStream(
[ID(nameof(User))] long? userId,
[Service] ITopicEventReceiver receiver,
[Service] IHostApplicationLifetime applicationLifetime,
CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(receiver);
var topic = userId.HasValue ? SpecificUserUpdatedTopic(userId.Value) : UserUpdatedTopic;
var cts = CancellationTokenSource.CreateLinkedTokenSource(applicationLifetime.ApplicationStopping, cancellationToken);
return receiver.SubscribeAsync<User>(topic, cts.Token);
return receiver.SubscribeAsync<User>(topic, cancellationToken);
}
/// <summary>
@@ -19,5 +19,16 @@ namespace Tgstation.Server.Tests.Live
Func<TRestResult, TGraphQLResult, bool> comparison,
CancellationToken cancellationToken)
where TGraphQLResult : class;
/// <summary>
/// Subcribes to the GraphQL subscription indicated by <paramref name="operationExecutor"/>.
/// </summary>
/// <typeparam name="TResultData">The <see cref="Type"/> of the <see cref="IOperationResult{TResultData}"/>'s <see cref="IOperationResult{TResultData}.Data"/>.</typeparam>
/// <param name="operationExecutor">A <see cref="Func{T, TResult}"/> which initiates a single subscription on a given <see cref="IGraphQLClient"/> and returns a <see cref="ValueTask{TResult}"/> resulting in the <typeparamref name="TResultData"/> <see cref="IOperationResult{TResultData}"/> <see cref="IObservable{T}"/>.</param>
/// <param name="observer">The <see cref="IObserver{T}"/> for <typeparamref name="TResultData"/> <see cref="IOperationResult{TResultData}"/>s.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation.</param>
/// <returns>A <see cref="ValueTask{TResult}"/> resulting in the <see cref="IDisposable"/> representing the lifetime of the subscription.</returns>
ValueTask<IDisposable> Subscribe<TResultData>(Func<IGraphQLClient, IObservable<IOperationResult<TResultData>>> operationExecutor, IObserver<IOperationResult<TResultData>> observer, CancellationToken cancellationToken)
where TResultData : class;
}
}
@@ -58,5 +58,8 @@ namespace Tgstation.Server.Tests.Live
return (restResult, graphQLResult.Data);
}
public ValueTask<IDisposable> Subscribe<TResultData>(Func<IGraphQLClient, IObservable<IOperationResult<TResultData>>> operationExecutor, IObserver<IOperationResult<TResultData>> observer, CancellationToken cancellationToken) where TResultData : class
=> GraphQLClient.Subscribe(operationExecutor, observer, cancellationToken);
}
}
@@ -1466,6 +1466,11 @@ namespace Tgstation.Server.Tests.Live
InstanceResponse odInstance, compatInstance;
if (!openDreamOnly)
{
// force a session refresh if necessary
await firstAdminMultiClient.GraphQLClient.RunQueryEnsureNoErrors(
gql => gql.ReadCurrentUser.ExecuteAsync(cancellationToken),
cancellationToken);
jobsHubTestTask = FailFast(await jobsHubTest.Run(cancellationToken)); // returns Task<Task>
var rootTest = FailFast(RawRequestTests.Run(restClientFactory, firstAdminRestClient, cancellationToken));
var adminTest = FailFast(new AdministrationTest(firstAdminRestClient.Administration).Run(cancellationToken));
@@ -34,12 +34,23 @@ namespace Tgstation.Server.Tests.Live
public async ValueTask Run(CancellationToken cancellationToken)
{
var observer = new HoldLastObserver<IOperationResult<ISubscribeUsersResult>>();
using var subscription = await serverClient.Subscribe(
gql => gql.SubscribeUsers.Watch(),
observer,
cancellationToken);
await ValueTaskExtensions.WhenAll(
BasicTests(cancellationToken),
TestCreateSysUser(cancellationToken),
TestSpamCreation(cancellationToken));
await TestPagination(cancellationToken);
Assert.IsFalse(observer.Completed);
Assert.AreEqual(0U, observer.ErrorCount);
Assert.AreEqual(new PlatformIdentifier().IsWindows ? 108U : 107U, observer.ResultCount); // sys user
observer.LastValue.EnsureNoErrors();
}
async ValueTask BasicTests(CancellationToken cancellationToken)