public static User CreateUser(this TestApplication app, string username = null, string password = null, string displayName = null)
        {
            var actualPassword = string.IsNullOrEmpty(password) ? StringUtility.Random() : password;
            var userManager    = app.GetService <UserManager <User> >();

            if (username == null)
            {
                username = StringUtility.Random();
            }

            var user = new User
            {
                UserName     = username,
                DisplayName  = string.IsNullOrEmpty(displayName) ? username : displayName,
                CreatedAtUtc = DateTime.UtcNow
            };

            var task = userManager.CreateAsync(user, actualPassword);

            task.ConfigureAwait(false);

            var createResult = task.Result;

            if (!createResult.Succeeded)
            {
                var errorMessage = string.Join(";", createResult.Errors.Select(err => err.Code));
                throw new Exception("不能创建用户:" + errorMessage);
            }

            return(user);
        }
Beispiel #2
0
        public static AntiForgeryRequestTokens GetFromApplication(TestApplication app)
        {
            var homeResponseTask = app.Server.CreateRequest("/").GetAsync();

            homeResponseTask.ConfigureAwait(false);
            homeResponseTask.Wait();

            var homeRes = homeResponseTask.Result;

            if (!homeRes.Headers.TryGetValues(HeaderNames.SetCookie, out var cookies))
            {
                cookies = Enumerable.Empty <string>();
            }
            var antiForgeryCookie = SetCookieHeaderValue.ParseList(cookies.ToList()).FirstOrDefault(cookie => cookie.Name.ToString().StartsWith(".AspNetCore.Antiforgery"));

            if (antiForgeryCookie == null)
            {
                throw new InvalidOperationException("无法从服务器获取 AntiForgery Cookie");
            }

            var          htmlContent = homeRes.ReadAllContent();
            const string tokenStart  = "window.__RequestVerificationToken";
            // ReSharper disable once StringLastIndexOfIsCultureSpecific.1
            var tokenHtmlContent = htmlContent.Substring(htmlContent.LastIndexOf(tokenStart));
            var tokenPattern     = new Regex(@"^window\.__RequestVerificationToken[^']+'(?<token>[^']+)';");

            var token     = tokenPattern.Match(tokenHtmlContent).Groups["token"].Value;
            var reqCookie = new Cookie(antiForgeryCookie.Name.ToString(), antiForgeryCookie.Value.ToString());

            return(new AntiForgeryRequestTokens
            {
                VerificationToken = token,
                Cookie = reqCookie
            });
        }
Beispiel #3
0
        public static TestHttpRequestBuilder.ResponseAssertion ShouldPost(this TestApplication app, string path,
                                                                          object postEntity = null,
                                                                          SigninRequirement signinStatus = SigninRequirement.SigninNotRequired,
                                                                          string responseShouldContain   = null)
        {
            var post = app.Path(path).Post();

            if (postEntity != null)
            {
                post.WithForm(postEntity);
            }

            if (signinStatus == SigninRequirement.SigninRequired)
            {
                post.ShouldFail(user: app.NoUser()).WithSigninRedirect();
            }

            var user        = signinStatus == SigninRequirement.SigninRequired ? app.MockUser() : app.NoUser();
            var postSuccess = post
                              .ShouldBeHandled(user)
                              .WithResponse(res =>
                                            TestHttpRequestBuilder.ResponseAssertion.Is2XxSuccess(res) ||
                                            TestHttpRequestBuilder.ResponseAssertion.IsSuccessRedirect(res));

            if (responseShouldContain != null)
            {
                postSuccess.WithResponse(res => res.ReadAllContent().Contains(responseShouldContain));
            }
            return(postSuccess);
        }
        public static T CreateController <T>(this TestApplication app) where T : ControllerBase
        {
            var httpContext = app.GetService <IHttpContextFactory>().Create(new DefaultHttpContext().Features);

            httpContext.User = app.User;

            var routeData = new RouteData();

            routeData.Routers.Add(new FakeRoute(app.GetService <IInlineConstraintResolver>()));

            var actionContext = new ActionContext(
                httpContext,
                routeData,
                new ControllerActionDescriptor
            {
                ControllerTypeInfo = typeof(T).GetTypeInfo()
            });

            var actionContextAccessor = app.GetService <IActionContextAccessor>();

            if (actionContextAccessor != null)
            {
                actionContextAccessor.ActionContext = actionContext;
            }
            return(app.GetService <IControllerFactory>().CreateController(new ControllerContext(actionContext)) as T);
        }
        public static User MockUser(this TestApplication app)
        {
            var userRepo       = app.GetService <IRepository <User> >();
            var passwordHasher = app.GetService <IPasswordHasher <User> >();

            var user = new User
            {
                CreatedAtUtc   = DateTime.UtcNow.AddDays(-1),
                UserName       = "******",
                DisplayName    = "FancyUser",
                HashedPassword = passwordHasher.HashPassword(null, "111111")
            };

            userRepo.Save(user);

            var lastSigninTime = DateTime.UtcNow.AddMinutes(-30);
            var claims         = new List <Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString(), ClaimValueTypes.Integer32),
                new Claim(ClaimTypes.Name, user.UserName, ClaimValueTypes.String),
                new Claim("SigninTime", lastSigninTime.Ticks.ToString(), ClaimValueTypes.Integer64)
            };
            var identity = new ClaimsIdentity(claims, IdentityConstants.ApplicationScheme);

            app.User = new ClaimsPrincipal(identity);
            return(user);
        }
        public static void ReloadEntity <T>(this TestApplication app, params T[] entities) where T : Entity
        {
            var applicationDbContext = app.GetService <ApplicationDbContext>();

            entities.ToList().ForEach(entity =>
            {
                applicationDbContext.Entry(entity).Reload();
            });
        }
        public static ModelStateDictionary ValidateModel(this TestApplication app, object model)
        {
            var validator     = app.GetService <IObjectModelValidator>();
            var actionContext = new ActionContext();

            validator.Validate(actionContext, null, string.Empty, model);

            return(actionContext.ModelState);
        }
Beispiel #8
0
        public static TestApplication BuildTestApplication <TStartup>(TestApplication testApp,
                                                                      string environmentName = "Production",
                                                                      Action <IWebHostBuilder> configureHost = null) where TStartup : class
        {
            testApp.LoggerProvider = new StubLoggerProvider();
            testApp.User           = new ClaimsPrincipal(new ClaimsIdentity());

            var hostBuilder = new WebHostBuilder();

            configureHost?.Invoke(hostBuilder);
            hostBuilder.ConfigureServices(services =>
            {
                services.AddTransient <HttpContextFactory>();
                services.AddTransient <IHttpContextFactory>((sp) =>
                {
                    var defaultContextFactory = sp.GetService <HttpContextFactory>();
                    var httpContextFactory    = new WrappedHttpContextFactory(defaultContextFactory);
                    httpContextFactory.ConfigureFeatureWithContext((features, httpCtx) =>
                    {
                        features.Set <IHttpAuthenticationFeature>(new HttpAuthenticationFeature {
                            User = testApp.User
                        });
                        features.Set <IServiceProvidersFeature>(new RequestServicesFeature(httpCtx,
                                                                                           testApp.ApplicationServices.GetService <IServiceScopeFactory>()));
                    });
                    return(httpContextFactory);
                });
            });
            var connectionStringEVKey = $"DOTNETCLUB_{ServiceExtensions.ConfigKeyConnectionString}";

            if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable(connectionStringEVKey)))
            {
                Environment.SetEnvironmentVariable(connectionStringEVKey, " ");
            }
            Environment.SetEnvironmentVariable("DOTNETCLUB_Logging:Console:LogLevel:Default", "Warning");

            Configuration.ConfigureHost(hostBuilder);
            hostBuilder.ConfigureLogging(loggingBuilder =>
            {
                loggingBuilder.SetMinimumLevel(LogLevel.Trace);
                loggingBuilder.AddProvider(testApp.LoggerProvider);
            });
            hostBuilder
            .UseContentRoot(TestEnv.WebProjectPath())
            .UseEnvironment(environmentName)
            .UseStartup <TStartup>();

            testApp.Server = new TestServer(hostBuilder);
            testApp.ApplicationServices = testApp.Server.Host.Services;
            testApp._spOverrider        = new ServiceProviderOverrider(testApp.ApplicationServices);

            return(testApp);
        }
Beispiel #9
0
        public static RequestBuilder RequestAntiForgeryForm(this TestApplication app, string path, Dictionary <string, string> obj = null)
        {
            var tokens  = app.GetAntiForgeryTokens();
            var request = app.Server.CreateRequest(path);

            return(request.And(req =>
            {
                if (obj == null)
                {
                    obj = new Dictionary <string, string>();
                }

                obj["__RequestVerificationToken"] = tokens.VerificationToken;
                req.Content = new FormUrlEncodedContent(obj);
            })
                   .WithCookie(tokens.Cookie));
        }
Beispiel #10
0
        public static TestHttpRequestBuilder.ResponseAssertion ShouldGet(this TestApplication app, string path,
                                                                         SigninRequirement signinStatus = SigninRequirement.SigninNotRequired,
                                                                         string responseShouldContain   = null)
        {
            app.ResetUser();
            var get = app.Path(path).Get();

            if (signinStatus == SigninRequirement.SigninRequired)
            {
                get.ShouldFail(app.NoUser()).WithSigninRedirect();
            }

            var user       = signinStatus == SigninRequirement.SigninRequired ? app.MockUser() : app.NoUser();
            var getSuccess = get.ShouldSuccess(user);

            if (responseShouldContain != null)
            {
                getSuccess.WithResponse(res => res.ReadAllContent().Contains(responseShouldContain));
            }

            return(getSuccess);
        }
        public static AdminUser MockAdminUser(this TestApplication app)
        {
            var adminUserRepo    = app.GetService <IRepository <AdminUser> >();
            var adminUserService = app.GetService <IAdminUserService>();

            var adminUser = new AdminUser
            {
                CreatedAtUtc   = DateTime.UtcNow.AddDays(-1),
                Username       = "******",
                HashedPassword = adminUserService.HashPassword("11111A")
            };

            adminUserRepo.Save(adminUser);

            var token    = adminUserService.IssueJwtToken(adminUser);
            var options  = app.GetService <IOptionsMonitor <JwtBearerOptions> >().Get("Bearer");
            var identity = options.SecurityTokenValidators
                           .First()
                           .ValidateToken(token.TokenString, options.TokenValidationParameters, out _);

            app.User = identity;
            return(adminUser);
        }
Beispiel #12
0
 public static TestHttpRequestBuilder Path(this TestApplication app, string path)
 {
     return(new TestHttpRequestBuilder(app, path));
 }
        public static void DeleteAll <T>(this TestApplication app) where T : Entity
        {
            var repo = app.GetService <IRepository <T> >();

            repo.All().ToList().ForEach(topic => repo.Delete(topic));
        }
 public static T GetService <T>(this TestApplication app) where T : class
 {
     return(app.ApplicationServices.GetService <T>());
 }
 public TestHttpRequestBuilder(TestApplication app, string path)
 {
     _app  = app;
     _path = path;
 }
        public static IEnumerable <StubLoggerProvider.LogItem> GetLogs(this TestApplication app)
        {
            var loggerProvider = app.ApplicationServices.GetRequiredService <ILoggerProvider>() as StubLoggerProvider;

            return(loggerProvider?.LogItems);
        }
 public static User NoUser(this TestApplication app)
 {
     app.ResetUser();
     return(null);
 }