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); }
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 }); }
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); }
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); }
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)); }
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); }
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); }