* Removed obsoletes from IConfigManipulator. * Removed obsolete models builder extensions. * Removed the obsolete ContentDashboardSettings. * Removed the obsolete InstallMissingDatabase setting on GlobalSettings. * Removed obsolete NuCache settings. * Removed obsolete RuntimeMinificationSettings. * Removed obsolete health check constant. * Removed obsolete icon constant. * Removed obsolete telemetry constant. * Removed obsolete property and constructor on UmbracoBuilder. * Removed obsolete constructor on AuditNotificationsHandler. * Removed obsolete constructor on HTTP header health checks. * Removed obsolete constructor on MediaFileManager. * Removed obsolete GetDefaultFileContent on ViewHelper. * Remove obsoleted methods on embed providers. * Fix tests. * Removed obsolete constructors on BlockEditorDataConverter. * Removed obsolete SeedCacheDuration property on CacheSettings. * Removed obsolete PublishCulture on ContentRepositoryExtensions. * Removed obsolete MonitorLock. * Removed obsolete synchronous HasSavedValues from IDataTypeUsageService and IDataTypeUsageRepository. * Removed obsolete HasSavedPropertyValues from IPropertyTypeUsageService and IPropertyTypeUsageRepository. * Removed obsolete methods in ITrackedReferencesService and ITrackedReferencesRepository. * Removed obsolete DateValueEditor constructors. * Removed obsolete GetAutomaticRelationTypesAliases. * Removed obsolete constructor on TextOnlyValueEditor. * Removed obsolete constructors on RegexValidator and RequiredValidator. * Removed obsolete constructs on SliderValueConverter and TagsValueConverter. * Removed obsolete GetContentType methods from IPublishedCache. * Removed ContentFinderByIdPath. * Removed obsolete constructor on DefaultMediaUrlProvider. * Removed obsolete constructor on Domain. * Removed obsolete constructor on PublishedRequest. * Removed obsolete methods on CheckPermissions. * Removed obsolete GetUserId from IBackOfficeSecurity. * Removed obsolete methods on LegacyPasswordSecurity. * Removed obsolete constructors on AuditService. * Removed obsolete methods on IContentEditingService. * Remove obsolete constructors and methods on ContentService/IContentService. * Removed obsolete constructor in ContentTypeEditingService. * Removed obsolete constructor in MediaTypeEditingService. * Removed obsolete constructor in MemberTypeEditingService. * Removed obsolete constructor in ContentTypeService. * Removed obsolete constructors in ContentTypeServiceBase. * Removed obsolete constructors and methods in ContentVersionService. * Removed obsolete constructor in DataTypeUsageService. * Removed obsolete constructor in DomainService. * Removed obsolete constructor in FileService. * Removes obsolete AttemptMove from IContentService. * Removes obsolete SetPreventCleanup from IContentVersionService. * Removes obsolete GetReferences from IDataTypeService. * Removed obsolete SetConsentLevel from IMetricsConsentService. * Removed obsolete methods from IPackageDataInstallation. * Removed obsolete methods from IPackagingService. * Removed obsolete methods on ITwoFactorLoginService. Removed obsolete ITemporaryMediaService. * Removed obsolete constructor from MediaService, MemberTypeService and MediaTypeService. * More obsolete constructors. * Removed obsoleted overloads on IPropertyValidationService. * Fixed build for tests. * Removed obsolete constructor for PublicAccessService, UserService and RelationService. * Removed GetDefaultMemberType. * Removed obsolete user group functionality from IUserService. * Removed obsolete extension methods on IUserService. * Removed obsolete method from ITelemetryService. * Removed obsolete UdiParserServiceConnectors. * Removed obsolete method on ICookieManager. * Removed obsolete DynamicContext. * Removed obsolete XmlHelper. * Fixed failing integration tests. * Removed obsoletes in Umbraco.Cms.Api.Common * Removed obsoletes in Umbraco.Cms.Api.Delivery * Removed obsoletes in Umbraco.Cms.Api.Management * Removed obsoletes in Umbraco.Examine.Lucene * Removed obsoletes in Umbraco.Infrastructure * Fix failing delivery API contract integration test. * Made integration tests internal. * Removed obsoletes from web projects. * Fix build. * Removed Twitter OEmbed provider * Removed obsolete constructor on PublishedDataType. * Removed obsolete constructors on PublishedCacheBase. * Removed the obsolete PropertyEditorTagsExtensions. * Removed obsoletion properties on configuration response models (#18697) * Removed obsolete methods from server-side models. * Update client-side types and sdk. * Update client-side files. * Removed obsoletion of Utf8ToAsciiConverter.ToAsciiString overload. (#18694) * Removed obsolete method in UserService. (#18710) * Removed obsoleted group alias keys from being publicly available. (#18682) * Removed unneceessary ApiVersion attribute. * Clean-up obsoletions on MemberService (#18703) * Removed obsoleted method on MemberService, added future obsoletion to interface and updated all callers. * Removed obsoletion on member service method that's not obsolete on the interface.
346 lines
12 KiB
C#
346 lines
12 KiB
C#
// Copyright (c) Umbraco.
|
|
// See LICENSE for more details.
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using NUnit.Framework;
|
|
using Umbraco.Cms.Core;
|
|
using Umbraco.Cms.Core.Models;
|
|
using Umbraco.Cms.Core.Models.ContentEditing;
|
|
using Umbraco.Cms.Core.Models.Membership;
|
|
using Umbraco.Cms.Core.Services;
|
|
using Umbraco.Cms.Infrastructure.Telemetry.Providers;
|
|
using Umbraco.Cms.Tests.Common.Builders;
|
|
using Umbraco.Cms.Tests.Common.Builders.Extensions;
|
|
using Umbraco.Cms.Tests.Common.Testing;
|
|
using Umbraco.Cms.Tests.Integration.Testing;
|
|
|
|
namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Services;
|
|
|
|
/// <summary>
|
|
/// Tests covering the SectionService
|
|
/// </summary>
|
|
[TestFixture]
|
|
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
|
|
internal sealed class TelemetryProviderTests : UmbracoIntegrationTest
|
|
{
|
|
private IContentTypeService ContentTypeService => GetRequiredService<IContentTypeService>();
|
|
|
|
private IFileService FileService => GetRequiredService<IFileService>();
|
|
|
|
private IDomainService DomainService => GetRequiredService<IDomainService>();
|
|
|
|
private IContentService ContentService => GetRequiredService<IContentService>();
|
|
|
|
private DomainTelemetryProvider DetailedTelemetryProviders => GetRequiredService<DomainTelemetryProvider>();
|
|
|
|
private ContentTelemetryProvider ContentTelemetryProvider => GetRequiredService<ContentTelemetryProvider>();
|
|
|
|
private LanguagesTelemetryProvider LanguagesTelemetryProvider => GetRequiredService<LanguagesTelemetryProvider>();
|
|
|
|
private UserTelemetryProvider UserTelemetryProvider => GetRequiredService<UserTelemetryProvider>();
|
|
|
|
private MediaTelemetryProvider MediaTelemetryProvider => GetRequiredService<MediaTelemetryProvider>();
|
|
|
|
private PropertyEditorTelemetryProvider PropertyEditorTelemetryProvider =>
|
|
GetRequiredService<PropertyEditorTelemetryProvider>();
|
|
|
|
private ILanguageService LanguageService => GetRequiredService<ILanguageService>();
|
|
|
|
private IUserService UserService => GetRequiredService<IUserService>();
|
|
|
|
private IUserGroupService UserGroupService => GetRequiredService<IUserGroupService>();
|
|
|
|
private IMediaService MediaService => GetRequiredService<IMediaService>();
|
|
|
|
private IMediaTypeService MediaTypeService => GetRequiredService<IMediaTypeService>();
|
|
|
|
private readonly LanguageBuilder _languageBuilder = new();
|
|
|
|
private readonly UserBuilder _userBuilder = new();
|
|
|
|
private readonly UserGroupBuilder _userGroupBuilder = new();
|
|
|
|
private readonly ContentTypeBuilder _contentTypeBuilder = new();
|
|
|
|
protected override void CustomTestSetup(IUmbracoBuilder builder)
|
|
{
|
|
builder.Services.AddTransient<DomainTelemetryProvider>();
|
|
builder.Services.AddTransient<ContentTelemetryProvider>();
|
|
builder.Services.AddTransient<LanguagesTelemetryProvider>();
|
|
builder.Services.AddTransient<UserTelemetryProvider>();
|
|
builder.Services.AddTransient<MediaTelemetryProvider>();
|
|
builder.Services.AddTransient<PropertyEditorTelemetryProvider>();
|
|
base.CustomTestSetup(builder);
|
|
}
|
|
|
|
[Test]
|
|
public async Task Domain_Telemetry_Provider_Can_Get_Domains()
|
|
{
|
|
// Arrange
|
|
var contentType = ContentTypeBuilder.CreateBasicContentType();
|
|
ContentTypeService.Save(contentType);
|
|
|
|
var content = ContentBuilder.CreateBasicContent(contentType);
|
|
ContentService.Save(content);
|
|
|
|
await DomainService.UpdateDomainsAsync(
|
|
content.Key,
|
|
new DomainsUpdateModel
|
|
{
|
|
Domains = new[] { new DomainModel { DomainName = "english", IsoCode = "en-US" } }
|
|
});
|
|
|
|
// Act
|
|
IEnumerable<UsageInformation> result = DetailedTelemetryProviders.GetInformation();
|
|
|
|
// Assert
|
|
Assert.AreEqual(1, result.First().Data);
|
|
Assert.AreEqual("DomainCount", result.First().Name);
|
|
}
|
|
|
|
[Test]
|
|
public void SectionService_Can_Get_Allowed_Sections_For_User()
|
|
{
|
|
// Arrange
|
|
var template = TemplateBuilder.CreateTextPageTemplate();
|
|
FileService.SaveTemplate(template);
|
|
|
|
var contentType = ContentTypeBuilder.CreateTextPageContentType(defaultTemplateId: template.Id);
|
|
ContentTypeService.Save(contentType);
|
|
|
|
var blueprint = ContentBuilder.CreateTextpageContent(contentType, "hello", Constants.System.Root);
|
|
blueprint.SetValue("title", "blueprint 1");
|
|
blueprint.SetValue("bodyText", "blueprint 2");
|
|
blueprint.SetValue("keywords", "blueprint 3");
|
|
blueprint.SetValue("description", "blueprint 4");
|
|
|
|
ContentService.SaveBlueprint(blueprint);
|
|
|
|
var fromBlueprint = ContentService.CreateContentFromBlueprint(blueprint, "My test content");
|
|
ContentService.Save(fromBlueprint);
|
|
|
|
IEnumerable<UsageInformation> result = null;
|
|
// Act
|
|
result = ContentTelemetryProvider.GetInformation();
|
|
|
|
|
|
// Assert
|
|
// TODO : Test multiple roots, with children + grandchildren
|
|
Assert.AreEqual(1, result.First().Data);
|
|
}
|
|
|
|
[Test]
|
|
public async Task Language_Telemetry_Can_Get_Languages()
|
|
{
|
|
// Arrange
|
|
var langTwo = _languageBuilder.WithCultureInfo("da-DK").Build();
|
|
var langThree = _languageBuilder.WithCultureInfo("sv-SE").Build();
|
|
|
|
var langTwoResult = await LanguageService.CreateAsync(langTwo, Constants.Security.SuperUserKey);
|
|
Assert.IsTrue(langTwoResult.Success);
|
|
var langThreeResult = await LanguageService.CreateAsync(langThree, Constants.Security.SuperUserKey);
|
|
Assert.IsTrue(langThreeResult.Success);
|
|
|
|
IEnumerable<UsageInformation> result = null;
|
|
|
|
// Act
|
|
result = LanguagesTelemetryProvider.GetInformation();
|
|
|
|
// Assert
|
|
Assert.AreEqual(3, result.First().Data);
|
|
}
|
|
|
|
[Test]
|
|
public void MediaTelemetry_Can_Get_Media_In_Folders()
|
|
{
|
|
var folderType = MediaTypeService.Get(1031);
|
|
var imageMediaType = MediaTypeService.Get(1032);
|
|
|
|
var root = MediaBuilder.CreateMediaFolder(folderType, -1);
|
|
MediaService.Save(root);
|
|
var createdMediaCount = 10;
|
|
for (var i = 0; i < createdMediaCount; i++)
|
|
{
|
|
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, root.Id);
|
|
MediaService.Save(c1);
|
|
}
|
|
|
|
var result = MediaTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.MediaCount);
|
|
Assert.AreEqual(createdMediaCount, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public void MediaTelemetry_Can_Get_Media_In_Root()
|
|
{
|
|
var imageMediaType = MediaTypeService.Get(1032);
|
|
var createdMediaCount = 10;
|
|
for (var i = 0; i < createdMediaCount; i++)
|
|
{
|
|
var c1 = MediaBuilder.CreateMediaImage(imageMediaType, -1);
|
|
MediaService.Save(c1);
|
|
}
|
|
|
|
var result = MediaTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.MediaCount);
|
|
Assert.AreEqual(createdMediaCount, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public void PropertyEditorTelemetry_Counts_Same_Editor_As_One()
|
|
{
|
|
var ct2 = ContentTypeBuilder.CreateBasicContentType("ct2", "CT2");
|
|
AddPropType("title", -88, ct2);
|
|
var ct3 = ContentTypeBuilder.CreateBasicContentType("ct3", "CT3");
|
|
AddPropType("title", -88, ct3);
|
|
var ct5 = ContentTypeBuilder.CreateBasicContentType("ct5", "CT5");
|
|
AddPropType("blah", -88, ct5);
|
|
|
|
ContentTypeService.Save(ct2);
|
|
ContentTypeService.Save(ct3);
|
|
ContentTypeService.Save(ct5);
|
|
|
|
var properties = PropertyEditorTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.Properties);
|
|
var result = properties.Data as IEnumerable<string>;
|
|
Assert.AreEqual(1, result?.Count());
|
|
}
|
|
|
|
[Test]
|
|
public void PropertyEditorTelemetry_Can_Get_All_PropertyTypes()
|
|
{
|
|
var ct2 = ContentTypeBuilder.CreateBasicContentType("ct2", "CT2");
|
|
AddPropType("title", -88, ct2);
|
|
AddPropType("title", -99, ct2);
|
|
var ct5 = ContentTypeBuilder.CreateBasicContentType("ct5", "CT5");
|
|
AddPropType("blah", -88, ct5);
|
|
|
|
ContentTypeService.Save(ct2);
|
|
ContentTypeService.Save(ct5);
|
|
|
|
var properties = PropertyEditorTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.Properties);
|
|
var result = properties.Data as IEnumerable<string>;
|
|
Assert.AreEqual(2, result?.Count());
|
|
}
|
|
|
|
[Test]
|
|
public void UserTelemetry_Can_Get_Default_User()
|
|
{
|
|
var result = UserTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.UserCount);
|
|
|
|
Assert.AreEqual(1, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public void UserTelemetry_Can_Get_With_Saved_User()
|
|
{
|
|
var user = BuildUser(0);
|
|
|
|
UserService.Save(user);
|
|
|
|
var result = UserTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.UserCount);
|
|
|
|
Assert.AreEqual(2, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public void UserTelemetry_Can_Get_More_Users()
|
|
{
|
|
var totalUsers = 99;
|
|
var users = BuildUsers(totalUsers);
|
|
UserService.Save(users);
|
|
|
|
var result = UserTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.UserCount);
|
|
|
|
Assert.AreEqual(totalUsers + 1, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public void UserTelemetry_Can_Get_Default_UserGroups()
|
|
{
|
|
var result = UserTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.UserGroupCount);
|
|
Assert.AreEqual(5, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public async Task UserTelemetry_Can_Get_With_Saved_UserGroups()
|
|
{
|
|
var userGroup = BuildUserGroup("testGroup");
|
|
|
|
await UserGroupService.CreateAsync(userGroup, Constants.Security.SuperUserKey);
|
|
var result = UserTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.UserGroupCount);
|
|
|
|
Assert.AreEqual(6, result.Data);
|
|
}
|
|
|
|
[Test]
|
|
public async Task UserTelemetry_Can_Get_More_UserGroups()
|
|
{
|
|
var userGroups = BuildUserGroups(100);
|
|
|
|
foreach (var userGroup in userGroups)
|
|
{
|
|
await UserGroupService.CreateAsync(userGroup, Constants.Security.SuperUserKey);
|
|
}
|
|
|
|
var result = UserTelemetryProvider.GetInformation()
|
|
.FirstOrDefault(x => x.Name == Constants.Telemetry.UserGroupCount);
|
|
|
|
Assert.AreEqual(105, result.Data);
|
|
}
|
|
|
|
private User BuildUser(int count) =>
|
|
_userBuilder
|
|
.WithLogin($"username{count}", "test pass")
|
|
.WithName("Test" + count)
|
|
.WithEmail($"test{count}@test.com")
|
|
.Build();
|
|
|
|
private IEnumerable<User> BuildUsers(int count)
|
|
{
|
|
for (var i = 0; i < count; i++)
|
|
{
|
|
yield return BuildUser(count);
|
|
}
|
|
}
|
|
|
|
private IUserGroup BuildUserGroup(string alias) =>
|
|
_userGroupBuilder
|
|
.WithAlias(alias)
|
|
.WithName(alias)
|
|
.WithAllowedSections(new List<string> { "A", "B" })
|
|
.Build();
|
|
|
|
private IEnumerable<IUserGroup> BuildUserGroups(int count)
|
|
{
|
|
for (var i = 0; i < count; i++)
|
|
{
|
|
yield return BuildUserGroup(i.ToString());
|
|
}
|
|
}
|
|
|
|
private void AddPropType(string alias, int dataTypeId, IContentType ct)
|
|
{
|
|
var contentCollection = new PropertyTypeCollection(true)
|
|
{
|
|
new PropertyType(ShortStringHelper, Constants.PropertyEditors.Aliases.TextBox, ValueStorageType.Ntext)
|
|
{
|
|
Alias = alias,
|
|
Name = "Title",
|
|
Description = string.Empty,
|
|
Mandatory = false,
|
|
SortOrder = 1,
|
|
DataTypeId = dataTypeId
|
|
}
|
|
};
|
|
var pg = new PropertyGroup(contentCollection) { Alias = "test", Name = "test", SortOrder = 1 };
|
|
ct.PropertyGroups.Add(pg);
|
|
}
|
|
}
|