// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using FakeItEasy; using Squidex.Infrastructure.Log.Store; using Xunit; namespace Squidex.Domain.Apps.Entities.Apps { public class DefaultAppLogStoreTests { private readonly IRequestLogStore requestLogStore = A.Fake(); private readonly DefaultAppLogStore sut; public DefaultAppLogStoreTests() { sut = new DefaultAppLogStore(requestLogStore); } [Fact] public async Task Should_forward_request_log_to_store() { Request? recordedRequest = null; A.CallTo(() => requestLogStore.LogAsync(A._)) .Invokes((Request request) => recordedRequest = request); var request = default(RequestLog); request.Bytes = 1024; request.Costs = 1.5; request.ElapsedMs = 120; request.RequestMethod = "GET"; request.RequestPath = "/my-path"; request.Timestamp = default; request.UserClientId = "frontend"; request.UserId = "user1"; await sut.LogAsync(Guid.NewGuid(), request); Assert.NotNull(recordedRequest); Assert.Contains(request.Bytes.ToString(), recordedRequest!.Properties.Values); Assert.Contains(request.Costs.ToString(), recordedRequest!.Properties.Values); Assert.Contains(request.ElapsedMs.ToString(), recordedRequest!.Properties.Values); Assert.Contains(request.RequestMethod, recordedRequest!.Properties.Values); Assert.Contains(request.RequestPath, recordedRequest!.Properties.Values); Assert.Contains(request.UserClientId, recordedRequest!.Properties.Values); Assert.Contains(request.UserId, recordedRequest!.Properties.Values); } [Fact] public async Task Should_create_some_stream() { var dateFrom = DateTime.UtcNow.Date.AddDays(-30); var dateTo = DateTime.UtcNow.Date; var appId = Guid.NewGuid(); A.CallTo(() => requestLogStore.QueryAllAsync(A>._, appId.ToString(), dateFrom, dateTo, default)) .Invokes(x => { var callback = x.GetArgument>(0)!; callback(CreateRecord()); callback(CreateRecord()); callback(CreateRecord()); callback(CreateRecord()); }); var stream = new MemoryStream(); await sut.ReadLogAsync(appId, dateFrom, dateTo, stream); stream.Position = 0; var lines = 0; using (var reader = new StreamReader(stream)) { string? line = null; while ((line = reader.ReadLine()) != null) { lines++; } } Assert.Equal(5, lines); } private static Request CreateRecord() { return new Request { Properties = new Dictionary() }; } } }