/// <summary>
        /// Initialised when user logs in
        /// I probably would have created a container module for this
        /// </summary>
        public static UserSessionState Initialise(User user, IRepository <User, UserPet> userRepository,
                                                  IRepository <Pet, PetMetric> petRepository, IRepository <Animal, AnimalMetric> animalRepository,
                                                  IRepository <Interaction, MetricInteraction> interactionRepository, IConfiguration config,
                                                  UserSessionBuilder userSessionBuilder, IContainer container)
        {
            //Validator
            var petRegistrationValidator =
                new PetRegistrationValidator(animalRepository, petRepository, userRepository);

            var petCareActionValidator =
                new PetCareActionValidator(petRepository, interactionRepository);
            var validator = new UserSessionRequestValidator(user, userRepository, petRepository,
                                                            petRegistrationValidator, petCareActionValidator);

            //Persisters
            var petPersister       = container.RecordPersister <Pet>();
            var userPetPersister   = container.RecordPersister <UserPet>();
            var petMetricPersister = container.RecordPersister <PetMetric>();

            //Processor
            var sessionRequestProcessor = new SessionRequestProcessor(user, userRepository, petRepository,
                                                                      interactionRepository, petPersister, userPetPersister,
                                                                      petMetricPersister, userSessionBuilder);

            return(new UserSessionState(user, userRepository, petRepository, validator, sessionRequestProcessor));
        }
        public void Setup()
        {
            _petMetrics = new List <PetMetric>();
            _petMetrics.AddRange(TestData.UsersPets.BurberryPetMetrics);
            _petMetrics.AddRange(TestData.UsersPets.VersacePetMetrics);

            _nonReponsiveMetricIds = _petMetrics.Select(petMetric => petMetric.MetricId + 5).ToList();
            _reponsiveMetricIds    = _petMetrics.Select(petMetric => petMetric.MetricId).ToList();

            _mockInteractionRepository = new Mock <IRepository <Interaction, MetricInteraction> >();
            _mockPetRepository         = new Mock <IRepository <Pet, PetMetric> >();

            _mockPetRepository.Setup(m => m.FindAssociatedById(It.IsAny <int>()))
            .Returns(TestData.UsersPets.VersacePetMetrics);

            _validPayload = new UserPetCareAction()
            {
                PetId         = TestData.UsersPets.VersacePetId,
                InteractionId = TestData.Interactions.TakeSelfieWithInteractionId,
                UserId        = TestData.Users.MeJulieUserId
            };

            _sut = new PetCareActionValidator(_mockPetRepository.Object, _mockInteractionRepository.Object);
        }