public void TestAddInvalidAnimal()
        {
            User user = new User()
            {
                DisplayName = "Some display name"
            };

            Animal animal = new Animal()
            {
                TypeName = "Test animal"
            };

            using (ApiContext context = new ApiContext(dbOptions)) {
                context.Users.Add(user);
                context.Animals.Add(animal);

                context.SaveChanges();
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);

                Assert.Catch <NotFoundException>(() => service.Add(
                                                     new UserAnimal()
                {
                    UserId = user.Id, AnimalId = animal.Id + 1
                }
                                                     ));
            }

            // Make sure no data is in the DB
            using (ApiContext context = new ApiContext(dbOptions)) {
                Assert.AreEqual(0, context.UserAnimals.Count());
            }
        }
        public void TestAdd()
        {
            User user = new User()
            {
                DisplayName = "Some display name"
            };

            Animal animal = new Animal()
            {
                TypeName = "Test animal"
            };

            using (ApiContext context = new ApiContext(dbOptions)) {
                context.Users.Add(user);
                context.Animals.Add(animal);

                context.SaveChanges();
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);

                service.Add(new UserAnimal()
                {
                    UserId = user.Id, AnimalId = animal.Id
                });
            }

            // Make sure the user's animal was added to the DB
            using (ApiContext context = new ApiContext(dbOptions)) {
                Assert.AreEqual(1, context.UserAnimals.Count());
                Assert.AreEqual(user.Id, context.UserAnimals.First().UserId);
                Assert.AreEqual(animal.Id, context.UserAnimals.First().AnimalId);
            }
        }
        public void TestFindOne()
        {
            User user = new User()
            {
                DisplayName = "Some display name"
            };

            Animal animal = new Animal()
            {
                TypeName         = "Test animal",
                HungerPerSecond  = 0.5m,
                SadnessPerSecond = 0.4m
            };

            User user2 = new User()
            {
                DisplayName = "Some display name 2"
            };

            Animal animal2 = new Animal()
            {
                TypeName         = "Test animal 2",
                HungerPerSecond  = 0.5m,
                SadnessPerSecond = 0.4m
            };

            UserAnimal userAnimal;
            UserAnimal userAnimal2;

            using (ApiContext context = new ApiContext(dbOptions)) {
                context.Users.Add(user);
                context.Animals.Add(animal);

                userAnimal = new UserAnimal()
                {
                    UserId   = user.Id,
                    AnimalId = animal.Id,
                };

                userAnimal2 = new UserAnimal()
                {
                    UserId   = user2.Id,
                    AnimalId = animal2.Id,
                };

                context.UserAnimals.Add(userAnimal);
                context.UserAnimals.Add(userAnimal2);
                context.SaveChanges();
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);

                Assert.AreEqual(user.Id, service.FindOne(user.Id).UserId);
                Assert.AreEqual(animal.Id, service.FindOne(user.Id).AnimalId);
                Assert.IsNotNull(service.FindOne(user.Id).Animal);
            }
        }
        public void TestUpdateInvalid()
        {
            User user = new User()
            {
                DisplayName = "Some display name"
            };

            Animal animal = new Animal()
            {
                TypeName         = "Test animal",
                HungerPerSecond  = 0.5m,
                SadnessPerSecond = 0.4m
            };

            UserAnimal userAnimal;

            using (ApiContext context = new ApiContext(dbOptions)) {
                context.Users.Add(user);
                context.Animals.Add(animal);

                userAnimal = new UserAnimal()
                {
                    UserId   = user.Id,
                    AnimalId = animal.Id,
                };
                context.UserAnimals.Add(userAnimal);
                context.SaveChanges();
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);
                userAnimal = context.UserAnimals.Include(ua => ua.Animal).First();

                // Test with an invalid user ID
                userAnimal.UserId = user.Id + 1;
                Assert.Catch <NotFoundException>(() => service.Update(userAnimal));

                // Test with an invalid animal ID
                userAnimal.UserId   = user.Id;
                userAnimal.AnimalId = animal.Id + 1;
                Assert.Catch <NotFoundException>(() => service.Update(userAnimal));
            }
        }
        public void TestUpdate()
        {
            User user = new User()
            {
                DisplayName = "Some display name"
            };

            Animal animal = new Animal()
            {
                TypeName         = "Test animal",
                HungerPerSecond  = 0.5m,
                SadnessPerSecond = 0.4m
            };

            UserAnimal userAnimal;

            using (ApiContext context = new ApiContext(dbOptions)) {
                context.Users.Add(user);
                context.Animals.Add(animal);

                userAnimal = new UserAnimal()
                {
                    UserId   = user.Id,
                    AnimalId = animal.Id,
                };
                context.UserAnimals.Add(userAnimal);
                context.SaveChanges();
            }

            // Check the initial state of the animal
            using (ApiContext context = new ApiContext(dbOptions)) {
                Assert.AreEqual(1, context.UserAnimals.Count());

                userAnimal = context.UserAnimals.Include(ua => ua.Animal).First();

                Assert.AreEqual(0, userAnimal.Hunger);
                Assert.AreEqual(0, userAnimal.Happiness);
            }

            // Add an update (at this stage it won't really update much)
            Thread.Sleep(1000);
            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);

                service.Update(userAnimal);
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                Assert.AreEqual(1, context.UserAnimals.Count());

                userAnimal = context.UserAnimals.Include(ua => ua.Animal).First();
                Assert.AreEqual(0.5, userAnimal.Hunger);
                Assert.AreEqual(-0.4, userAnimal.Happiness);
            }

            // Feed the animal and update again - this will cause the internal dates to update
            Thread.Sleep(1000);
            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);

                userAnimal.Feed(1);
                service.Update(userAnimal);
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                Assert.AreEqual(1, context.UserAnimals.Count());

                userAnimal = context.UserAnimals.Include(ua => ua.Animal).First();
                Assert.AreEqual(0, userAnimal.Hunger);
                Assert.AreEqual(-0.8, userAnimal.Happiness);
            }

            // Stroke the animal and update again - this will cause the internal dates to update
            Thread.Sleep(1000);
            using (ApiContext context = new ApiContext(dbOptions)) {
                UserAnimalService service = new UserAnimalService(context);

                userAnimal.Stroke(1);
                service.Update(userAnimal);
            }

            using (ApiContext context = new ApiContext(dbOptions)) {
                Assert.AreEqual(1, context.UserAnimals.Count());

                userAnimal = context.UserAnimals.Include(ua => ua.Animal).First();
                Assert.AreEqual(0.5, userAnimal.Hunger);
                Assert.AreEqual(0, userAnimal.Happiness);
            }
        }