using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NUnit.Framework; using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Runtime; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Tests.Common.Attributes; using Umbraco.Cms.Tests.Common.Testing; using Umbraco.Cms.Tests.Integration.Testing; namespace Umbraco.Cms.Tests.Integration; [TestFixture] [UmbracoTest(Boot = true)] public class ComponentRuntimeTests : UmbracoIntegrationTest { // ensure composers are added protected override void CustomTestSetup(IUmbracoBuilder builder) => builder.AddComposers(); /// /// This will boot up umbraco with components enabled to show they initialize and shutdown /// [Test] [LongRunning] public async Task Start_And_Stop_Umbraco_With_Components_Enabled() { var runtime = Services.GetRequiredService(); var runtimeState = Services.GetRequiredService(); var mainDom = Services.GetRequiredService(); var components = Services.GetRequiredService(); var myComponent = components.OfType().First(); Assert.IsTrue(mainDom.IsMainDom); Assert.IsNull(runtimeState.BootFailedException); Assert.IsTrue(myComponent.IsInit, "The component was not initialized"); // force stop now await runtime.StopAsync(CancellationToken.None); Assert.IsTrue(myComponent.IsTerminated, "The component was not terminated"); } public class MyComposer : IComposer { public void Compose(IUmbracoBuilder builder) => builder.Components().Append(); } public class MyComponent : IComponent { private readonly ILogger _logger; public MyComponent(ILogger logger) => _logger = logger; public bool IsInit { get; private set; } public bool IsTerminated { get; private set; } public void Initialize() => IsInit = true; public void Terminate() => IsTerminated = true; } }