Files
Umbraco-CMS/tests/Umbraco.Tests.Integration/Umbraco.Core/Services/TelemetryProviderTests.cs
Andy Butland 825f791d01 Remove the non-controversial, straightforward obsoleted constructs for Umbraco 16 (#18661)
* 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.
2025-03-21 17:02:31 +00:00

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);
}
}