I have product controller and post method to create data and save in database and I need ClaimsPrincipal
to check user in system and check user role, but when I was writing unit test I have problem how can I mock ClaimsPrincipal
, btw for authorize I use jwt Bearer token. Sorry it is just test project I can't show real project.
[Authorize]
[ApiController]
[Route("api/{controller}")]
public class ProductsContoller : ControllerBase
{
private readonly IProductsRepository _products;
public ProductsContoller(IProductsRepository products)
{
_products = products;
}
[Authorize(Roles = "root, admin, user")]
[HttpPost]
public async Task<IActionResult> Create([FromBody] Product product)
{
var result = await _products.CreateAsync(User, product);
return Ok(result);
}
}
And in products repository I check user using claims:
public interface IProductsRepository
{
Task<Product> CreateAsync(ClaimsPrincipal userClaims, Product product);
}
public class ProductsRepository
{
private readonly UserManager<IdentityUser> _usermanager;
private readonly AppDbContext _db;
public ProductsRepository(AppDbContext db, UserManager<IdentityUser> usermanager)
{
_db = db;
}
public async Task<Product> CreateAsync(ClaimsPrincipal userClaims, Product product)
{
var user = await _usermanager.GetUserAsync(userClaims);
if(user is null)
{
return null;
}
var userRole = await _usermanager.GetRolesAsync(user);
if (userRole is null || userRole.Count == 0 || userRole[0] is null)
{
return null;
}
//Check deal and add to database
await _db.Products.Add(product);
await _db.SaveChangesAsync();
return product;
}
}
I am tried to write unit test:
[Fact]
public void Test1()
{
//Arrange
var claims = new Mock<ClaimsPrincipal>();
var p = new Product()
{
Id = 1,
Name = "Test",
};
var mockRepo = new Mock<Test.Controllers.Repositories.IProductsRepository>();
mockRepo.Setup(repo => repo.CreateAsync(claims.Object, Product))
.Returns(Task.CompletedTask);
var controller = new ProductsConrtoller(mockRepo.Object);
//Act
var result = controller.CreateAsync(claims, p);
//Assert
}