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_WhenCalledAndNoCreatedContactWasReturnedFromMicrosoftGraphRepository_AssertCreateOrUpdateContactSupplementAsyncWasNotCalledOnContactRepository()
        {
            CommandHandler sut = CreateSut(false);

            ICreateContactCommand command = CreateCreateContactCommandMock().Object;
            await sut.ExecuteAsync(command);

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

            Mock <IContact>       contactMock = _fixture.BuildContactMock();
            ICreateContactCommand command     = CreateCreateContactCommandMock(contact: contactMock.Object).Object;
            await sut.ExecuteAsync(command);

            contactMock.VerifySet(m => m.ExternalIdentifier = It.IsAny <string>(), Times.Never);
        }
        public async Task ExecuteAsync_WhenCalledAndNoCreatedContactWasReturnedFromMicrosoftGraphRepository_AssertExternalIdentifierWasNotCalledOnCreatedContactFromMicrosoftGraphRepository()
        {
            Mock <IContact> createdMicrosoftGraphContactMock = _fixture.BuildContactMock();
            CommandHandler  sut = CreateSut(false, createdMicrosoftGraphContactMock.Object);

            ICreateContactCommand command = CreateCreateContactCommandMock().Object;
            await sut.ExecuteAsync(command);

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

            IContact contact = _fixture.BuildContactMock().Object;
            ICreateContactCommand command = CreateCreateContactCommandMock(contact: contact).Object;
            await sut.ExecuteAsync(command);

            _contactRepositoryMock.Verify(m => m.CreateOrUpdateContactSupplementAsync(It.Is <IContact>(value => value == contact), It.Is <string>(value => value == null)), Times.Once);
        }
        public async Task ExecuteAsync_WhenCalled_AssertToDomainWasCalledOnCommand()
        {
            CommandHandler sut = CreateSut();

            Mock <ICreateContactCommand> commandMock = CreateCreateContactCommandMock();
            await sut.ExecuteAsync(commandMock.Object);

            commandMock.Verify(m => m.ToDomain(
                                   It.Is <IContactRepository>(value => value == _contactRepositoryMock.Object),
                                   It.Is <IAccountingRepository>(value => value == _accountingRepositoryMock.Object)),
                               Times.Once);
        }
        public async Task ExecuteAsync_WhenCalledAndCreatedContactWasReturnedFromMicrosoftGraphRepository_AssertExternalIdentifierSetterWasCalledOnContactFromToDomainOnCommandExternalIdentifierFromCreatedContactFromMicrosoftGraphRepository()
        {
            string         externalIdentifier           = _fixture.Create <string>();
            IContact       createdMicrosoftGraphContact = _fixture.BuildContactMock(externalIdentifier: externalIdentifier).Object;
            CommandHandler sut = CreateSut(createdMicrosoftGraphContact: createdMicrosoftGraphContact);

            Mock <IContact>       contactMock = _fixture.BuildContactMock();
            ICreateContactCommand command     = CreateCreateContactCommandMock(contact: contactMock.Object).Object;
            await sut.ExecuteAsync(command);

            contactMock.VerifySet(m => m.ExternalIdentifier = It.Is <string>(value => string.CompareOrdinal(value, externalIdentifier) == 0), Times.Once);
        }
        public async Task ExecuteAsync_WhenCalled_AssertCreateContactAsyncWasCalledOnMicrosoftGraphRepository()
        {
            CommandHandler sut = CreateSut();

            IRefreshableToken     refreshableToken = _fixture.BuildRefreshableTokenMock().Object;
            IContact              contact          = _fixture.BuildContactMock().Object;
            ICreateContactCommand command          = CreateCreateContactCommandMock(refreshableToken, contact).Object;
            await sut.ExecuteAsync(command);

            _microsoftGraphRepositoryMock.Verify(m => m.CreateContactAsync(
                                                     It.Is <IRefreshableToken>(value => value == refreshableToken),
                                                     It.Is <IContact>(value => value == contact)),
                                                 Times.Once);
        }