Files
Umbraco-CMS/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Telemetry/TelemetryServiceTests.cs
Mole 2268b1e187 Package telemetry (#11738)
* Add TelemetryService

Currently it only allows you to get a list of the name of all the installed packages

* Create model class for package telemetry

And move the telemetry report data out of ReportSiteTask

* Add version as an option in package manifest

* Use TelemetryService to generate telemetry data

Instead of doing it directly in the ReportSiteTask

* Seal TelemetryService

This should not be overwritten

* Add option for package creators to opt out

* Add global setting to restrict package telemetry

* Add TelemetryService unit tests

* Add ManifestParser tests for new properties

* Clean

* Update src/Umbraco.Core/Telemetry/TelemetryService.cs

Co-authored-by: Bjarke Berg <mail@bergmania.dk>

* Create interface for telemetry service

* Use IOptionsMonitor instead of IOptions

However I chose to use CurrentValue since according to microsoft: "Some file systems, such as Docker containers and network shares, may not reliably send change notifications.", additionally TelemetryService only runs once pr. day, so it shouldn't be too much of an issue that it doesn't cache the result.

* Use is false instead of negation

It's a bit more readable

* Track restrict package telemetry value

* Save RestrictPackageTelemetry in report data

Not packages, since it'll be the same for all packages

* Fix TelemetryService unit tests

* Clean

* Update src/Umbraco.Core/Telemetry/ITelemetryService.cs

Co-authored-by: Bjarke Berg <mail@bergmania.dk>

* Remove RestrictPackageTelemetry

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2021-12-14 16:09:31 +01:00

136 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Options;
using Moq;
using NUnit.Framework;
using Umbraco.Cms.Core.Configuration;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Manifest;
using Umbraco.Cms.Core.Semver;
using Umbraco.Cms.Core.Telemetry;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
{
[TestFixture]
public class TelemetryServiceTests
{
[TestCase("0F1785C5-7BA0-4C52-AB62-863BD2C8F3FE", true)]
[TestCase("This is not a guid", false)]
[TestCase("", false)]
public void OnlyParsesIfValidId(string guidString, bool shouldSucceed)
{
var globalSettings = CreateGlobalSettings(guidString);
var version = CreateUmbracoVersion(9, 1, 1);
var sut = new TelemetryService(globalSettings, Mock.Of<IManifestParser>(), version);
var result = sut.TryGetTelemetryReportData(out var telemetry);
Assert.AreEqual(shouldSucceed, result);
if (shouldSucceed)
{
// When toString is called on a GUID it will to lower, so do the same to our guidString
Assert.AreEqual(guidString.ToLower(), telemetry.Id.ToString());
}
else
{
Assert.IsNull(telemetry);
}
}
[Test]
public void ReturnsSemanticVersionWithoutBuild()
{
var globalSettings = CreateGlobalSettings();
var version = CreateUmbracoVersion(9, 1, 1, "-rc", "-ad2f4k2d");
var sut = new TelemetryService(globalSettings, Mock.Of<IManifestParser>(), version);
var result = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsTrue(result);
Assert.AreEqual("9.1.1-rc", telemetry.Version);
}
[Test]
public void CanGatherPackageTelemetry()
{
var globalSettings = CreateGlobalSettings();
var version = CreateUmbracoVersion(9, 1, 1);
var versionPackageName = "VersionPackage";
var packageVersion = "1.0.0";
var noVersionPackageName = "NoVersionPackage";
PackageManifest[] manifests =
{
new () { PackageName = versionPackageName, Version = packageVersion },
new () { PackageName = noVersionPackageName }
};
var manifestParser = CreateManifestParser(manifests);
var sut = new TelemetryService(globalSettings, manifestParser, version);
var success = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsTrue(success);
Assert.Multiple(() =>
{
Assert.AreEqual(2, telemetry.Packages.Count());
var versionPackage = telemetry.Packages.FirstOrDefault(x => x.Name == versionPackageName);
Assert.AreEqual(versionPackageName, versionPackage.Name);
Assert.AreEqual(packageVersion, versionPackage.Version);
var noVersionPackage = telemetry.Packages.FirstOrDefault(x => x.Name == noVersionPackageName);
Assert.AreEqual(noVersionPackageName, noVersionPackage.Name);
Assert.AreEqual(string.Empty, noVersionPackage.Version);
});
}
[Test]
public void RespectsAllowPackageTelemetry()
{
var globalSettings = CreateGlobalSettings();
var version = CreateUmbracoVersion(9, 1, 1);
PackageManifest[] manifests =
{
new () { PackageName = "DoNotTrack", AllowPackageTelemetry = false },
new () { PackageName = "TrackingAllowed", AllowPackageTelemetry = true }
};
var manifestParser = CreateManifestParser(manifests);
var sut = new TelemetryService(globalSettings, manifestParser, version);
var success = sut.TryGetTelemetryReportData(out var telemetry);
Assert.IsTrue(success);
Assert.Multiple(() =>
{
Assert.AreEqual(1, telemetry.Packages.Count());
Assert.AreEqual("TrackingAllowed", telemetry.Packages.First().Name);
});
}
private IManifestParser CreateManifestParser(IEnumerable<PackageManifest> manifests)
{
var manifestParserMock = new Mock<IManifestParser>();
manifestParserMock.Setup(x => x.GetManifests()).Returns(manifests);
return manifestParserMock.Object;
}
private IUmbracoVersion CreateUmbracoVersion(int major, int minor, int patch, string prerelease = "", string build = "")
{
var version = new SemVersion(major, minor, patch, prerelease, build);
return Mock.Of<IUmbracoVersion>(x => x.SemanticVersion == version);
}
private IOptionsMonitor<GlobalSettings> CreateGlobalSettings(string guidString = null)
{
if (guidString is null)
{
guidString = Guid.NewGuid().ToString();
}
var globalSettings = new GlobalSettings { Id = guidString };
return Mock.Of<IOptionsMonitor<GlobalSettings>>(x => x.CurrentValue == globalSettings);
}
}
}