public void GetRequiredService_Should_Use_Suitable_ClientFactory_To_Create_AwsService_By_UseLocalStack_Value(
            bool useLocalStack, int awsClientFactoryInvolved, int sessionInvolved, bool useAlternateNameAddServiceMethod)
        {
            var configurationValue = new Dictionary <string, string> {
                { "LocalStack:UseLocalStack", useLocalStack.ToString() }
            };
            IConfiguration configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValue).Build();

            var mockSession       = new Mock <ISession>(MockBehavior.Strict);
            var mockClientFactory = new Mock <IAwsClientFactoryWrapper>(MockBehavior.Strict);

            ISession mockSessionObject = mockSession.Object;
            IAwsClientFactoryWrapper mockAwsClientFactoryWrapper = mockClientFactory.Object;

            IServiceCollection serviceCollection = new ServiceCollection();

            serviceCollection.AddLocalStack(configuration)
            .Replace(ServiceDescriptor.Singleton(_ => mockSessionObject))
            .Replace(ServiceDescriptor.Singleton(_ => mockAwsClientFactoryWrapper));

            if (!useAlternateNameAddServiceMethod)
            {
                serviceCollection.AddAwsService <IMockAmazonService>();
            }
            else
            {
                serviceCollection.AddAWSServiceLocalStack <IMockAmazonService>();
            }

            ServiceProvider provider = serviceCollection.BuildServiceProvider();

            mockSession.Setup(session => session.CreateClientByInterface <IMockAmazonService>()).Returns(() => new MockAmazonServiceClient("tsada", "sadasdas", "sadasda", new MockClientConfig()));
            mockClientFactory.Setup(wrapper => wrapper.CreateServiceClient <IMockAmazonService>(It.IsAny <IServiceProvider>(), It.IsAny <AWSOptions>())).Returns(() => new MockAmazonServiceClient("tsada", "sadasdas", "sadasda", new MockClientConfig()));

            var mockAmazonService = provider.GetRequiredService <IMockAmazonService>();

            Assert.NotNull(mockAmazonService);

            mockClientFactory.Verify(wrapper => wrapper.CreateServiceClient <IMockAmazonService>(It.IsAny <IServiceProvider>(), It.IsAny <AWSOptions>()),
                                     Times.Exactly(awsClientFactoryInvolved));
            mockSession.Verify(session => session.CreateClientByInterface <IMockAmazonService>(), Times.Exactly(sessionInvolved));
        }
        public void GetRequiredService_Should_Return_AmazonService_That_Configured_For_LocalStack_If_UseLocalStack_Is_True(bool useAlternateNameAddServiceMethod)
        {
            var configurationValue = new Dictionary <string, string> {
                { "LocalStack:UseLocalStack", "true" }
            };
            IConfiguration configuration = new ConfigurationBuilder().AddInMemoryCollection(configurationValue).Build();

            var mockServiceMetadata    = new MockServiceMetadata();
            var mockAwsServiceEndpoint = new MockAwsServiceEndpoint();

            var     mockConfig       = new Mock <IConfig>(MockBehavior.Strict);
            IConfig mockConfigObject = mockConfig.Object;

            mockConfig.Setup(config => config.GetAwsServiceEndpoint(It.Is <string>(s => s == mockServiceMetadata.ServiceId))).Returns(() => mockAwsServiceEndpoint);

            IServiceCollection serviceCollection = new ServiceCollection();

            serviceCollection = serviceCollection
                                .AddLocalStack(configuration)
                                .Replace(ServiceDescriptor.Singleton(_ => mockConfigObject));

            if (!useAlternateNameAddServiceMethod)
            {
                serviceCollection.AddAwsService <IMockAmazonServiceWithServiceMetadata>();
            }
            else
            {
                serviceCollection.AddAWSServiceLocalStack <IMockAmazonServiceWithServiceMetadata>();
            }

            ServiceProvider provider = serviceCollection.BuildServiceProvider();

            var mockAmazonService = provider.GetRequiredService <IMockAmazonServiceWithServiceMetadata>();

            IClientConfig clientConfig = mockAmazonService.Config;

            Assert.Equal(mockAwsServiceEndpoint.ServiceUrl, clientConfig.ServiceURL);
            Assert.True(clientConfig.UseHttp);
            Assert.Equal(mockAwsServiceEndpoint.Host, clientConfig.ProxyHost);
            Assert.Equal(mockAwsServiceEndpoint.Port, clientConfig.ProxyPort);
        }