public async Task Handle_NoEmailsGiven_ThrowsException()
        {
            //Arrange
            var fakeManagementApiClientFactory = Substitute.For <IManagementApiClientFactory>();
            var fakeMediator = Substitute.For <IMediator>();

            var handler = new CreateAuth0UserCommandHandler(
                fakeManagementApiClientFactory,
                fakeMediator);

            //Act
            var exception = await Assert.ThrowsExceptionAsync <InvalidOperationException>(async() =>
                                                                                          await handler.Handle(new CreateAuth0UserCommand(Array.Empty <string>()), default));

            //Assert
            Assert.IsNotNull(exception);
        }
        public async Task Handle_ThreeEmailsGiven_CreatesThreeUsersLinkedIntoOne()
        {
            //Arrange
            var fakeManagementApiClientFactory = Substitute.For <IManagementApiClientFactory>();

            var fakeManagementApiClient = await fakeManagementApiClientFactory.CreateAsync();

            var firstCreatedUser = new User()
            {
                UserId = "user-1"
            };

            fakeManagementApiClient
            .CreateUserAsync(Arg.Any <UserCreateRequest>())
            .Returns(
                firstCreatedUser,
                new User()
            {
                UserId = "user-2"
            },
                new User()
            {
                UserId = "user-3"
            });

            var fakeMediator = Substitute.For <IMediator>();

            var handler = new CreateAuth0UserCommandHandler(
                fakeManagementApiClientFactory,
                fakeMediator);

            //Act
            var createdUser = await handler.Handle(
                new CreateAuth0UserCommand(new []
            {
                "*****@*****.**",
                "*****@*****.**",
                "*****@*****.**"
            }),
                default);

            //Assert
            Assert.AreSame(firstCreatedUser, createdUser);

            await fakeManagementApiClient
            .Received(2)
            .LinkUserAccountAsync(
                "user-1",
                Arg.Any <UserAccountLinkRequest>());

            await fakeManagementApiClient
            .Received(1)
            .LinkUserAccountAsync(
                "user-1",
                Arg.Is <UserAccountLinkRequest>(args =>
                                                args.UserId == "user-2"));

            await fakeManagementApiClient
            .Received(1)
            .LinkUserAccountAsync(
                "user-1",
                Arg.Is <UserAccountLinkRequest>(args =>
                                                args.UserId == "user-3"));
        }
        public async Task Handle_ThreeEmailsGivenAndOneCreationFails_DeletesAdditionalCreatedUser()
        {
            //Arrange
            var fakeManagementApiClientFactory = Substitute.For <IManagementApiClientFactory>();

            var fakeManagementApiClient = await fakeManagementApiClientFactory.CreateAsync();

            var firstCreatedUser = new User()
            {
                UserId = "user-1"
            };

            fakeManagementApiClient
            .CreateUserAsync(Arg.Any <UserCreateRequest>())
            .Returns(
                firstCreatedUser,
                new User()
            {
                UserId = "user-2"
            },
                new User()
            {
                UserId = "user-3"
            });

            fakeManagementApiClient
            .LinkUserAccountAsync(
                "user-1",
                Arg.Is <UserAccountLinkRequest>(args =>
                                                args.UserId == "user-3"))
            .Throws(new TestException());

            var fakeMediator = Substitute.For <IMediator>();

            var handler = new CreateAuth0UserCommandHandler(
                fakeManagementApiClientFactory,
                fakeMediator);

            //Act
            var exception = await Assert.ThrowsExceptionAsync <TestException>(async() =>
                                                                              await handler.Handle(
                                                                                  new CreateAuth0UserCommand(new[]
            {
                "*****@*****.**",
                "*****@*****.**",
                "*****@*****.**"
            }),
                                                                                  default));

            //Assert
            Assert.IsNotNull(exception);

            await fakeManagementApiClient
            .Received(2)
            .LinkUserAccountAsync(
                "user-1",
                Arg.Any <UserAccountLinkRequest>());

            await fakeManagementApiClient
            .Received(1)
            .DeleteUserAsync(Arg.Any <string>());

            await fakeManagementApiClient
            .Received(1)
            .DeleteUserAsync(
                "user-3");
        }