public void Event_create_animal_creates_a_new_animal()
        {
            // Arrange
            var ruleset = Build.Ruleset("BaseRuleset")
                          .WithAnimalType("HorseId")
                          .HavingAttribute("HappinessId", initialValue: 33)
                          .And.Finish;

            var e = new CreateAnimalEvent
            {
                EventId      = "EventId",
                ActingUserId = "UserId",
                OwnerUserId  = "UserId",
                AnimalId     = "AnimalId",
                Name         = "Boxer",
                AnimalTypeId = "HorseId",
                Time         = DateTime.UtcNow
            };

            Animal newAnimal = null;
            Action <ITransaction, Animal> setNewAnimal = (tx, a) => newAnimal = a;

            _rulesetRepositoryMock.Setup(_ => _.ByIdAsync(It.IsAny <ITransaction>(), ruleset.Id, ruleset.Id)).ReturnsAsync(ruleset);
            _animalRepositoryMock.Setup(_ => _.ByIdAsync(It.IsAny <ITransaction>(), e.OwnerUserId, e.AnimalId)).ReturnsAsync((Animal)null);
            _animalRepositoryMock.Setup(_ => _.UpsertAsync(It.IsAny <ITransaction>(), It.IsAny <Animal>())).Callback(setNewAnimal)
            .Returns(Task.CompletedTask);

            var client        = CreateTestClient();
            var stringContent = new StringContent(JsonConvert.SerializeObject(e), Encoding.UTF8, "application/json");

            // Act
            HttpResponseMessage response = client.PutAsync($"event", stringContent).GetAwaiter().GetResult();

            // Assert
            response.EnsureSuccessStatusCode();

            Assert.NotNull(newAnimal);
            Assert.Equal(e.AnimalId, newAnimal.Id);
            Assert.Equal(e.Name, newAnimal.Name);
            var animalTypeAttribute = ruleset.AnimalTypes[e.AnimalTypeId].Attributes.First();

            Assert.Equal(animalTypeAttribute.Key, newAnimal.Attributes.First().Key);
            Assert.Equal(animalTypeAttribute.Value.InitialValue, newAnimal.Attributes.First().Value);
        }
        public void Appply_instantiates_a_new_animal()
        {
            // ArrangeNa
            const string  ownerUserId           = "UserId";
            const string  animalId              = "AnimalId";
            const string  animalName            = "Snowball";
            const string  animalTypeId          = "PigTypeId";
            const string  attributeId           = "AttributeId";
            const decimal attributeInitialValue = 30.5M;
            DateTime      time = DateTime.UtcNow;

            var ruleset = Build.Ruleset()
                          .WithAnimalType(animalTypeId)
                          .HavingAttribute(attributeId, initialValue: attributeInitialValue)
                          .And.Finish;

            var target = new CreateAnimalEventHandler();

            CreateAnimalEvent e = new CreateAnimalEvent
            {
                AnimalId     = animalId,
                OwnerUserId  = ownerUserId,
                AnimalTypeId = animalTypeId,
                Name         = animalName,
                Time         = time
            };

            var context = new MockAnimalEventContext(null, ruleset);

            // Act
            target.Apply(e, context);

            // Assert
            Animal animal = context.Animal;

            Assert.NotNull(animal);
            Assert.Equal(animalId, animal.Id);
            Assert.Equal(ownerUserId, animal.UserId);
            Assert.Equal(animalTypeId, animal.TypeId);
            Assert.Equal(time, animal.LastCalculated);
            Assert.Equal(attributeInitialValue, animal.Attributes[attributeId]);
        }