// Copyright (c) Umbraco.
// See LICENSE for more details.
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Moq;
using NUnit.Framework;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Scoping;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement;
using Umbraco.Cms.Infrastructure.Scoping;
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;
using IScopeProvider = Umbraco.Cms.Infrastructure.Scoping.IScopeProvider;
using IScope = Umbraco.Cms.Infrastructure.Scoping.IScope;
namespace Umbraco.Cms.Tests.Integration.Umbraco.Core.Services
{
///
/// Tests covering the SectionService
///
[TestFixture]
[UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerTest)]
public class TelemetryProviderTests : UmbracoIntegrationTest
{
private IContentTypeService ContentTypeService => GetRequiredService();
private IFileService FileService => GetRequiredService();
private IDomainService DomainService => GetRequiredService();
private IContentService ContentService => GetRequiredService();
private DomainTelemetryProvider DetailedTelemetryProviders => GetRequiredService();
private ContentTelemetryProvider ContentTelemetryProvider => GetRequiredService();
private LanguagesTelemetryProvider LanguagesTelemetryProvider => GetRequiredService();
private UserTelemetryProvider UserTelemetryProvider => GetRequiredService();
private MacroTelemetryProvider MacroTelemetryProvider => GetRequiredService();
private MediaTelemetryProvider MediaTelemetryProvider => GetRequiredService();
private PropertyEditorTelemetryProvider PropertyEditorTelemetryProvider => GetRequiredService();
private ILocalizationService LocalizationService => GetRequiredService();
private IUserService UserService => GetRequiredService();
private IMediaService MediaService => GetRequiredService();
private IMediaTypeService MediaTypeService => GetRequiredService();
private LanguageBuilder _languageBuilder = new();
private UserBuilder _userBuilder = new();
private UserGroupBuilder _userGroupBuilder = new();
private ContentTypeBuilder _contentTypeBuilder = new ();
protected override void CustomTestSetup(IUmbracoBuilder builder)
{
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
base.CustomTestSetup(builder);
}
[Test]
public void Domain_Telemetry_Provider_Can_Get_Domains()
{
// Arrange
DomainService.Save(new UmbracoDomain("danish", "da-DK"));
IEnumerable result = null;
// Act
result = DetailedTelemetryProviders.GetInformation();
// Assert
Assert.AreEqual(1, result.First().Data);
}
[Test]
public void SectionService_Can_Get_Allowed_Sections_For_User()
{
// Arrange
Template template = TemplateBuilder.CreateTextPageTemplate();
FileService.SaveTemplate(template);
ContentType contentType = ContentTypeBuilder.CreateTextPageContentType(defaultTemplateId: template.Id);
ContentTypeService.Save(contentType);
Content 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);
IContent fromBlueprint = ContentService.CreateContentFromBlueprint(blueprint, "My test content");
ContentService.Save(fromBlueprint);
IEnumerable result = null;
// Act
result = ContentTelemetryProvider.GetInformation();
// Assert
// TODO : Test multiple roots, with children + grandchildren
Assert.AreEqual(1, result.First().Data);
}
[Test]
public void Language_Telemetry_Can_Get_Languages()
{
// Arrange
var langTwo = _languageBuilder.WithCultureInfo("da-DK").Build();
var langThree = _languageBuilder.WithCultureInfo("se-SV").Build();
LocalizationService.Save(langTwo);
LocalizationService.Save(langThree);
IEnumerable result = null;
// Act
result = LanguagesTelemetryProvider.GetInformation();
// Assert
Assert.AreEqual(3, result.First().Data);
}
[Test]
public void MacroTelemetry_Can_Get_Macros()
{
BuildMacros();
var result = MacroTelemetryProvider.GetInformation().FirstOrDefault(x => x.Name == Constants.Telemetry.MacroCount);
Assert.AreEqual(3, result.Data);
}
[Test]
public void MediaTelemetry_Can_Get_Media_In_Folders()
{
IMediaType folderType = MediaTypeService.Get(1031);
IMediaType imageMediaType = MediaTypeService.Get(1032);
Media root = MediaBuilder.CreateMediaFolder(folderType, -1);
MediaService.Save(root);
int createdMediaCount = 10;
for (int i = 0; i < createdMediaCount; i++)
{
Media 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()
{
IMediaType imageMediaType = MediaTypeService.Get(1032);
int createdMediaCount = 10;
for (int i = 0; i < createdMediaCount; i++)
{
Media 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()
{
ContentType ct2 = ContentTypeBuilder.CreateBasicContentType("ct2", "CT2", null);
AddPropType("title", -88, ct2);
ContentType ct3 = ContentTypeBuilder.CreateBasicContentType("ct3", "CT3", null);
AddPropType("title",-88, ct3);
ContentType ct5 = ContentTypeBuilder.CreateBasicContentType("ct5", "CT5", null);
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;
Assert.AreEqual(1, result?.Count());
}
[Test]
public void PropertyEditorTelemetry_Can_Get_All_PropertyTypes()
{
ContentType ct2 = ContentTypeBuilder.CreateBasicContentType("ct2", "CT2", null);
AddPropType("title", -88, ct2);
AddPropType("title",-99, ct2);
ContentType ct5 = ContentTypeBuilder.CreateBasicContentType("ct5", "CT5", null);
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;
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()
{
int 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 void UserTelemetry_Can_Get_With_Saved_UserGroups()
{
var userGroup = BuildUserGroup("testGroup");
UserService.Save(userGroup);
var result = UserTelemetryProvider.GetInformation().FirstOrDefault(x => x.Name == Constants.Telemetry.UserGroupCount);
Assert.AreEqual(6, result.Data);
}
[Test]
public void UserTelemetry_Can_Get_More_UserGroups()
{
var userGroups = BuildUserGroups(100);
foreach (var userGroup in userGroups)
{
UserService.Save(userGroup);
}
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 BuildUsers(int count)
{
for (int i = 0; i < count; i++)
{
yield return BuildUser(count);
}
}
private IUserGroup BuildUserGroup(string alias) =>
_userGroupBuilder
.WithAlias(alias)
.WithName(alias)
.WithAllowedSections(new List(){"A", "B"})
.Build();
private IEnumerable BuildUserGroups(int count)
{
for (int i = 0; i < count; i++)
{
yield return BuildUserGroup(i.ToString());
}
}
private void BuildMacros()
{
IScopeProvider scopeProvider = ScopeProvider;
using (IScope scope = scopeProvider.CreateScope())
{
var repository = new MacroRepository((IScopeAccessor)scopeProvider, AppCaches.Disabled, Mock.Of>(), ShortStringHelper);
repository.Save(new Macro(ShortStringHelper, "test1", "Test1", "~/views/macropartials/test1.cshtml"));
repository.Save(new Macro(ShortStringHelper, "test2", "Test2", "~/views/macropartials/test2.cshtml"));
repository.Save(new Macro(ShortStringHelper, "test3", "Tet3", "~/views/macropartials/test3.cshtml"));
scope.Complete();
}
}
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);
}
}
}