public async Task ChooseCorrectItem()
            {
                const string userId              = "userId";
                const string deviceId            = "devId";
                const string feedId              = "feed";
                DateTime     now                 = DateTime.Now;
                var          deviceSyncStoreMock = new Mock <IDeviceSyncStore>(MockBehavior.Strict);

                deviceSyncStoreMock.Setup(d => d.DeviceClaimedByAsync(deviceId)).Returns(Task.FromResult(userId));
                var digitPushServiceClientMock = new Mock <IDigitPushServiceClient>(MockBehavior.Strict);
                var calendarServiceMock        = new Mock <ICalendarServiceClient>(MockBehavior.Strict);
                var travelServiceMock          = new Mock <ITravelServiceClient>(MockBehavior.Strict);
                var focusStoreMock             = new Mock <IFocusStore>(MockBehavior.Strict);

                focusStoreMock.Setup(v => v.GetActiveAsync(userId)).Returns(Task.FromResult(new[] {
                    new FocusItem()
                    {
                        CalendarEventFeedId = feedId,
                        CalendarEventId     = "evt1",
                        IndicateTime        = now.AddMinutes(30)
                    },
                    new FocusItem()
                    {
                        CalendarEventFeedId = feedId,
                        CalendarEventId     = "evt2",
                        IndicateTime        = now.AddMinutes(-5)
                    },
                    new FocusItem()
                    {
                        CalendarEventFeedId = feedId,
                        CalendarEventId     = "evt3",
                        IndicateTime        = now.AddMinutes(-10)
                    }
                }));
                calendarServiceMock.Setup(v => v.Users[userId].Feeds[feedId].Events.Get(It.IsAny <string>()))
                .Returns <string>(d => Task.FromResult(new Event()
                {
                    Subject = d + "Subject"
                }));
                var service = new DeviceDataService(focusStoreMock.Object,
                                                    deviceSyncStoreMock.Object, calendarServiceMock.Object, travelServiceMock.Object);
                var data = await service.GetDeviceData(userId, deviceId);

                Assert.Equal("evt2Subject", data.Event.Subject);
            }
            public async Task MapCorrectly()
            {
                const string userId              = "userId";
                const string deviceId            = "devId";
                const string feedId              = "feed";
                const string evtId               = "evt";
                const string directionsKey       = "dirs";
                DateTime     now                 = DateTime.Now;
                var          deviceSyncStoreMock = new Mock <IDeviceSyncStore>(MockBehavior.Strict);

                deviceSyncStoreMock.Setup(d => d.DeviceClaimedByAsync(deviceId)).Returns(Task.FromResult(userId));
                var digitPushServiceClientMock = new Mock <IDigitPushServiceClient>(MockBehavior.Strict);
                var calendarServiceMock        = new Mock <ICalendarServiceClient>(MockBehavior.Strict);
                var travelServiceMock          = new Mock <ITravelServiceClient>(MockBehavior.Strict);
                var focusStoreMock             = new Mock <IFocusStore>(MockBehavior.Strict);

                focusStoreMock.Setup(v => v.GetActiveAsync(userId)).Returns(Task.FromResult(new[] {
                    new FocusItem()
                    {
                        CalendarEventFeedId = feedId,
                        DirectionsMetadata  = new DirectionsMetadata()
                        {
                            Key = directionsKey
                        },
                        CalendarEventId = evtId,
                        IndicateTime    = now.AddMinutes(-5)
                    }
                }));
                calendarServiceMock.Setup(v => v.Users[userId].Feeds[feedId].Events.Get(evtId))
                .Returns(Task.FromResult(new Event()
                {
                    Subject = "subject",
                    Start   = now.AddMinutes(35)
                }));
                travelServiceMock.Setup(v => v.Directions[directionsKey].GetAsync())
                .Returns(Task.FromResult(new DirectionsResult()
                {
                    TransitDirections = new TransitDirections()
                    {
                        Routes = new[] {
                            new Route()
                            {
                                DepatureTime = now.AddMinutes(2),
                                ArrivalTime  = now.AddMinutes(32),
                                Steps        = new [] {
                                    new Step()
                                    {
                                        DepartureStop = new Stop()
                                        {
                                            Name = "Departure1"
                                        },
                                        ArrivalStop = new Stop()
                                        {
                                            Name = "Arrival1"
                                        },
                                        DepartureTime = now.AddMinutes(3),
                                        Line          = new Line()
                                        {
                                            ShortName = "Line1"
                                        },
                                        Headsign = "Direction1"
                                    },
                                    new Step()
                                    {
                                        DepartureStop = new Stop()
                                        {
                                            Name = "Departure2"
                                        },
                                        ArrivalStop = new Stop()
                                        {
                                            Name = "Arrival3"
                                        },
                                        DepartureTime = now.AddMinutes(16),
                                        Line          = new Line()
                                        {
                                            ShortName = "Line2"
                                        },
                                        Headsign = "Direction2"
                                    }
                                }
                            }
                        }
                    }
                }));
                var service = new DeviceDataService(focusStoreMock.Object,
                                                    deviceSyncStoreMock.Object,
                                                    calendarServiceMock.Object,
                                                    travelServiceMock.Object);
                var data = await service.GetDeviceData(userId, deviceId);

                Assert.Equal("subject", data.Event.Subject);
                Assert.Equal(now.AddMinutes(35), data.Event.Start);
                Assert.Equal(now.AddMinutes(2), data.Directions.DepartureTime);
                Assert.Equal(now.AddMinutes(32), data.Directions.ArrivalTime);
                Assert.Equal(2, data.Directions.Legs.Length);

                Assert.Equal(now.AddMinutes(3), data.Directions.Legs[0].DepartureTime);
                Assert.Equal("Line1", data.Directions.Legs[0].Line);
                Assert.Equal("Direction1", data.Directions.Legs[0].Direction);
                Assert.Equal("Departure1", data.Directions.Legs[0].DepartureStop);
                Assert.Equal("Arrival1", data.Directions.Legs[0].ArrivalStop);

                Assert.Equal(now.AddMinutes(16), data.Directions.Legs[1].DepartureTime);
                Assert.Equal("Line2", data.Directions.Legs[1].Line);
                Assert.Equal("Direction2", data.Directions.Legs[1].Direction);
                Assert.Equal("Departure2", data.Directions.Legs[1].DepartureStop);
                Assert.Equal("Arrival3", data.Directions.Legs[1].ArrivalStop);
            }