mirror of
https://github.com/tgstation/tgstation-server.git
synced 2026-08-24 21:46:52 +01:00
User subscription tests
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user