public void Generate_ValidPageSpecsString_ReturnsCounts()
        {
            ViewResult result = _unitUnderTest.Generate(_specs1) as ViewResult;
            PageSpecs  specs  = (PageSpecs)result.Model;

            Assert.AreEqual("GeneratedPage", result.ViewName);
            Assert.AreEqual(11, specs.Status200Count);
            Assert.AreEqual(1, specs.Status403Count);
            Assert.AreEqual(2, specs.Status404Count);
            Assert.AreEqual(3, specs.Status500Count);
            Assert.AreEqual(4, specs.Status503Count);

            //Make sure starting indexes are valid
            Assert.AreEqual(1, specs.Status200StartingIndex);
            Assert.AreEqual(1, specs.Status403StartingIndex);
            Assert.AreEqual(1, specs.Status404StartingIndex);
            Assert.AreEqual(1, specs.Status500StartingIndex);
            Assert.AreEqual(1, specs.Status503StartingIndex);

            //Make sure starting indexes are valid after another method call
            result = _unitUnderTest.Generate(_specs1) as ViewResult;
            specs  = (PageSpecs)result.Model;
            Assert.AreEqual(12, specs.Status200StartingIndex);
            Assert.AreEqual(2, specs.Status403StartingIndex);
            Assert.AreEqual(3, specs.Status404StartingIndex);
            Assert.AreEqual(4, specs.Status500StartingIndex);
            Assert.AreEqual(5, specs.Status503StartingIndex);
        }
        public void ClearCounters_ReturnsDefaultView()
        {
            //Generate pages to get above zero (We know this works correctly if Generate_ValidPageSpecsString_ParsesStatusAndCount passed)
            ViewResult generatePageResult = _unitUnderTest.Generate(_specs1) as ViewResult;

            //Call CleanCounters method
            ContentResult clearResult = _unitUnderTest.ClearCounters() as ContentResult;

            Assert.AreEqual("Counts Cleared!", clearResult.Content);

            //The next generation of pages should have the counts as if this was the first generation of pages
            generatePageResult = _unitUnderTest.Generate(_specs1) as ViewResult;
            PageSpecs specs = (PageSpecs)generatePageResult.Model;

            specs = (PageSpecs)generatePageResult.Model;
            Assert.AreEqual(11, specs.Status200Count);
            Assert.AreEqual(1, specs.Status403Count);
            Assert.AreEqual(2, specs.Status404Count);
            Assert.AreEqual(3, specs.Status500Count);
            Assert.AreEqual(4, specs.Status503Count);
            Assert.AreEqual(1, specs.Status200StartingIndex);
            Assert.AreEqual(1, specs.Status403StartingIndex);
            Assert.AreEqual(1, specs.Status404StartingIndex);
            Assert.AreEqual(1, specs.Status500StartingIndex);
            Assert.AreEqual(1, specs.Status503StartingIndex);
        }
        public void SetUp()
        {
            _unitUnderTest = new PageGeneratorController();

            _specs1 = new PageSpecs
            {
                Status200Count = 11,
                Status403Count = 1,
                Status404Count = 2,
                Status500Count = 3,
                Status503Count = 4
            };
        }
        public void Generate_EmptyPageSpecs_ReturnsEmptyCounts()
        {
            ViewResult result = _unitUnderTest.Generate(new PageSpecs()) as ViewResult;
            PageSpecs  specs  = (PageSpecs)result.Model;

            Assert.AreEqual("GeneratedPage", result.ViewName);
            Assert.AreEqual(0, specs.Status200Count);
            Assert.AreEqual(0, specs.Status403Count);
            Assert.AreEqual(0, specs.Status404Count);
            Assert.AreEqual(0, specs.Status500Count);
            Assert.AreEqual(0, specs.Status503Count);

            //Make sure starting indexes are valid
            Assert.AreEqual(1, specs.Status200StartingIndex);
            Assert.AreEqual(1, specs.Status403StartingIndex);
            Assert.AreEqual(1, specs.Status404StartingIndex);
            Assert.AreEqual(1, specs.Status500StartingIndex);
            Assert.AreEqual(1, specs.Status503StartingIndex);
        }
        public IActionResult Generate(PageSpecs pageSpecs)
        {
            if (pageSpecs == null)
            {
                throw new ArgumentNullException("pageSpecs");
            }

            if (pageSpecs.Status200Count < 0)
            {
                throw new ArgumentException("pageSpecs.Status200 cannot be negative");
            }

            if (pageSpecs.Status403Count < 0)
            {
                throw new ArgumentException("pageSpecs.Status403 cannot be negative");
            }

            if (pageSpecs.Status404Count < 0)
            {
                throw new ArgumentException("pageSpecs.Status404 cannot be negative");
            }

            if (pageSpecs.Status500Count < 0)
            {
                throw new ArgumentException("pageSpecs.Status500 cannot be negative");
            }

            if (pageSpecs.Status503Count < 0)
            {
                throw new ArgumentException("pageSpecs.Status503 cannot be negative");
            }

            if (DateTime.Now > refreshCountsTime)
            {
                InitializeCounts();
            }

            PageSpecs finalSpecs = new PageSpecs();

            lock (_generatedPagesCounts)
            {
                finalSpecs.Status200Count         = pageSpecs.Status200Count;
                _generatedPagesCounts[200]       += pageSpecs.Status200Count;
                finalSpecs.Status200StartingIndex = (_generatedPagesCounts[200] - pageSpecs.Status200Count) + 1;

                finalSpecs.Status403Count         = pageSpecs.Status403Count;
                _generatedPagesCounts[403]       += pageSpecs.Status403Count;
                finalSpecs.Status403StartingIndex = (_generatedPagesCounts[403] - pageSpecs.Status403Count) + 1;

                finalSpecs.Status404Count         = pageSpecs.Status404Count;
                _generatedPagesCounts[404]       += pageSpecs.Status404Count;
                finalSpecs.Status404StartingIndex = (_generatedPagesCounts[404] - pageSpecs.Status404Count) + 1;

                finalSpecs.Status500Count         = pageSpecs.Status500Count;
                _generatedPagesCounts[500]       += pageSpecs.Status500Count;
                finalSpecs.Status500StartingIndex = (_generatedPagesCounts[500] - pageSpecs.Status500Count) + 1;

                finalSpecs.Status503Count         = pageSpecs.Status503Count;
                _generatedPagesCounts[503]       += pageSpecs.Status503Count;
                finalSpecs.Status503StartingIndex = (_generatedPagesCounts[503] - pageSpecs.Status503Count) + 1;
            }

            return(View("GeneratedPage", finalSpecs));
        }