﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Platnosci.Core.Linq;
using Platnosci.Core.Interface;
using MvcContrib.TestHelper;
using Platnosci.Controllers;
using System.Web.Mvc;

namespace Platnosci.Tests.Web
{
    [TestFixture] 
    class StatusTest
    {
        private Function _f = new Function();

        [Test]
        [Category("Unit")]
        public void FormatException_Ordernumber_Test()
        {
            IRepository<PotwierdzeniaEcard> repConfirm = new Repository<PotwierdzeniaEcard>(new FakeDataContext());
            var builder = new TestControllerBuilder();
            var controller = new PlatnoscController(null, null, repConfirm, null);
            builder.InitializeController(controller);
            builder.Form.Add("MERCHANTNUMBER", "132423");
            builder.Form.Add("ORDERNUMBER", "32hvhsvhv");

            var result = controller.Status() as ContentResult;           
            System.Diagnostics.Debug.WriteLine("1. Zły formt ordernumber.");
            System.Diagnostics.Debug.WriteLine("2. Count: " + repConfirm.Count());
            System.Diagnostics.Debug.WriteLine("3. Contetnt: " + result.Content);
            Assert.That(repConfirm.Count().Equals(0));
            Assert.That(result.Content.Contains("FormatException"));
        }
        [Test]
        [Category("Unit")]
        public void FormatException_Paymenttype_Test()
        {
            IRepository<PotwierdzeniaEcard> repConfirm = new Repository<PotwierdzeniaEcard>(new FakeDataContext());
            var builder = new TestControllerBuilder();
            var controller = new PlatnoscController(null, null, repConfirm, null);
            builder.InitializeController(controller);
            builder.Form.Add("MERCHANTNUMBER", "132423");
            builder.Form.Add("PAYMENTTYPE", "32hvhsvhv");

            var result = controller.Status() as ContentResult;
            System.Diagnostics.Debug.WriteLine("Zły formt paymenttype. " + " Count: " + repConfirm.Count());
            Assert.That(repConfirm.Count().Equals(0));
            Assert.That(result.Content.Contains("FormatException"));
        }
        [Test]
        [Category("Unit")]
        public void FormatException_Eventtype_Test()
        {
            IRepository<PotwierdzeniaEcard> repConfirm = new Repository<PotwierdzeniaEcard>(new FakeDataContext());
            var builder = new TestControllerBuilder();
            var controller = new PlatnoscController(null, null, repConfirm, null);
            builder.InitializeController(controller);
            builder.Form.Add("MERCHANTNUMBER", "132423");
            builder.Form.Add("EVENTTYPE", "32hvhsvhv");

            var result = controller.Status() as ContentResult;
            System.Diagnostics.Debug.WriteLine("Zły formt eventtype. " + " Count: " + repConfirm.Count());
            Assert.That(repConfirm.Count().Equals(0));
            Assert.That(result.Content.Contains("FormatException"));
        }
        [Test]
        [Category("Unit")]
        public void OverflowException_Ordernumber_Test()
        {
            var controller = new PlatnoscController();
            var builder = new TestControllerBuilder();
            builder.InitializeController(controller);
            builder.Form.Add("MERCHANTNUMBER", "132");
            builder.Form.Add("ORDERNUMBER", "12311111111111111");
            builder.Form.Add("VALIDATIONCODE", "AAA");
            
            var result = controller.Status() as ContentResult;
            System.Diagnostics.Debug.WriteLine("1. Wartosc ordernumber jest za duza.");
            System.Diagnostics.Debug.WriteLine("2. Contetnt: " + result.Content);
            Assert.That(result.Content.Contains("OverflowException"));
        }
        [Test]
        [Category("Unit")]
        public void IncorrectLength_Validationcode_Test()
        {
            var controller = new PlatnoscController();
            var builder = new TestControllerBuilder();
            builder.InitializeController(controller);
            builder.Form.Add("MERCHANTNUMBER", "132");
            builder.Form.Add("ORDERNUMBER", "1234");
            builder.Form.Add("VALIDATIONCODE", "AAAaaa");
            
            var result = controller.Status() as ContentResult;
            System.Diagnostics.Debug.WriteLine("1. Validationcode jest zbyt dlugi. Conajwyzej 3 znaki.");
            System.Diagnostics.Debug.WriteLine("2. Contetnt: " + result.Content);
            Assert.That(result.Content.Contains("SqlException"));
        }
        [Test]
        [Category("Unit")]
        public void Correct_Date_Test()
        {
            string merchant = "ABC15S";
            int order = 1234;

            var controller = new PlatnoscController();
            IRepository<PotwierdzeniaEcard> repConfirm = controller.getRepConfirm();
            var builder = new TestControllerBuilder();
            builder.InitializeController(controller);
            builder.Form.Add("MERCHANTNUMBER", merchant);
            builder.Form.Add("ORDERNUMBER", order.ToString());
            builder.Form.Add("VALIDATIONCODE", "000");

            var result = controller.Status();
            var pl = repConfirm.Find(o => o.MERCHANTNUMBER == merchant && o.ORDERNUMBER == order).SingleOrDefault();
            System.Diagnostics.Debug.WriteLine("Dodano płatność do repozytorium.");
            Assert.That(pl.ORDERNUMBER.Equals(order));
           
            repConfirm.Delete(pl);
            System.Diagnostics.Debug.WriteLine("Usunięto poprawnie płatność o ORDERNUMBER: " + pl.ORDERNUMBER +" i MERCHANTNUMBER: " + pl.MERCHANTNUMBER);
        }
    }
}
