1

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
}
Nkosi
  • 235,767
  • 35
  • 427
  • 472
GwenBleidd
  • 43
  • 1
  • 7

0 Answers0