public void Get_WhenClientForBankNotFound_ShouldThrowArgumentException()
        {
            //arrange
            var clientsDictionary = new Dictionary <string, BankApiClientBase>();
            var provider          = new BankApiClientProvider(clientsDictionary);

            //act
            provider.Get("bank");

            //assert
        }
        public void Get_WithNullBankParam_ShouldThrowArgumentNullException()
        {
            //arrange
            var clientsDictionary = new Dictionary <string, BankApiClientBase>();
            var provider          = new BankApiClientProvider(clientsDictionary);

            //act
            provider.Get(null);

            //assert
        }
        public void Get_WhenClientForBankFound_ShouldReturnClient()
        {
            //arrange
            var bank       = "bank";
            var mockClient = new Mock <BankApiClientBase>(null);
            var clientsDictionary
                = new Dictionary <string, BankApiClientBase>()
                {
                { bank, mockClient.Object }
                };
            var provider = new BankApiClientProvider(clientsDictionary);

            //act
            var client = provider.Get(bank);

            //assert
            Assert.IsNotNull(client);
        }
        public static IServiceCollection AddApiClientProvider(this IServiceCollection services, IEnumerable <BankApiClientConfiguration> bankApiClientConfigurations)
        {
            var bankApisClients = new Dictionary <string, BankApiClientBase>();

            foreach (var bankApiClientConfiguration in bankApiClientConfigurations)
            {
                var assembly = Assembly.Load(bankApiClientConfiguration.AssemblyFullName);
                var type     = assembly.GetType(bankApiClientConfiguration.TypeName);
                var client   = Activator.CreateInstance(type, bankApiClientConfiguration) as BankApiClientBase;

                if (client == null)
                {
                    throw new Exception($"Client failed to create for BankApiConfiguration with ID {bankApiClientConfiguration.Id}");
                }

                bankApisClients.Add(bankApiClientConfiguration.Bank.Name, client);
            }

            var bankApiClientProvider = new BankApiClientProvider(bankApisClients);

            services.AddSingleton <IBankApiClientProvider>(bankApiClientProvider);

            return(services);
        }