public void GetProfileDataAsync_UserFound_NoClaimsRequested_NoIssuedClaims()
        {
            // Arrange
            var userId = Guid.NewGuid();

            var options           = new MembershipOptions();
            var membershipService = A.Fake <IMembershipService>();
            var roleService       = A.Fake <IRoleService>();

            var user = new MembershipUser();

            A.CallTo(() => membershipService.GetUserAsync(userId)).Returns(Task.FromResult(user));

            var context = new ProfileDataRequestContext
            {
                Subject = new ClaimsPrincipal(new ClaimsIdentity(new List <Claim>
                {
                    new Claim(Constants.ClaimTypes.Subject, userId.ToString("N"))
                })),
                AllClaimsRequested  = false,
                RequestedClaimTypes = new List <string>()
            };

            var service = new MembershipUserService(options, membershipService, roleService);

            // Act
            service.GetProfileDataAsync(context).Wait();

            // Assert
            context.IssuedClaims.Should().BeNullOrEmpty();

            A.CallTo(() => membershipService.GetUserAsync(userId));
        }
        public void GetProfileDataAsync_UserNotFound_ThrowsArgumentException()
        {
            // Arrange
            var userId = Guid.NewGuid();

            var options           = new MembershipOptions();
            var membershipService = A.Fake <IMembershipService>();
            var roleService       = A.Fake <IRoleService>();

            A.CallTo(() => membershipService.GetUserAsync(userId)).Returns(Task.FromResult((MembershipUser)null));

            var context = new ProfileDataRequestContext
            {
                Subject = new ClaimsPrincipal(new ClaimsIdentity(new List <Claim>
                {
                    new Claim(Constants.ClaimTypes.Subject, userId.ToString("N"))
                }))
            };

            var service = new MembershipUserService(options, membershipService, roleService);

            Action getProfileDataAsync = () => service.GetProfileDataAsync(context).Wait();

            // Act
            getProfileDataAsync.Should().Throw <ArgumentException>().WithMessage("Invalid subject identifier");

            // Assert
            A.CallTo(() => membershipService.GetUserAsync(userId)).MustHaveHappened();
        }
        public void GetProfileDataAsync_UserFound_AllClaimsRequested_RolesIncluded_NoIssuedClaims()
        {
            // Arrange
            var userId = Guid.NewGuid();

            var options = new MembershipOptions
            {
                UseRoleProviderSource = true,
                IdentityProvider      = "idsvr"
            };
            var membershipService = A.Fake <IMembershipService>();
            var roleService       = A.Fake <IRoleService>();

            var user = new MembershipUser
            {
                UserId      = userId,
                UserName    = "******",
                Email       = "*****@*****.**",
                IsLockedOut = false
            };

            A.CallTo(() => membershipService.GetUserAsync(userId))
            .Returns(Task.FromResult(user));
            A.CallTo(() => roleService.GetRolesForUser("*****@*****.**"))
            .Returns(Task.FromResult(new[] { "role1", "role2", "role3" }));

            var context = new ProfileDataRequestContext
            {
                Subject = new ClaimsPrincipal(new ClaimsIdentity(new List <Claim>
                {
                    new Claim(Constants.ClaimTypes.Subject, userId.ToString("N"))
                })),
                AllClaimsRequested  = true,
                RequestedClaimTypes = new List <string>()
            };

            var service = new MembershipUserService(options, membershipService, roleService);

            // Act
            service.GetProfileDataAsync(context).Wait();

            // Assert
            var issuedClaims = context.IssuedClaims.ToList();

            issuedClaims.Should().HaveCount(11);

            issuedClaims.ShouldContain(JwtClaimTypes.Subject, userId.ToString("N"));
            issuedClaims.ShouldContain(JwtClaimTypes.PreferredUserName, "*****@*****.**");
            issuedClaims.ShouldContain(JwtClaimTypes.Email, "*****@*****.**");
            issuedClaims.ShouldContain(JwtClaimTypes.IdentityProvider, "idsvr");

            issuedClaims.ShouldContain(JwtClaimTypes.Role, "role1");
            issuedClaims.ShouldContain(JwtClaimTypes.Role, "role2");
            issuedClaims.ShouldContain(JwtClaimTypes.Role, "role3");

            A.CallTo(() => membershipService.GetUserAsync(userId));
        }
        public void GetProfileDataAsync_SubjectClaimMissing_ThrowsInvalidOperationException()
        {
            // Arrange
            var options           = new MembershipOptions();
            var membershipService = A.Fake <IMembershipService>();
            var roleService       = A.Fake <IRoleService>();

            var context = new ProfileDataRequestContext
            {
                Subject = new ClaimsPrincipal(new ClaimsIdentity(new List <Claim>()))
            };

            var service = new MembershipUserService(options, membershipService, roleService);

            Action getProfileDataAsync = () => service.GetProfileDataAsync(context).Wait();

            // Act + Assert
            getProfileDataAsync.Should().Throw <InvalidOperationException>();
        }
        public void GetProfileDataAsync_SubjectNull_ThrowsArgumentNullException()
        {
            // Arrange
            var options           = new MembershipOptions();
            var membershipService = A.Fake <IMembershipService>();
            var roleService       = A.Fake <IRoleService>();

            var context = new ProfileDataRequestContext {
                Subject = null
            };

            var service = new MembershipUserService(options, membershipService, roleService);

            Action getProfileDataAsync = () => service.GetProfileDataAsync(context).Wait();

            // Act + Assert
            getProfileDataAsync.Should().Throw <ArgumentNullException>()
            .And.ParamName.Should().Be("subject");
        }
        public void GetProfileDataAsync_SubjectClaimInvalid_ThrowsArgumentException(string subjectId)
        {
            // Arrange
            var options           = new MembershipOptions();
            var membershipService = A.Fake <IMembershipService>();
            var roleService       = A.Fake <IRoleService>();

            var context = new ProfileDataRequestContext
            {
                Subject = new ClaimsPrincipal(new ClaimsIdentity(new List <Claim>
                {
                    new Claim(Constants.ClaimTypes.Subject, subjectId)
                }))
            };

            var service = new MembershipUserService(options, membershipService, roleService);

            Action getProfileDataAsync = () => service.GetProfileDataAsync(context).Wait();

            // Act + Assert
            getProfileDataAsync.Should().Throw <ArgumentException>().WithMessage("Invalid subject identifier");
        }