public async Task TestAuthOptions(string header, string user, string password, bool asName, bool asId,
                                          bool asEmail)
        {
            var currentUser = new IdentityUser
            {
                UserName = user
            };

            SetupMockUserManager(user, asName, asId, asEmail, currentUser);

            SetupMockSignInManagerSuccess(password, currentUser);

            var sp = new ServiceCollection()
                     .Configure <BasicAuthenticationOptions>(options =>
            {
                options.FindsByName  = asName;
                options.FindsById    = asId;
                options.FindsByEmail = asEmail;
            })
                     .AddTransient <UserManager <IdentityUser> >(_ => MockUserManager.Object)
                     .AddTransient <SignInManager <IdentityUser> >(_ => MockSignInManager.Object)
                     .AddTransient(_ => MockLogger.Object)
                     .BuildServiceProvider();

            var contextMock = BuildContextMock(header, sp);

            var next = new RequestDelegate(_ => Task.CompletedTask);

            var middleware = new BasicAuthenticationMiddleware <IdentityUser>(next);
            await middleware.InvokeAsync(contextMock.Object);

            Assert.True(contextMock.Object.User.Identity.IsAuthenticated);
        }
        public async void TestEmptyContext()
        {
            var context = new DefaultHttpContext();
            var next    = new RequestDelegate(_ => Task.CompletedTask);

            var oldUser    = context.User;
            var middleware = new BasicAuthenticationMiddleware <IdentityUser>(next);
            await middleware.InvokeAsync(context);

            // User が変更されないこと
            Assert.Equal(oldUser, context.User);
            // 認証されていないこと
            Assert.False(context.User.Identity.IsAuthenticated);
        }