using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.eShopOnContainers.WebMVC.Controllers;
using Microsoft.eShopOnContainers.WebMVC.Services;
using Microsoft.eShopOnContainers.WebMVC.ViewModels;
using Moq;
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Xunit;

namespace UnitTest.Account
{
    public class AccountControllerTest
    {
        private readonly Mock<IIdentityParser<ApplicationUser>> _identityParserMock;
        private readonly Mock<HttpContext> _httpContextMock;

        public AccountControllerTest()
        {
            _identityParserMock = new Mock<IIdentityParser<ApplicationUser>>();
            _httpContextMock = new Mock<HttpContext>();
        }

        [Fact]
        public void Signin_with_token_success()
        {
            //Arrange
            var fakeCP = GenerateFakeClaimsIdentity();

            _httpContextMock.Setup(x => x.User)
                .Returns(new ClaimsPrincipal(fakeCP));
                       
            //Act
            var accountController = new AccountController(_identityParserMock.Object);
            accountController.ControllerContext.HttpContext = _httpContextMock.Object;
            var actionResult = accountController.SignIn("");

            //Assert
            var redirectResult = Assert.IsType<RedirectToActionResult>(actionResult);
            Assert.Equal(redirectResult.ActionName, "Index");
            Assert.Equal(redirectResult.ControllerName, "Catalog");
            Assert.Equal(accountController.ViewData["access_token"], "fakeToken");
        }

        private ClaimsIdentity GenerateFakeClaimsIdentity()
        {
            var ci = new ClaimsIdentity();
            ci.AddClaim(new Claim("access_token", "fakeToken"));
            return ci;
        }
    }
}