public void Create(TicketVerificationDto ticketVerificationDto)
        {
            var ticketVerification = mapper.Map <TicketVerificationDto, TicketVerification>(ticketVerificationDto);

            unitOfWork.TicketVerifications.Create(ticketVerification);
            unitOfWork.Save();
        }
        public TicketVerificationServiceTests()
        {
            var mockTicketVerificationRepository = new Mock <IRepository <TicketVerification, Guid> >();
            var mockTicketRepository             = new Mock <IRepository <Ticket, Guid> >();
            var mockTransportRepository          = new Mock <IRepository <Transport, int> >();
            var mockTicketService           = new Mock <ITicketService>();
            var mockStationRepository       = new Mock <IRepository <Station, int> >();
            var mockRouteStationsRepository = new Mock <IRepository <RouteStation, int> >();

            var mockUnitOfWork = new Mock <IUnitOfWork>();

            fakeAreas = new List <Area>
            {
                new Area {
                    Id = 1, Name = "A"
                },
                new Area {
                    Id = 2, Name = "B"
                }
            };

            fakeTickets = new List <Ticket>
            {
                new Ticket //Normal ticket
                {
                    Id         = Guid.Parse("196d28f2-c6f0-4d70-a872-7a29d5dc79d3"),
                    TicketArea = new TicketArea[] { new TicketArea {
                                                        AreaId = fakeAreas[0].Id
                                                    } }
                },
                new Ticket //Expired ticket
                {
                    Id = Guid.Parse("396d28f2-c6f0-4d70-a872-7a29d5dc79d3"),
                    ActivatedUTCDate  = DateTime.Now.AddDays(-2),
                    ExpirationUTCDate = DateTime.Now.AddDays(-1),
                    TicketArea        = new TicketArea[] { new TicketArea {
                                                               AreaId = fakeAreas[1].Id
                                                           } }
                }
            };

            fakeStations = new List <Station>
            {
                new Station {
                    Id = 1, Latitude = 40.0, Longitude = 40.0, Name = "Station40:40", AreaId = fakeAreas[0].Id, Area = fakeAreas[0]
                },                                                                                                                             //Station in zone A
                new Station {
                    Id = 2, Latitude = 44.0, Longitude = 36.0, Name = "Station44:36", AreaId = fakeAreas[1].Id, Area = fakeAreas[1]
                }                                                                                                                              //Station in zone B
            };

            fakeRoutes = new List <Route>()
            {
                new Route {
                    Id = 1, Number = "157A"
                },
            };

            fakeRouteStations = new List <RouteStation>()
            {
                new RouteStation {
                    Route = fakeRoutes[0], Station = fakeStations[0]
                },
                new RouteStation {
                    Route = fakeRoutes[0], Station = fakeStations[1]
                },
            };

            fakeTransports = new List <Transport>
            {
                new Transport {
                    Id = 1, CarriersId = 1, VehicleNumber = "TE1111ST", RouteId = fakeRoutes[0].Id, Route = fakeRoutes[0]
                },                                                                                                                     //Normal transport
                new Transport {
                    Id = 2, CarriersId = 2, VehicleNumber = "TE3333ST", RouteId = Int32.MaxValue
                }                                                                                            //With wrong route
            };

            fakeTicketVerifications = new List <TicketVerification>
            {
                new TicketVerification
                {
                    Id = Guid.Parse("696d28f2-c6f0-4d70-a872-7a29d5dc79d1"),
                    VerificationUTCDate = new DateTime(2020, 06, 03, 13, 36, 05),
                    TicketId            = fakeTickets[0].Id,
                    StationId           = fakeStations[0].Id,
                    TransportId         = fakeTransports[0].Id
                },
                new TicketVerification
                {
                    Id = Guid.Parse("696d28f2-c6f0-4d70-a872-7a29d5dc79d3"),
                    VerificationUTCDate = new DateTime(2020, 02, 01, 07, 22, 55),
                    TicketId            = fakeTickets[1].Id,
                    StationId           = fakeStations[1].Id,
                    TransportId         = fakeTransports[0].Id
                }
            };

            ticketVerificationDto = new TicketVerificationDto
            {
                Id          = Guid.Parse("696d28f2-c6f0-4d70-a872-7a29d5dc79d4"),
                TicketId    = Guid.Parse("696d28f2-c6f0-4d70-a872-7a29d5dc79d7"),
                TransportId = 4,
                StationId   = 6,
                IsVerified  = false
            };

            //mock TicketVerification
            mockTicketVerificationRepository.Setup(m => m.GetAll()).Returns(fakeTicketVerifications.AsQueryable);
            mockTicketVerificationRepository.Setup(m => m.Get(It.IsAny <Guid>()))
            .Returns <Guid>(id => fakeTicketVerifications.Single(t => t.Id == id));
            mockTicketVerificationRepository.Setup(r => r.Create(It.IsAny <TicketVerification>()))
            .Callback <TicketVerification>(t => fakeTicketVerifications.Add(ticketVerification = t));
            mockUnitOfWork.Setup(m => m.TicketVerifications).Returns(mockTicketVerificationRepository.Object);

            //mock Tickets
            mockTicketRepository.Setup(m => m.GetAll()).Returns(fakeTickets.AsQueryable);
            mockUnitOfWork.Setup(m => m.Tickets).Returns(mockTicketRepository.Object);

            //mock Transports
            mockTransportRepository.Setup(m => m.Get(It.IsAny <int>()))
            .Returns <int>(id => fakeTransports.FirstOrDefault(t => t.Id == id));
            mockUnitOfWork.Setup(m => m.Transports).Returns(mockTransportRepository.Object);

            //mock Stations
            mockStationRepository.Setup(m => m.GetAll()).Returns(fakeStations.AsQueryable);
            mockUnitOfWork.Setup(m => m.Stations).Returns(mockStationRepository.Object);

            //mock RouteStation
            mockRouteStationsRepository.Setup(m => m.GetAll()).Returns(fakeRouteStations.AsQueryable);
            mockUnitOfWork.Setup(m => m.RouteStation).Returns(mockRouteStationsRepository.Object);

            mockTicketService.Setup(x => x.Activate(It.IsAny <Guid>()))
            .Callback <Guid>(id => {
                fakeTickets.Single(t => t.Id == id).ActivatedUTCDate  = DateTime.Now;
                fakeTickets.Single(t => t.Id == id).ExpirationUTCDate = DateTime.Now.AddHours(1);
            });

            ticketVerificationService = new TicketVerificationService(mockUnitOfWork.Object, mockTicketService.Object);
        }
        public VerifyTicketResponceDto VerifyTicket(Guid ticketId, int transportId, float longitude, float latitude)
        {
            var ticket = unitOfWork
                         .Tickets
                         .GetAll()
                         .Include(t => t.TicketArea)
                         .FirstOrDefault(t => t.Id == ticketId);

            if (ticket == null)
            {
                return(new VerifyTicketResponceDto {
                    IsValid = false, ErrorMessage = "Ticket was not found"
                });
            }
            if (ticket.ActivatedUTCDate == null)
            {
                ticketService.Activate(ticket.Id);
            }

            var transport = unitOfWork.Transports.Get(transportId);

            if (transport == null)
            {
                return(new VerifyTicketResponceDto {
                    IsValid = false, ErrorMessage = "Transport was not found"
                });
            }

            var station = GetNearestStationOnRoute(transport.RouteId, latitude, longitude);

            if (station == null)
            {
                return(new VerifyTicketResponceDto {
                    IsValid = false, ErrorMessage = "Station was not found"
                });
            }

            VerifyTicketResponceDto result = new VerifyTicketResponceDto {
                IsValid = true
            };

            //Check for expired ticket
            if (ticket.ExpirationUTCDate < DateTime.UtcNow)
            {
                result = new VerifyTicketResponceDto {
                    IsValid = false, ErrorMessage = "Ticket expired"
                };
            }
            //Compare ticket areas with train station
            else if (!ticket.TicketArea.Any(t => t.AreaId == station.Area.Id))
            {
                result = new VerifyTicketResponceDto {
                    IsValid = false, ErrorMessage = "Ticket does not contain the zone"
                };
            }

            var ticketVerificationDto = new TicketVerificationDto
            {
                Id = Guid.NewGuid(),
                VerificationUTCDate = DateTime.UtcNow,
                TicketId            = ticketId,
                TransportId         = transport.Id,
                StationId           = station.Id,
                IsVerified          = result.IsValid
            };

            Create(ticketVerificationDto);

            return(result);
        }