// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using FakeItEasy; using GraphQL; using GraphQL.DataLoader; using GraphQL.Execution; using GraphQL.NewtonsoftJson; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Squidex.Caching; using Squidex.Domain.Apps.Core; using Squidex.Domain.Apps.Core.TestHelpers; using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types; using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Primitives; using Squidex.Domain.Apps.Entities.Contents.TestData; using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Domain.Apps.Entities.TestHelpers; using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Json; using Squidex.Shared; using Squidex.Shared.Users; using Xunit; #pragma warning disable SA1401 // Fields must be private namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { public class GraphQLTestBase : IClassFixture { protected readonly IJsonSerializer serializer = TestUtils.CreateSerializer(TypeNameHandling.None, new ExecutionResultJsonConverter(new ErrorInfoProvider())); protected readonly IAssetQueryService assetQuery = A.Fake(); protected readonly ICommandBus commandBus = A.Fake(); protected readonly IContentQueryService contentQuery = A.Fake(); protected readonly IUserResolver userResolver = A.Fake(); protected readonly Context requestContext; private CachingGraphQLResolver sut; public GraphQLTestBase() { A.CallTo(() => userResolver.QueryManyAsync(A._, default)) .ReturnsLazily(x => { var ids = x.GetArgument(0)!; var users = ids.Select(id => UserMocks.User(id, $"{id}@email.com", $"name_{id}")); return Task.FromResult(users.ToDictionary(x => x.Id)); }); requestContext = new Context(Mocks.FrontendUser(), TestApp.Default); } protected void AssertResult(object expected, ExecutionResult result) { var resultJson = serializer.Serialize(result, true); var expectJson = serializer.Serialize(expected, true); Assert.Equal(expectJson, resultJson); } protected Task ExecuteAsync(ExecutionOptions options, string? permissionId = null) { var context = requestContext; if (permissionId != null) { var permission = Permissions.ForApp(permissionId, TestApp.Default.Name, TestSchemas.DefaultId.Name).Id; context = new Context(Mocks.FrontendUser(permission: permission), TestApp.Default); } return ExcecuteAsync(options, context); } private async Task ExcecuteAsync(ExecutionOptions options, Context context) { sut ??= CreateSut(TestSchemas.Default, TestSchemas.Ref1, TestSchemas.Ref2); options.UserContext = ActivatorUtilities.CreateInstance(sut.Services, context)!; foreach (var listener in sut.Services.GetRequiredService>()) { options.Listeners.Add(listener); } await sut.ConfigureAsync(options); return await new DocumentExecuter().ExecuteAsync(options); } protected CachingGraphQLResolver CreateSut(params ISchemaEntity[] schemas) { var cache = new BackgroundCache(new MemoryCache(Options.Create(new MemoryCacheOptions()))); var appProvider = A.Fake(); A.CallTo(() => appProvider.GetSchemasAsync(TestApp.Default.Id, default)) .Returns(schemas.ToList()); var services = new ServiceCollection() .AddMemoryCache() .AddTransient() .Configure(x => { x.CanCache = true; }) .Configure(x => { x.CanCache = true; }) .AddSingleton() .AddSingleton() .AddTransient() .AddTransient() .AddSingleton() .AddSingleton(A.Fake()) .AddSingleton(appProvider) .AddSingleton(assetQuery) .AddSingleton(commandBus) .AddSingleton(contentQuery) .AddSingleton(userResolver) .AddSingleton() .AddSingleton() .AddSingleton() .BuildServiceProvider(); var schemasHash = A.Fake(); return new CachingGraphQLResolver(cache, schemasHash, services, Options.Create(new GraphQLOptions())); } } }