mirror of https://github.com/Squidex/squidex.git
12 changed files with 219 additions and 17 deletions
@ -0,0 +1,160 @@ |
|||||
|
// ==========================================================================
|
||||
|
// Squidex Headless CMS
|
||||
|
// ==========================================================================
|
||||
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
||||
|
// All rights reserved. Licensed under the MIT license.
|
||||
|
// ==========================================================================
|
||||
|
|
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
using FakeItEasy; |
||||
|
using FluentAssertions; |
||||
|
using NodaTime; |
||||
|
using Squidex.Domain.Apps.Events.Assets; |
||||
|
using Squidex.Infrastructure; |
||||
|
using Squidex.Infrastructure.EventSourcing; |
||||
|
using Squidex.Infrastructure.UsageTracking; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Squidex.Domain.Apps.Entities.Assets |
||||
|
{ |
||||
|
public class AssetUsageTrackerTests |
||||
|
{ |
||||
|
private readonly IUsageTracker usageTracker = A.Fake<IUsageTracker>(); |
||||
|
private readonly NamedId<DomainId> appId = NamedId.Of(DomainId.NewGuid(), "my-app"); |
||||
|
private readonly AssetUsageTracker sut; |
||||
|
|
||||
|
public AssetUsageTrackerTests() |
||||
|
{ |
||||
|
sut = new AssetUsageTracker(usageTracker); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_return_assets_filter_for_events_filter() |
||||
|
{ |
||||
|
IEventConsumer consumer = sut; |
||||
|
|
||||
|
Assert.Equal("^asset-", consumer.EventsFilter); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_do_nothing_on_clear() |
||||
|
{ |
||||
|
IEventConsumer consumer = sut; |
||||
|
|
||||
|
await consumer.ClearAsync(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_return_type_name_for_name() |
||||
|
{ |
||||
|
IEventConsumer consumer = sut; |
||||
|
|
||||
|
Assert.Equal(nameof(AssetUsageTracker), consumer.Name); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_get_total_size_from_summary_date() |
||||
|
{ |
||||
|
A.CallTo(() => usageTracker.GetAsync($"{appId.Id}_Assets", default, default, null)) |
||||
|
.Returns(new Counters { ["TotalSize"] = 2048 }); |
||||
|
|
||||
|
var size = await sut.GetTotalSizeAsync(appId.Id); |
||||
|
|
||||
|
Assert.Equal(2048, size); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineData("*")] |
||||
|
[InlineData("Default")] |
||||
|
public async Task Should_get_counters_from_categories(string category) |
||||
|
{ |
||||
|
var dateFrom = new DateTime(2018, 01, 05); |
||||
|
var dateTo = dateFrom.AddDays(3); |
||||
|
|
||||
|
A.CallTo(() => usageTracker.QueryAsync($"{appId.Id}_Assets", dateFrom, dateTo)) |
||||
|
.Returns(new Dictionary<string, List<(DateTime, Counters)>> |
||||
|
{ |
||||
|
[category] = new List<(DateTime, Counters)> |
||||
|
{ |
||||
|
(dateFrom.AddDays(0), new Counters |
||||
|
{ |
||||
|
["TotalSize"] = 128, |
||||
|
["TotalAssets"] = 2, |
||||
|
}), |
||||
|
(dateFrom.AddDays(1), new Counters |
||||
|
{ |
||||
|
["TotalSize"] = 256, |
||||
|
["TotalAssets"] = 3, |
||||
|
}), |
||||
|
(dateFrom.AddDays(2), new Counters |
||||
|
{ |
||||
|
["TotalSize"] = 512, |
||||
|
["TotalAssets"] = 4, |
||||
|
}) |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
var result = await sut.QueryAsync(appId.Id, dateFrom, dateTo); |
||||
|
|
||||
|
result.Should().BeEquivalentTo(new List<AssetStats> |
||||
|
{ |
||||
|
new AssetStats(dateFrom.AddDays(0), 2, 128), |
||||
|
new AssetStats(dateFrom.AddDays(1), 3, 256), |
||||
|
new AssetStats(dateFrom.AddDays(2), 4, 512), |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public static IEnumerable<object[]> EventData() |
||||
|
{ |
||||
|
yield return new object[] |
||||
|
{ |
||||
|
new AssetCreated { FileSize = 128 }, 128, 1 |
||||
|
}; |
||||
|
|
||||
|
yield return new object[] |
||||
|
{ |
||||
|
new AssetUpdated { FileSize = 512 }, 512, 0 |
||||
|
}; |
||||
|
|
||||
|
yield return new object[] |
||||
|
{ |
||||
|
new AssetDeleted { DeletedSize = 512 }, -512, -1 |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(EventData))] |
||||
|
public async Task Should_increase_usage_when_asset_created(AssetEvent @event, long sizeDiff, long countDiff) |
||||
|
{ |
||||
|
var date = DateTime.UtcNow.Date.AddDays(13); |
||||
|
|
||||
|
@event.AppId = appId; |
||||
|
|
||||
|
var envelope = |
||||
|
Envelope.Create(@event) |
||||
|
.SetTimestamp(Instant.FromDateTimeUtc(date)); |
||||
|
|
||||
|
Counters? countersSummary = null; |
||||
|
Counters? countersDate = null; |
||||
|
|
||||
|
A.CallTo(() => usageTracker.TrackAsync(default, $"{appId.Id}_Assets", null, A<Counters>._)) |
||||
|
.Invokes(x => countersSummary = x.GetArgument<Counters>(3)); |
||||
|
|
||||
|
A.CallTo(() => usageTracker.TrackAsync(date, $"{appId.Id}_Assets", null, A<Counters>._)) |
||||
|
.Invokes(x => countersDate = x.GetArgument<Counters>(3)); |
||||
|
|
||||
|
await sut.On(envelope); |
||||
|
|
||||
|
var expected = new Counters |
||||
|
{ |
||||
|
["TotalSize"] = sizeDiff, |
||||
|
["TotalAssets"] = countDiff |
||||
|
}; |
||||
|
|
||||
|
countersSummary.Should().BeEquivalentTo(expected); |
||||
|
countersDate.Should().BeEquivalentTo(expected); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
.button-container { |
||||
|
display: inline-block; |
||||
|
max-width: none; |
||||
|
min-width: 5rem; |
||||
|
} |
||||
|
|
||||
|
sqx-language-selector { |
||||
|
text-align: right; |
||||
|
} |
||||
Loading…
Reference in new issue