V9: Fix missing site identifier (#12040)
* Add SiteIdentifierService * Use SiteIdentifierService in TelemetryService * Use SiteIdentifierService when installing * Remove timeout * Use TryGetOrCreateSiteIdentifier in TelemetryService * Add site identifier to dashboard url * Fix and add tests * Don't accept empty guid as valid site identifier * Fix dashboard controller * Fix site id query parameter * Use Optionsmonitor onchange Co-authored-by: nikolajlauridsen <nel@umbraco.dk> Co-authored-by: Bjarke Berg <mail@bergmania.dk>
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Cms.Core.Configuration;
|
||||
using Umbraco.Cms.Core.Configuration.Models;
|
||||
using Umbraco.Cms.Core.Telemetry;
|
||||
|
||||
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
|
||||
{
|
||||
[TestFixture]
|
||||
public class SiteIdentifierServiceTests
|
||||
{
|
||||
[TestCase("0F1785C5-7BA0-4C52-AB62-863BD2C8F3FE", true)]
|
||||
[TestCase("This is not a guid", false)]
|
||||
[TestCase("", false)]
|
||||
[TestCase("00000000-0000-0000-0000-000000000000", false)] // Don't count empty GUID as valid
|
||||
public void TryGetOnlyPassesIfValidId(string guidString, bool shouldSucceed)
|
||||
{
|
||||
var globalSettings = CreateGlobalSettings(guidString);
|
||||
var sut = new SiteIdentifierService(
|
||||
globalSettings,
|
||||
Mock.Of<IConfigManipulator>(),
|
||||
Mock.Of<ILogger<SiteIdentifierService>>());
|
||||
|
||||
var result = sut.TryGetSiteIdentifier(out var siteIdentifier);
|
||||
|
||||
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(), siteIdentifier.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.AreEqual(Guid.Empty, siteIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
[TestCase("0F1785C5-7BA0-4C52-AB62-863BD2C8F3FE", false)]
|
||||
[TestCase("This is not a guid", true)]
|
||||
[TestCase("", true)]
|
||||
[TestCase("00000000-0000-0000-0000-000000000000", true)] // Don't count empty GUID as valid
|
||||
public void TryGetOrCreateOnlyCreatesNewGuidIfCurrentIsMissingOrInvalid(string guidString, bool shouldCreate)
|
||||
{
|
||||
var globalSettings = CreateGlobalSettings(guidString);
|
||||
var configManipulatorMock = new Mock<IConfigManipulator>();
|
||||
|
||||
var sut = new SiteIdentifierService(
|
||||
globalSettings,
|
||||
configManipulatorMock.Object,
|
||||
Mock.Of<ILogger<SiteIdentifierService>>());
|
||||
|
||||
var result = sut.TryGetOrCreateSiteIdentifier(out var identifier);
|
||||
|
||||
if (shouldCreate)
|
||||
{
|
||||
configManipulatorMock.Verify(x => x.SetGlobalId(It.IsAny<string>()), Times.Once);
|
||||
Assert.AreNotEqual(Guid.Empty, identifier);
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
else
|
||||
{
|
||||
configManipulatorMock.Verify(x => x.SetGlobalId(It.IsAny<string>()), Times.Never());
|
||||
Assert.AreEqual(guidString.ToLower(), identifier.ToString());
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
}
|
||||
|
||||
private IOptionsMonitor<GlobalSettings> CreateGlobalSettings(string guidString)
|
||||
{
|
||||
var globalSettings = new GlobalSettings { Id = guidString };
|
||||
return Mock.Of<IOptionsMonitor<GlobalSettings>>(x => x.CurrentValue == globalSettings);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,36 +15,36 @@ 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)
|
||||
[Test]
|
||||
public void UsesGetOrCreateSiteId()
|
||||
{
|
||||
var globalSettings = CreateGlobalSettings(guidString);
|
||||
var version = CreateUmbracoVersion(9, 1, 1);
|
||||
var sut = new TelemetryService(globalSettings, Mock.Of<IManifestParser>(), version);
|
||||
var version = CreateUmbracoVersion(9, 3, 1);
|
||||
var siteIdentifierServiceMock = new Mock<ISiteIdentifierService>();
|
||||
var sut = new TelemetryService(Mock.Of<IManifestParser>(), version, siteIdentifierServiceMock.Object);
|
||||
Guid guid;
|
||||
|
||||
var result = sut.TryGetTelemetryReportData(out var telemetryReportData);
|
||||
siteIdentifierServiceMock.Verify(x => x.TryGetOrCreateSiteIdentifier(out guid), Times.Once);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SkipsIfCantGetOrCreateId()
|
||||
{
|
||||
var version = CreateUmbracoVersion(9, 3, 1);
|
||||
var sut = new TelemetryService(Mock.Of<IManifestParser>(), version, createSiteIdentifierService(false));
|
||||
|
||||
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);
|
||||
}
|
||||
Assert.IsFalse(result);
|
||||
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 sut = new TelemetryService(Mock.Of<IManifestParser>(), version, createSiteIdentifierService());
|
||||
|
||||
var result = sut.TryGetTelemetryReportData(out var telemetry);
|
||||
|
||||
@@ -55,7 +55,6 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
|
||||
[Test]
|
||||
public void CanGatherPackageTelemetry()
|
||||
{
|
||||
var globalSettings = CreateGlobalSettings();
|
||||
var version = CreateUmbracoVersion(9, 1, 1);
|
||||
var versionPackageName = "VersionPackage";
|
||||
var packageVersion = "1.0.0";
|
||||
@@ -66,7 +65,7 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
|
||||
new () { PackageName = noVersionPackageName }
|
||||
};
|
||||
var manifestParser = CreateManifestParser(manifests);
|
||||
var sut = new TelemetryService(globalSettings, manifestParser, version);
|
||||
var sut = new TelemetryService(manifestParser, version, createSiteIdentifierService());
|
||||
|
||||
var success = sut.TryGetTelemetryReportData(out var telemetry);
|
||||
|
||||
@@ -87,15 +86,14 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
|
||||
[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 }
|
||||
new () { PackageName = "TrackingAllowed", AllowPackageTelemetry = true },
|
||||
};
|
||||
var manifestParser = CreateManifestParser(manifests);
|
||||
var sut = new TelemetryService(globalSettings, manifestParser, version);
|
||||
var sut = new TelemetryService(manifestParser, version, createSiteIdentifierService());
|
||||
|
||||
var success = sut.TryGetTelemetryReportData(out var telemetry);
|
||||
|
||||
@@ -121,15 +119,12 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.Telemetry
|
||||
return Mock.Of<IUmbracoVersion>(x => x.SemanticVersion == version);
|
||||
}
|
||||
|
||||
private IOptionsMonitor<GlobalSettings> CreateGlobalSettings(string guidString = null)
|
||||
private ISiteIdentifierService createSiteIdentifierService(bool shouldSucceed = true)
|
||||
{
|
||||
if (guidString is null)
|
||||
{
|
||||
guidString = Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
var globalSettings = new GlobalSettings { Id = guidString };
|
||||
return Mock.Of<IOptionsMonitor<GlobalSettings>>(x => x.CurrentValue == globalSettings);
|
||||
var mock = new Mock<ISiteIdentifierService>();
|
||||
var siteIdentifier = shouldSucceed ? Guid.NewGuid() : Guid.Empty;
|
||||
mock.Setup(x => x.TryGetOrCreateSiteIdentifier(out siteIdentifier)).Returns(shouldSucceed);
|
||||
return mock.Object;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user