public async Task ShouldRemoveClassCorrectly()
        {
            var context = new FakeDbContext();
            var handler = new RemoveClassCommandHandler(context);
            var request = new RemoveClassCommand(MockData.ExistingClassId);

            await handler.Handle(request, CancellationToken.None);

            (await context.Classes.ToArrayAsync()).Should().HaveCount(0).And.NotContain(new Class(3, "c"));
        }
        public async Task DoesValidatorPreventFromRemovingNonExistentClass()
        {
            var context   = new FakeDbContext();
            var validator = new RemoveClassValidator(context);
            var request   = new RemoveClassCommand("non-existent-class");

            var result = await validator.ValidateAsync(request);

            result.IsValid.Should().BeFalse();
            result.Errors.Should().HaveCount(1).And.ContainSingle(x => x.ErrorCode == "AsyncPredicateValidator" && x.ErrorMessage == "Mentioned class must already exist.");
        }
        public async Task DoesValidatorAllowCorrectRemoveClassCommand()
        {
            var context   = new FakeDbContext();
            var validator = new RemoveClassValidator(context);
            var request   = new RemoveClassCommand(MockData.ExistingClassId);

            var result = await validator.ValidateAsync(request);

            result.IsValid.Should().BeTrue();
            result.Errors.Should().HaveCount(0);
        }
        public async Task DoesValidatorPreventFromRemovingClassWithNullIdGiven()
        {
            var context   = new FakeDbContext();
            var validator = new RemoveClassValidator(context);
            var request   = new RemoveClassCommand(null);

            var result = await validator.ValidateAsync(request);

            result.IsValid.Should().BeFalse();
            result.Errors.Should().HaveCount(2)
            .And
            .Contain(x => x.ErrorCode == "NotEmptyValidator")
            .And
            .Contain(x => x.ErrorCode == "AsyncPredicateValidator" && x.ErrorMessage == "Mentioned class must already exist.");
        }
        public ClassesViewModel(CharacterViewModel characterViewModel)
        {
            _owner            = characterViewModel;
            _availableClasses = new ObservableCollection <ClassViewModel>
            {
                new ClassViewModel(this, new Rogue()),
                new ClassViewModel(this, new Wizard()),
                new PrestigeClassViewModel(this, new ArcaneSavant())
            };
            _levels = new ObservableCollection <ClassWithLevelViewModel>();
            _createClassLevelCommand  = new CreateClassLevelCommand(this);
            _removeClassCommand       = new RemoveClassCommand(this);
            _addRemoveArchtypeCommand = new AddRemoveArchtypeCommand(this);

            _owner.RaceVM.PropertyChanged += (sender, args) => UpdatedLevels();
        }