public async Task <Ride> BringCustomerToTheTrainStation(Id <Customer> customerId, Location customerLocation)
        {
            var currentTime = await _timeProvider.GetCurrentTime();

            // Find a cab
            var cab = await _cabProvider.GetNearestAvailableCab(customerLocation);

            cab.Embarc(customerId);

            // Bring the customer to the trainstation
            var rideId = Id <Ride> .CreateNew();

            var destination = await _locationProvider.GetTrainStationLocation();

            var ride = new Ride(rideId, customerId, cab.Id);

            ride.SetDestination(destination);
            ride.Start(currentTime);

            var distance = await _trafficInformationProvider.GetDistanceBetweenLocations(destination, customerLocation);

            var eta = await _trafficInformationProvider.GetTimeOfArival(currentTime, distance);

            ride.Stop(eta);

            // Update the cab administration
            cab.GoTo(destination);
            await _cabProvider.Update(cab);

            return(ride);
        }
Esempio n. 2
0
        public void Initialize()
        {
            // Create test data
            _customerId       = _fixture.Create <Id <Customer> >();
            _customerLocation = _fixture.Create <Location>();

            _cab = _fixture.Create <Cab>();
            _trainStationLocation   = _fixture.Create <Location>();
            _currentTime            = _fixture.Create <DateTime>();
            _estimatedTimeOfArrival = _currentTime.AddMinutes(_fixture.Create <int>());

            // Setup stubs
            _locationProvider = Substitute.For <IProvideLocation>();
            _locationProvider.GetTrainStationLocation().Returns(_trainStationLocation);

            _cabProvider = Substitute.For <IProvideCab>();
            _cabProvider.GetNearestAvailableCab(Arg.Any <Location>()).Returns(_cab);

            _timeProvider = Substitute.For <IProvideTime>();
            _timeProvider.GetCurrentTime().Returns(_currentTime);

            _trafficInformationProvider = Substitute.For <IProvideTrafficInformation>();
            _trafficInformationProvider.GetTimeOfArival(Arg.Any <DateTime>(), Arg.Any <Kilometer>()).Returns(_estimatedTimeOfArrival);
            _trafficInformationProvider.GetDistanceBetweenLocations(Arg.Any <Location>(), Arg.Any <Location>()).Returns(_fixture.Create <Kilometer>());

            // Create subject under test
            _sut = new CabRideService(_locationProvider, _cabProvider, _timeProvider, _trafficInformationProvider);
        }
        public async Task WhenTrafficInformation_ShouldGetEstimatedTimeOfArrival()
        {
            // Arrange
            var response = _fixture.Create <EstimatedTimeOfArrivalResponse>();

            _httpClient
            .PostAsync(Arg.Any <string>(), Arg.Any <HttpContent>())
            .Returns(response.ToHttpResponseMessage());

            var departureTime   = _fixture.Create <DateTime>();
            var distanceToCover = _fixture.Create <Kilometer>();

            // Act
            var actual = await _sut.GetTimeOfArival(departureTime, distanceToCover);

            // Assert
            actual.Should().NotBe(DateTime.MinValue);
        }