public async Task ClientIdIsNull_BuildsWorkContext()
        {
            string          un       = "user-name";
            var             expRoles = new[] { "role1", "role2", "role3" };
            var             logger   = new Mock <ILogger <WorkContextMiddleware> >();
            var             i        = 0;
            RequestDelegate n        = c =>
            {
                i++;
                return(Task.CompletedTask);
            };
            var wcm = new WorkContextMiddleware(n, logger.Object);

            var claims = new[]
            {
                new Claim(ClaimTypes.NameIdentifier, un),
                new Claim(ClaimTypes.Role, expRoles[0]),
                new Claim(ClaimTypes.Role, expRoles[1]),
                new Claim(ClaimTypes.Role, expRoles[2]),
            };
            var hc = new Mock <HttpContext>();

            hc.Setup(h => h.User).Returns(new ClaimsPrincipal(new ClaimsIdentity(claims)));
            var wc = new WorkContext();
            await wcm.InvokeAsync(hc.Object, wc);

            wc.CurrentClientId.ShouldBe(un);
            wc.CurrentRoles.Count().ShouldBe(expRoles.Length);
            wc.CurrentRoles.ShouldAllBe(e => expRoles.Contains(e));
            i.ShouldBe(1);
        }
        public async Task UserIdIsNull_ReturnUnauthroized()
        {
            var logger = new Mock <ILogger <WorkContextMiddleware> >();
            var ecr    = new EntityConfigRecord
            {
                EndpointSettings = new EndpointSettings
                {
                    Route       = "/some-resource",
                    GetSettings = new EndpointMethodSettings {
                        Disabled = true
                    },
                    PutSettings = new EndpointMethodSettings {
                        Disabled = true
                    },
                },
                Type = typeof(string),
            };
            var entityConfigRecords = new[] { ecr };
            var wcm = new WorkContextMiddleware(null, entityConfigRecords, logger.Object);

            var user = new Mock <ClaimsPrincipal>();

            user.Setup(u => u.Claims).Returns(new Claim[] { });
            var ctx = new Mock <HttpContext>();

            ctx.SetupGet(r => r.Request.Headers).Returns(new HeaderDictionary());
            var res = new Mock <HttpResponse>();

            ctx.Setup(h => h.User).Returns(user.Object);
            ctx.Setup(h => h.Response).Returns(res.Object);
            var wc = new WorkContext();
            await wcm.InvokeAsync(ctx.Object, wc);

            res.VerifySet(r => r.StatusCode = StatusCodes.Status401Unauthorized, Times.Once);
        }
        public async Task ParseRequestInfoAndMoveToNext()
        {
            int i                 = 0,
                expI              = 15;
            string expUserId      = "user-id",
                   route          = "/some-resource/part2/",
                   expRequesteeId = "123",
                   expPath        = $"{route}/__public/{expRequesteeId}",
                   expMethod      = "get";

            var ecr = new EntityConfigRecord
            {
                Name             = "nane",
                EndpointSettings = new EndpointSettings
                {
                    Route = route,
                },
                Type = typeof(string),
            };
            var             entityConfigRecords = new[] { ecr };
            RequestDelegate reqDel = hc =>
            {
                i = expI;
                return(Task.CompletedTask);
            };

            var logger = new Mock <ILogger <WorkContextMiddleware> >();
            var user   = new ClaimsPrincipal(new ClaimsIdentity(new[] { new Claim(ClaimTypes.NameIdentifier, expUserId) }));
            var ctx    = new Mock <HttpContext>();
            var req    = new Mock <HttpRequest>();

            req.Setup(r => r.Path).Returns(new PathString(expPath));
            req.Setup(r => r.Method).Returns(expMethod);
            req.SetupGet(r => r.Headers).Returns(new HeaderDictionary());

            var response = new Mock <HttpResponse>();

            ctx.Setup(h => h.User).Returns(user);
            ctx.Setup(h => h.Request).Returns(req.Object);
            ctx.Setup(h => h.Response).Returns(response.Object);
            var wc = new WorkContext();

            var wcm = new WorkContextMiddleware(reqDel, entityConfigRecords, logger.Object);
            await wcm.InvokeAsync(ctx.Object, wc);

            i.ShouldBe(expI);
            wc.CurrentEntityConfigRecord.ShouldBe(ecr);
            wc.RequestInfo.Path.ShouldBe(expPath);
            wc.RequestInfo.Method.ShouldBe(expMethod);
            wc.RequestInfo.RequesteeId.ShouldBe(expRequesteeId);
        }
        public async Task ClientIdIsNull_ReturnUnauthroized()
        {
            var logger = new Mock <ILogger <WorkContextMiddleware> >();
            var wcm    = new WorkContextMiddleware(null, logger.Object);

            var user = new Mock <ClaimsPrincipal>();

            user.Setup(u => u.Claims).Returns(new Claim[] { });
            var hc = new Mock <HttpContext>();
            var hr = new Mock <HttpResponse>();

            hc.Setup(h => h.User).Returns(user.Object);
            hc.Setup(h => h.Response).Returns(hr.Object);
            await wcm.InvokeAsync(hc.Object, null);

            hr.VerifySet(r => r.StatusCode = StatusCodes.Status401Unauthorized, Times.Once);
        }