public async Task Put(string userId, [FromBody] UpdatedAccountSettings updatedAccountSettingsData)
        {
            userId.AssertUrlParameterProvided("userId");
            updatedAccountSettingsData.AssertBodyProvided("updatedAccountSettings");

            var updatedAccountSettings = updatedAccountSettingsData.Parse();
            var requester = await this.requesterContext.GetRequesterAsync();

            var requestedUserId = new UserId(userId.DecodeGuid());

            var newProfileImageId
                = updatedAccountSettingsData.NewProfileImageId == null
                ? null
                : new FileId(updatedAccountSettingsData.NewProfileImageId.DecodeGuid());

            var command = new UpdateAccountSettingsCommand(
                requester,
                requestedUserId,
                updatedAccountSettings.NewUsername,
                updatedAccountSettings.NewEmail,
                this.guidCreator.Create().ToString(),
                updatedAccountSettings.NewPassword,
                newProfileImageId);

            await this.updateAccountSettings.HandleAsync(command);
        }
        public async Task WhenCalledWithValidData_ItShouldCallTheAccountRepository()
        {
            this.reservedUsernames.Setup(v => v.AssertNotReserved(Username)).Verifiable();

            var command = new UpdateAccountSettingsCommand(
                Requester,
                UserId,
                Username,
                Email,
                SecurityToken,
                Password,
                FileId);

            this.fileSecurity.Setup(v => v.AssertReferenceAllowedAsync(UserId, FileId))
            .Returns(Task.FromResult(0));

            this.updateAccountSettings.Setup(
                v =>
                v.ExecuteAsync(
                    UserId,
                    Username,
                    Email,
                    Password,
                    FileId,
                    SecurityToken)).ReturnsAsync(new UpdateAccountSettingsDbStatement.UpdateAccountSettingsResult(false))
            .Verifiable();

            await this.target.HandleAsync(command);

            this.reservedUsernames.Verify();
            this.updateAccountSettings.Verify();
        }
        public async Task WhenCalledWithUnauthorizedFileId_ItShouldCallThrowAnUnauthroizedException()
        {
            var command = new UpdateAccountSettingsCommand(
                Requester,
                UserId,
                Username,
                Email,
                SecurityToken,
                Password,
                FileId);

            this.fileSecurity.Setup(v => v.AssertReferenceAllowedAsync(UserId, FileId))
            .Throws(new UnauthorizedException());

            await this.target.HandleAsync(command);
        }
        public async Task WhenPutIsCalled_ItShouldCallTheCommandHandler()
        {
            var command = new UpdateAccountSettingsCommand(Requester, RequestedUserId, Username, Email, SecurityToken, Password, FileId);

            this.updateAccountSettings.Setup(v => v.HandleAsync(command))
            .Returns(Task.FromResult(0))
            .Verifiable();

            var updatedAccountSettings = new UpdatedAccountSettings
            {
                NewEmail          = Email.Value,
                NewPassword       = Password.Value,
                NewUsername       = Username.Value,
                NewProfileImageId = FileId.Value.EncodeGuid(),
            };

            await this.target.Put(RequestedUserId.Value.EncodeGuid(), updatedAccountSettings);

            this.updateAccountSettings.Verify();
        }