aspnetcore/test/MusicStore.Test/ManageControllerTest.cs

94 lines
3.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Http.Authentication;
using Microsoft.AspNet.Http.Core;
using Microsoft.AspNet.Http.Core.Authentication;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Mvc;
using Microsoft.Framework.DependencyInjection;
using MusicStore.Models;
using Xunit;
namespace MusicStore.Controllers
{
public class ManageControllerTest
{
private readonly IServiceProvider _serviceProvider;
public ManageControllerTest()
{
var services = new ServiceCollection();
services.AddEntityFramework()
.AddInMemoryStore()
.AddDbContext<MusicStoreContext>();
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<MusicStoreContext>();
// IHttpContextAccessor is required for SignInManager, and UserManager
services.AddInstance<IHttpContextAccessor>(
new HttpContextAccessor()
{
HttpContext = new TestHttpContext(),
});
_serviceProvider = services.BuildServiceProvider();
}
[Fact]
public async Task Index_ReturnsViewBagMessagesExpected()
{
// Arrange
var userId = "TestUserA";
var phone = "abcdefg";
var claims = new List<Claim> { new Claim(ClaimTypes.NameIdentifier, userId) };
var userManager = _serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var userManagerResult = await userManager.CreateAsync(
new ApplicationUser { Id = userId, UserName = "Test", TwoFactorEnabled = true, PhoneNumber = phone },
"Pass@word1");
Assert.True(userManagerResult.Succeeded);
var signInManager = _serviceProvider.GetRequiredService<SignInManager<ApplicationUser>>();
var httpContext = _serviceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext;
httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(claims));
var controller = new ManageController()
{
UserManager = userManager,
SignInManager = signInManager,
};
controller.ActionContext.HttpContext = httpContext;
// Act
var result = await controller.Index();
// Assert
var viewResult = Assert.IsType<ViewResult>(result);
Assert.Null(viewResult.ViewName);
Assert.Empty(controller.ViewBag.StatusMessage);
Assert.NotNull(viewResult.ViewData);
var model = Assert.IsType<IndexViewModel>(viewResult.ViewData.Model);
Assert.True(model.TwoFactor);
Assert.Equal(phone, model.PhoneNumber);
Assert.True(model.HasPassword);
}
private class TestHttpContext : DefaultHttpContext
{
public override Task<AuthenticationResult>
AuthenticateAsync(string authenticationScheme)
{
return
Task.FromResult(new AuthenticateContext(authenticationScheme).Result);
}
}
}
}