public void ExecuteAsync_WhenCommandIsNull_ThrowsArgumentNullException()
        {
            CommandHandler sut = CreateSut();

            ArgumentNullException result = Assert.ThrowsAsync <ArgumentNullException>(async() => await sut.ExecuteAsync(null));

            Assert.That(result.ParamName, Is.EqualTo("command"));
        }
        public async Task ExecuteAsync_WhenCalledAndCommandDoesNotHaveExternalIdentifier_AssertDeleteContactSupplementAsyncWasNotCalledOnContactRepository()
        {
            CommandHandler sut = CreateSut();

            IDeleteContactCommand command = CreateDeleteContactCommandMock(false).Object;
            await sut.ExecuteAsync(command);

            _contactRepositoryMock.Verify(m => m.DeleteContactSupplementAsync(It.IsAny <IContact>()), Times.Never());
        }
        public async Task ExecuteAsync_WhenCalledAndCommandDoesNotHaveExternalIdentifier_AssertGetExistingContactAsyncWasNotCalledOnCommand()
        {
            CommandHandler sut = CreateSut();

            Mock <IDeleteContactCommand> commandMock = CreateDeleteContactCommandMock(false);
            await sut.ExecuteAsync(commandMock.Object);

            commandMock.Verify(m => m.GetExistingContactAsync(It.IsAny <IMicrosoftGraphRepository>(), It.IsAny <IContactRepository>()), Times.Never());
        }
        public async Task ExecuteAsync_WhenCalled_AssertExternalIdentifierWasCalledOnCommand()
        {
            CommandHandler sut = CreateSut();

            Mock <IDeleteContactCommand> commandMock = CreateDeleteContactCommandMock();
            await sut.ExecuteAsync(commandMock.Object);

            commandMock.Verify(m => m.ExternalIdentifier, Times.Once);
        }
        public async Task ExecuteAsync_WhenCalledAndCommandHasExternalIdentifierAndNoExistingContactWasReturnedFromCommand_AssertDeleteContactAsyncWasNotCalledOnMicrosoftGraphRepository()
        {
            CommandHandler sut = CreateSut();

            IDeleteContactCommand command = CreateDeleteContactCommandMock(hasExistingContact: false).Object;
            await sut.ExecuteAsync(command);

            _microsoftGraphRepositoryMock.Verify(m => m.DeleteContactAsync(It.IsAny <IRefreshableToken>(), It.IsAny <string>()), Times.Never());
        }
        public async Task ExecuteAsync_WhenCalledAndCommandDoesNotHaveExternalIdentifier_AssertExternalIdentifierWasNotCalledOnExistingContactFromCommand()
        {
            CommandHandler sut = CreateSut();

            Mock <IContact>       existingContactMock = _fixture.BuildContactMock();
            IDeleteContactCommand command             = CreateDeleteContactCommandMock(false, existingContact: existingContactMock.Object).Object;
            await sut.ExecuteAsync(command);

            existingContactMock.Verify(m => m.ExternalIdentifier, Times.Never);
        }
        public async Task ExecuteAsync_WhenCalledAndCommandHasExternalIdentifierAndExistingContactWithExternalIdentifierWasReturnedFromCommand_AssertDeleteContactSupplementAsyncWasCalledOnContactRepositoryWithExistingContactFromCommand()
        {
            CommandHandler sut = CreateSut();

            IContact existingContact      = _fixture.BuildContactMock().Object;
            IDeleteContactCommand command = CreateDeleteContactCommandMock(existingContact: existingContact).Object;
            await sut.ExecuteAsync(command);

            _contactRepositoryMock.Verify(m => m.DeleteContactSupplementAsync(It.Is <IContact>(value => value == existingContact)), Times.Once());
        }
        public async Task ExecuteAsync_WhenCalledAndCommandHasExternalIdentifierAndExistingContactWasReturnedFromCommand_AssertExternalIdentifierWasCalledOnExistingContactFromCommand()
        {
            CommandHandler sut = CreateSut();

            Mock <IContact>       existingContactMock = _fixture.BuildContactMock();
            IDeleteContactCommand command             = CreateDeleteContactCommandMock(existingContact: existingContactMock.Object).Object;
            await sut.ExecuteAsync(command);

            existingContactMock.Verify(m => m.ExternalIdentifier, Times.Once);
        }
        public async Task ExecuteAsync_WhenCalledAndCommandHasExternalIdentifier_AssertGetExistingContactAsyncWasCalledOnCommand()
        {
            CommandHandler sut = CreateSut();

            Mock <IDeleteContactCommand> commandMock = CreateDeleteContactCommandMock();
            await sut.ExecuteAsync(commandMock.Object);

            commandMock.Verify(m => m.GetExistingContactAsync(
                                   It.Is <IMicrosoftGraphRepository>(value => value == _microsoftGraphRepositoryMock.Object),
                                   It.Is <IContactRepository>(value => value == _contactRepositoryMock.Object)),
                               Times.Once());
        }
        public async Task ExecuteAsync_WhenCalledAndCommandHasExternalIdentifierAndExistingContactWithExternalIdentifierWasReturnedFromCommand_AssertDeleteContactAsyncWasCalledOnMicrosoftGraphRepositoryWithExternalIdentifierFromExistingContactFromCommand()
        {
            CommandHandler sut = CreateSut();

            string                externalIdentifier = _fixture.Create <string>();
            IContact              existingContact    = _fixture.BuildContactMock(externalIdentifier: externalIdentifier).Object;
            IRefreshableToken     refreshableToken   = _fixture.BuildRefreshableTokenMock().Object;
            IDeleteContactCommand command            = CreateDeleteContactCommandMock(existingContact: existingContact, refreshableToken: refreshableToken).Object;
            await sut.ExecuteAsync(command);

            _microsoftGraphRepositoryMock.Verify(m => m.DeleteContactAsync(
                                                     It.Is <IRefreshableToken>(value => value == refreshableToken),
                                                     It.Is <string>(value => string.CompareOrdinal(value, externalIdentifier) == 0)),
                                                 Times.Once);
        }