using Microsoft.VisualStudio.TestTools.UnitTesting;
using MvcAvecTests.Controllers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Web.SessionState;

namespace MvcAvecTests.Controllers.Tests {

  [TestClass()]
  public class ECommerceControllerTests {
    public static HttpContext CreerUnHttpContextDeTest( string url = "http://pasNecessairementBesion.com/" ) {
      var uri = new Uri( url );
      var httpContext = new HttpContext(
        new HttpRequest( string.Empty, uri.ToString(), uri.Query.TrimStart( '?' ) ),
        new HttpResponse( new StringWriter() ) );
      var nouvelleSession = new HttpSessionStateContainer(
        "id bidon",
        new SessionStateItemCollection(),
        new HttpStaticObjectsCollection(),
        timeout: 100, newSession: true, cookieMode: HttpCookieMode.UseCookies,
        mode: SessionStateMode.InProc, isReadonly: false );
      SessionStateUtility.AddHttpSessionStateToContext( httpContext, nouvelleSession );
      return httpContext;
    }
    [TestMethod()]
    public void AjouterTestPasAssezDeStock() {
      HttpContext.Current = CreerUnHttpContextDeTest();
      var ctrlr = new ECommerceController();
      var a = Models.Article.Stock.Values.First();
      var vr = (ViewResult)ctrlr.Ajouter( a.Id, a.Quantite + 1 );
      Assert.IsFalse( vr.ViewBag.Erreur == null, "Ajouter plus que la qté en stock dans le caddie devrait faire râler le contrôleur" );
    }
    [TestMethod()]
    public void AjouterTest() {
      HttpContext.Current = CreerUnHttpContextDeTest();
      var ctrlr = new ECommerceController();
      var a = Models.Article.Stock.Values.First();
      ctrlr.Ajouter( a.Id, 2 );
      Assert.IsTrue( Models.Article.Caddie[a.Id].Quantite == 2, "L'article ajouté devrait être présent dans le caddie avec la bonne quantité" );
      ctrlr.Ajouter( a.Id, 1 );
      Assert.IsTrue( Models.Article.Caddie[a.Id].Quantite == 3, "L'ajout d'un article déjà présent devrait modifier la quantité correctement" );
      ctrlr.Ajouter( a.Id, -2 );
      Assert.IsTrue( Models.Article.Caddie[a.Id].Quantite == 1, "L'ajout d'une qté négative devrait faire diminuer la qté de l'article du caddie" );
      ctrlr.Ajouter( a.Id, -1 );
      Assert.IsFalse( Models.Article.Caddie.ContainsKey( a.Id ), "L'ajout d'une qté négative ammenant la qté de l'article du caddie à 0 ou moins devrait le supprimer du caddie" );
    }
  }
}