public void CreateInteractor_Success()
        {
            //arrange
            IEntityGateway    entityGateway = InMemoryEntityGatewayFactory.CreateEntityGateway();
            IAddClubPresenter presenter     = new FakeAddClubPresenter(_output);

            //act
            var interactor = new AddClubInteractor(presenter, entityGateway);

            //assert
            Assert.NotNull(interactor);
        }
        public void CreateInteractor_ThrowsException_NullGateway()
        {
            //arrange
            IEntityGateway    entityGateway = null;
            IAddClubPresenter presenter     = new FakeAddClubPresenter(_output);

            //act
            Action action = () => new AddClubInteractor(presenter, entityGateway);

            //assert
            Assert.Throws <ArgumentNullException>(action);
        }
        public async Task AddClubAsync_ThrowsException_NullInput()
        {
            //arrange
            IEntityGateway     entityGateway = InMemoryEntityGatewayFactory.CreateEntityGateway();
            IAddClubPresenter  presenter     = new FakeAddClubPresenter(_output);
            IAddClubInteractor interactor    = new AddClubInteractor(presenter, entityGateway);
            AddClubInputModel  inputModel    = null;

            //act
            async Task <CommandResult <AddClubOutputModel> > function() => await interactor.AddClubAsync(inputModel);

            //assert
            await Assert.ThrowsAsync <ArgumentNullException>(function);
        }
        public async Task AddClubAsync_FailedModelValidation_NullName()
        {
            //arrange
            IEntityGateway     entityGateway = InMemoryEntityGatewayFactory.CreateEntityGateway();
            IAddClubPresenter  presenter     = new FakeAddClubPresenter(_output);
            IAddClubInteractor interactor    = new AddClubInteractor(presenter, entityGateway);
            AddClubInputModel  inputModel    = new AddClubInputModel();

            //act
            var result = await interactor.AddClubAsync(inputModel);

            //assert
            Assert.NotNull(result);
            Assert.True(result.Status == Application.Common.CommandResultStatusCode.FailedModelValidation);
            Assert.True(result.ModelValidationErrors.ContainsKey(Domain.Common.ModelValidationStatusCode.RequiredInformationMissing));
        }
        public async Task AddClubAsync_CommandResult_Success()
        {
            //arrange
            IEntityGateway     entityGateway = InMemoryEntityGatewayFactory.CreateEntityGateway();
            IAddClubPresenter  presenter     = new FakeAddClubPresenter(_output);
            IAddClubInteractor interactor    = new AddClubInteractor(presenter, entityGateway);
            AddClubInputModel  inputModel    = new AddClubInputModel {
                Name = "C# Knights"
            };

            //act
            var result = await interactor.AddClubAsync(inputModel);

            //assert
            Assert.NotNull(result);
            Assert.True(result.Status == Application.Common.CommandResultStatusCode.Success);
            Assert.Null(result.ModelValidationErrors);
            Assert.NotNull(result.OutputModel);
            Assert.True(result.OutputModel.Id != Guid.Empty);
        }
        public async Task AddClubAsyncExistingClubNameDifferentCase_CommandResult_DuplicateEntry()
        {
            //arrange
            string duplicatedClubName = "C# Knights";
            var    clubsToPreload     = new Club[] { new Club {
                                                         Name = duplicatedClubName
                                                     } };
            IEntityGateway entityGateway = await InMemoryEntityGatewayFactory.CreateEntityGatewayAsync(clubsToPreload);

            IAddClubPresenter  presenter  = new FakeAddClubPresenter(_output);
            IAddClubInteractor interactor = new AddClubInteractor(presenter, entityGateway);
            AddClubInputModel  inputModel = new AddClubInputModel {
                Name = duplicatedClubName.ToLowerInvariant()
            };

            //act
            var result = await interactor.AddClubAsync(inputModel);

            //assert
            Assert.NotNull(result);
            Assert.True(result.Status == Application.Common.CommandResultStatusCode.DuplicateEntry);
        }