using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Slim.Integration.ServiceCollection; using Slim.Integration.Tests.Models; namespace Slim.Integration.Tests; [TestClass] public sealed class ServiceCollectionExtensionsTests { [TestMethod] public void BuildSlimServiceProvider_ReturnsServiceProvider() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); serviceProvider.Should().BeAssignableTo(); } [TestMethod] public void BuildSlimServiceProvider_WithServices_ReturnsProviderWithServices() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddScoped(serviceCollection); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var testService = serviceProvider.GetRequiredService(); testService.Should().BeOfType(); } [TestMethod] public void BuildSlimServiceProvider_WithSingletonInstance_ReturnsSingletonInstance() { var testService = new TestService(); var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddSingleton(serviceCollection, testService); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var returnedService = serviceProvider.GetRequiredService(); returnedService.Should().Be(testService); } [TestMethod] public void BuildSlimServiceProvider_WithSingletonFactory_ReturnsSingletonInstance() { var testService = new TestService(); var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddSingleton(serviceCollection, sp => testService); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var returnedService = serviceProvider.GetRequiredService(); returnedService.Should().Be(testService); } [TestMethod] public void BuildSlimServiceProvider_WithScopedFactory_ReturnsScopedInstance() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddScoped(serviceCollection, sp => new TestService()); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var scopedServiceProvider = serviceProvider.CreateScope().ServiceProvider; var returnedService1 = serviceProvider.GetRequiredService(); var returnedService11 = serviceProvider.GetRequiredService(); var returnedService2 = scopedServiceProvider.GetRequiredService(); var returnedService21 = scopedServiceProvider.GetRequiredService(); returnedService1.Should().NotBe(returnedService2); returnedService11.Should().Be(returnedService1); returnedService21.Should().Be(returnedService2); } [TestMethod] public void BuildSlimServiceProvider_WithScopedImplementation_ReturnsScopedInstance() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddScoped(serviceCollection); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var scopedServiceProvider = serviceProvider.CreateScope().ServiceProvider; var returnedService1 = serviceProvider.GetRequiredService(); var returnedService11 = serviceProvider.GetRequiredService(); var returnedService2 = scopedServiceProvider.GetRequiredService(); var returnedService21 = scopedServiceProvider.GetRequiredService(); returnedService1.Should().NotBe(returnedService2); returnedService11.Should().Be(returnedService1); returnedService21.Should().Be(returnedService2); } [TestMethod] public void BuildSlimServiceProvider_WithTransientFactory_ReturnsTransientInstance() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddTransient(serviceCollection, sp => new TestService()); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var scopedServiceProvider = serviceProvider.CreateScope().ServiceProvider; var returnedService1 = serviceProvider.GetRequiredService(); var returnedService11 = serviceProvider.GetRequiredService(); var returnedService2 = scopedServiceProvider.GetRequiredService(); var returnedService21 = scopedServiceProvider.GetRequiredService(); returnedService1.Should().NotBe(returnedService2); returnedService11.Should().NotBe(returnedService1); returnedService21.Should().NotBe(returnedService2); } [TestMethod] public void BuildSlimServiceProvider_WithTransientImplementation_ReturnsTransientInstance() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); ServiceCollectionServiceExtensions.AddTransient(serviceCollection); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var scopedServiceProvider = serviceProvider.CreateScope().ServiceProvider; var returnedService1 = serviceProvider.GetRequiredService(); var returnedService11 = serviceProvider.GetRequiredService(); var returnedService2 = scopedServiceProvider.GetRequiredService(); var returnedService21 = scopedServiceProvider.GetRequiredService(); returnedService1.Should().NotBe(returnedService2); returnedService11.Should().NotBe(returnedService1); returnedService21.Should().NotBe(returnedService2); } [TestMethod] public void BuildSlimServiceProvider_CreateScope_ReturnsScopedServiceProvider() { var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection(); var serviceProvider = serviceCollection.BuildSlimServiceProvider(); var scopedServiceProvider = serviceProvider.CreateScope().ServiceProvider; serviceProvider.Should().NotBe(scopedServiceProvider); scopedServiceProvider.Should().NotBeNull(); scopedServiceProvider.Should().BeOfType(); serviceProvider.Should().BeOfType(); scopedServiceProvider.As().ParentServiceManager.Should().Be(serviceProvider); } }