public void GetDependenciesCalledWithCorrectParamsTest()
        {
            //Arrange
            const string location = "TestLocation";
            var container = new Container();
            var stubRestClient = MockRepository.GenerateStub<IRestClientAdapter>();
            var stubJsonConverter = MockRepository.GenerateStub<IJsonConvertAdapter>();

            container.RegisterInstance(stubRestClient);
            container.RegisterInstance(stubJsonConverter);
            container.Register<IWeatherRepository, WeatherRepository>();

            var weatherRepository = container.Get<IWeatherRepository>();
            var restClientResponse = new RestClientResponse()
            {
                Content = "TestContent"
            };
            var weatherServiceDetail = new WeatherServiceDetail()
            {
                Resource = "TestResource",
                ServiceUrl = "TestUrl"
            };
            var urlSegment = new Dictionary<string, string> {{"location", location}};

            stubRestClient.Stub(x => x.Get(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<Dictionary<string, string>>.Is.Anything))
                .Return(restClientResponse);

            //Act
            weatherRepository.Get(weatherServiceDetail, location);

            //Assert
            stubRestClient.AssertWasCalled(x => x.Get(weatherServiceDetail.ServiceUrl, weatherServiceDetail.Resource, urlSegment));
            stubJsonConverter.AssertWasCalled(x => x.DeserializeObject<WeatherServiceResponse>(restClientResponse.Content));
        }
        public void GetServiceFailedExceptionThrownTest()
        {
            //Arrange
            var container = new Container();
            var stubRestClient = MockRepository.GenerateStub<IRestClientAdapter>();
            var stubJsonConverter = MockRepository.GenerateStub<IJsonConvertAdapter>();

            container.RegisterInstance(stubRestClient);
            container.RegisterInstance(stubJsonConverter);
            container.Register<IWeatherRepository, WeatherRepository>();

            var weatherRepository = container.Get<IWeatherRepository>();
            var restClientResponse = new RestClientResponse()
            {
                Content = "TestContent",
                ResponseStatus = RestResponseStatus.Failure
            };
            var weatherServiceDetail = new WeatherServiceDetail()
            {
                Resource = "TestResource",
                ServiceUrl = "TestUrl"
            };
            const string location = "TestLocation";

            stubRestClient.Stub(x => x.Get(Arg<string>.Is.Anything, Arg<string>.Is.Anything, Arg<Dictionary<string, string>>.Is.Anything))
                .Return(restClientResponse);

            //Act
            Action action = () => weatherRepository.Get(weatherServiceDetail, location);

            //Assert
            action.ShouldThrow<WeatherServiceException>()
                .WithMessage("Service failed");
        }
        public void GetWeatherTest()
        {
            //Arrange
            var container = new Container();
            var weatherServices = new WeatherServiceStore();
            weatherServices.RegisterService(new WeatherServiceDetail()
            {
                ServiceUrl = "http://localhost:18888/api",
                Resource = "Weather/{location}"
            });
            weatherServices.RegisterService(new WeatherServiceDetail()
            {
                ServiceUrl = "http://localhost:17855/api",
                Resource = "Weather/{location}"
            });

            container.Register<IWeatherAggregatorService, WeatherAggregatorService>();
            container.Register<IWeatherRepository, WeatherRepository>();
            container.Register<IWeatherUnitConverterService, WeatherUnitConverterService>();
            container.Register<IRestClientAdapter, RestClientAdapter>();
            container.Register<IJsonConvertAdapter, JsonConvertAdapter>();
            container.RegisterInstance<IWeatherServiceStore>(weatherServices);

            var weatherAggregatorService = container.Get<IWeatherAggregatorService>();

            const string location = "TestLocation";

            //Act
            var result = weatherAggregatorService.GetAggregatedWeatherFromRegisteredServices(location);

            //Assert
            result.Should().NotBeNull();
        }
        public void GetWeatherAverageWindSpeedValuesAreCorrectTest(double kph, double mph, double averageKph, double averageMph)
        {
            //Arrange
            const string location = "TestLocation";
            var container = new Container();
            var stubWeatherRespository = MockRepository.GenerateStub<IWeatherRepository>();
            var servicesStore = new WeatherServiceStore();

            container.RegisterInstance(stubWeatherRespository);
            container.RegisterInstance<IWeatherServiceStore>(servicesStore);
            container.Register<IJsonConvertAdapter, JsonConvertAdapter>();
            container.Register<IRestClientAdapter, RestClientAdapter>();
            container.Register<IWeatherUnitConverterService, WeatherUnitConverterService>();
            container.Register<IWeatherAggregatorService, WeatherAggregatorService>();

            servicesStore.RegisterService(new WeatherServiceDetail()
            {
                ServiceUrl = "Test1",
                Resource = "Weather"
            });

            servicesStore.RegisterService(new WeatherServiceDetail()
            {
                ServiceUrl = "Test2",
                Resource = "Weather"
            });

            stubWeatherRespository.Stub(x => x.Get(Arg<WeatherServiceDetail>.Is.Equal((servicesStore.Services[0])), Arg<string>.Is.Anything))
                .Return(new WeatherServiceResponse()
                {
                    WindSpeedKph = kph,
                    Location = location
                });

            stubWeatherRespository.Stub(x => x.Get(Arg<WeatherServiceDetail>.Is.Equal((servicesStore.Services[1])), Arg<string>.Is.Anything))
                .Return(new WeatherServiceResponse()
                {
                    WindSpeedMph = mph,
                    Location = location
                });

            var weatherAggregatorService = container.Get<IWeatherAggregatorService>();

            //Act
            var result = weatherAggregatorService.GetAggregatedWeatherFromRegisteredServices(location);

            //Assert
            result.AverageWindSpeedKph.Should().Be(averageKph);
            result.AverageWindSpeedMph.Should().Be(averageMph);
        }
        public void GetWeatherLocationIsEmptyOrNullShouldReturnNullTest(string location)
        {
            //Arrange
            var container = new Container();
            var stubWeatherRespository = MockRepository.GenerateStub<IWeatherRepository>();
            var stubWeatherServiceStore = MockRepository.GenerateStub<IWeatherServiceStore>();
            var stubWeatherUnitConverterService = MockRepository.GenerateStub<IWeatherUnitConverterService>();

            container.RegisterInstance(stubWeatherRespository);
            container.RegisterInstance(stubWeatherServiceStore);
            container.RegisterInstance(stubWeatherUnitConverterService);
            container.Register<IWeatherAggregatorService, WeatherAggregatorService>();

            var weatherAggregatorService = container.Get<IWeatherAggregatorService>();

            //Act
            var result = weatherAggregatorService.GetAggregatedWeatherFromRegisteredServices(location);

            //Assert
            result.Should().BeNull("location is empty of null");
        }