public void Crud_Success()
        {
            var newPage = Models.CreateDocumentationPage();

            Assert.AreEqual(0, newPage.Id, "The page id should not be set until after data layer Page_Create method is called.");

            DocumentationPageRepository.Create(newPage);
            Assert.AreNotEqual(0, newPage.Id, "The page id should have been set by the data layer.");

            var oldTitle = newPage.Title;

            newPage.Title = "New Page Title";
            DocumentationPageRepository.Update(newPage);

            var existingPage = DocumentationPageRepository.Read(newPage.Id);

            Assert.IsNotNull(existingPage, "The page should exist in the database.");
            Assert.AreNotEqual(oldTitle, existingPage.Title, "The page's title should have been updated.");
            Assert.AreEqual(newPage.Content, existingPage.Content, "The rest of the page instances' contents should be the same.");

            DocumentationPageRepository.Delete(newPage.Id);

            var deletedPage = DocumentationPageRepository.Read(newPage.Id);

            Assert.That(deletedPage, Is.Null, "The page should have been deleted from the database.");
        }
Example #2
0
        public void Process_Success()
        {
            // Arrange
            var page = Models.CreateDocumentationPage(id: 84932);

            var pageRepository = Mocks.Create <IDocumentationPageRepository>();

            pageRepository.Setup(r => r.Read(page.Id)).Returns(page);

            var processor = new ReadDocumentationPageRequestProcessor(pageRepository.Object);

            // Act
            var result = processor.Process(page.Id.ToString());

            // Assert
            Assert.That(result, Is.Not.Null, "A valid ResponseState should be returned.");
            Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK), "The request should succeed.");
            Assert.That(result.ContentType, Is.EqualTo(ContentTypes.Json), "JSON should be returned in the response.");
            var serializer = new JavaScriptSerializer();
            var clientPage = serializer.Deserialize <DocumentationPage>(result.Content);

            Assert.That(clientPage.Id, Is.EqualTo(page.Id), "The page read from the repository should be included in the result.");

            Mocks.VerifyAll();
        }
        public void Process_ExistingPage()
        {
            // Arrange
            var dataStorePage = Models.CreateDocumentationPage(id: 84926);

            var clientPage = new DocumentationPage
            {
                Id           = dataStorePage.Id,                        // Same id as data store page because this is an existing page.
                Title        = dataStorePage.Title,
                Content      = dataStorePage.Content,
                Order        = dataStorePage.Order,
                ParentPageId = dataStorePage.ParentPageId,
            };

            var documentationPageRepository = Mocks.Create <IDocumentationPageRepository>();

            documentationPageRepository.Setup(r => r.Read(clientPage.Id)).Returns(dataStorePage);
            documentationPageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == clientPage.Id)));

            var serializer  = new JavaScriptSerializer();
            var requestData = serializer.Serialize(clientPage);
            var processor   = new SaveDocumentationPageRequestProcessor(documentationPageRepository.Object);

            // Act
            var result = processor.Process(requestData);

            // Assert
            Assert.That(result, Is.Not.Null, "A response state instance should be returned.");
            Assert.That(result.ContentType, Is.EqualTo(ContentTypes.Json), "The response content should contain JSON.");
            var resultPage = serializer.Deserialize <DocumentationPage>(result.Content);

            Assert.That(resultPage.Id, Is.EqualTo(clientPage.Id), "The page id should not change.");
            Mocks.VerifyAll();
        }
        public void ReadByParentId_Success()
        {
            // Arrange
            var parentPage = Models.CreateDocumentationPage();

            DocumentationPageRepository.Create(parentPage);
            var childPage1 = Models.CreateDocumentationPage(parentPageId: parentPage.Id);

            DocumentationPageRepository.Create(childPage1);
            var childPage2 = Models.CreateDocumentationPage(parentPageId: parentPage.Id);

            DocumentationPageRepository.Create(childPage2);
            var noisePage = Models.CreateDocumentationPage();

            DocumentationPageRepository.Create(noisePage);

            // Act
            var results = DocumentationPageRepository.ReadByParentId(parentPage.Id);

            // Assert
            Assert.AreEqual(2, results.Count(), "Two child pages exist and should be returned.");
            Assert.IsNotNull(results.Where(p => p.Id == childPage1.Id).FirstOrDefault(), "The results should contain childPage1.");
            var childPage2Result = results.Where(p => p.Id == childPage2.Id).FirstOrDefault();

            Assert.IsNotNull(childPage2Result, "The results should contain childPage2.");
        }
        public void InstallFromSkippedFile()
        {
            var dataStoreManager = new TestFixtureDataStoreManager();

            var firstPage = Models.CreateDocumentationPage();

            _documentationPageRepository.Create(firstPage);

            // Generate content file.
            var contentFileName = Path.GetTempFileName();

            dataStoreManager.ExportContent(contentFileName);


            // Change content and recreate installation file.
            var deletedPage   = Models.CreateDocumentationPage();
            var recreatedPage = Models.CreateDocumentationPage();
            var lastPage      = Models.CreateDocumentationPage();

            _documentationPageRepository.Create(deletedPage);
            _documentationPageRepository.Create(recreatedPage);
            _documentationPageRepository.Create(lastPage);
            _documentationPageRepository.Delete(recreatedPage.Id);
            _documentationPageRepository.Create(recreatedPage);
            _documentationPageRepository.Delete(deletedPage.Id);

            // Regenerate content file.
            dataStoreManager.ExportContent(contentFileName);

            // Reset data store and exercise startup file.
            dataStoreManager.DeleteDataStore();
            dataStoreManager.CreateDataStore();
            dataStoreManager.ImportContent(contentFileName);

            // Validate model ids.
            var newFirstPage      = _documentationPageRepository.Read(firstPage.Id);
            var deletedPageResult = _documentationPageRepository.Read(deletedPage.Id);

            Assert.That(deletedPageResult, Is.Null, "The data layer should return null for non-existant pages.");

            var newRecreatedPage = _documentationPageRepository.Read(recreatedPage.Id);
            var newLastPage      = _documentationPageRepository.Read(lastPage.Id);

            Assert.That(newFirstPage, Is.Not.Null, "First page should still exist.");
            Assert.That(newFirstPage.Title, Is.EqualTo(firstPage.Title), "Old first page title should match new page with its id.");
            Assert.That(newRecreatedPage, Is.Not.Null, "Recreated page should still exist.");
            Assert.That(newRecreatedPage.Title, Is.EqualTo(recreatedPage.Title), "Old recreated page title should match new recreated page title.");
            Assert.That(newLastPage, Is.Not.Null, "Last page should still exist.");
            Assert.That(newLastPage.Title, Is.EqualTo(lastPage.Title), "Old last page title should match new last page title.");
        }
        public void Import_NewPage()
        {
            // Arrange
            var page = Models.CreateDocumentationPage();

            page.Id = 10573;

            // Act
            DocumentationPageRepository.Import(page);
            var result = DocumentationPageRepository.Read(page.Id);

            // Assert
            Assert.That(result, Is.Not.Null, "The page should have been created with the supplied id.");
            Assert.That(result.Title, Is.EqualTo(page.Title), "The page Title should have been added to the data store.");
        }
        public void Import_ExistingPage()
        {
            // Arrange
            var page = Models.CreateDocumentationPage();

            DocumentationPageRepository.Create(page);

            page.Title = "Imported existing page title.";

            // Act
            DocumentationPageRepository.Import(page);
            var result = DocumentationPageRepository.Read(page.Id);

            // Assert
            Assert.That(result, Is.Not.Null, "The page should still exist in the repository.");
            Assert.That(result.Title, Is.EqualTo(page.Title), "The title should have been updated on import.");
        }
        public void Process_MoveToNewParent()
        {
            // Arrange
            var oldParentPage = Models.CreateDocumentationPage(id: 46382);
            var newParentPage = Models.CreateDocumentationPage(id: 29556);

            var oldLowerSibling  = Models.CreateDocumentationPage(id: 98732, parentPageId: oldParentPage.Id, order: 0);
            var targetPage       = Models.CreateDocumentationPage(id: 43900, parentPageId: oldParentPage.Id, order: 1);
            var oldHigherSibling = Models.CreateDocumentationPage(id: 43729, parentPageId: oldParentPage.Id, order: 2);
            var oldSiblings      = new List <DocumentationPage> {
                oldLowerSibling, targetPage, oldHigherSibling
            };

            var newLowerSibling  = Models.CreateDocumentationPage(id: 12943, parentPageId: newParentPage.Id, order: 0);
            var newHigherSibling = Models.CreateDocumentationPage(id: 84539, parentPageId: newParentPage.Id, order: 1);
            var newSiblings      = new List <DocumentationPage> {
                newLowerSibling, newHigherSibling
            };

            var pageRepository = Mocks.Create <IDocumentationPageRepository>();

            pageRepository.Setup(r => r.Read(targetPage.Id)).Returns(targetPage);
            pageRepository.Setup(r => r.ReadByParentId(oldParentPage.Id)).Returns(oldSiblings);
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == oldHigherSibling.Id && p.Order == 1)));
            pageRepository.Setup(r => r.ReadByParentId(newParentPage.Id)).Returns(newSiblings);
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == targetPage.Id && p.ParentPageId == newParentPage.Id && p.Order == 1)));
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == newHigherSibling.Id && p.Order == 2)));

            var serializer  = new JavaScriptSerializer();
            var moveRequest = new MoveTocRequest {
                PageId = targetPage.Id, NewParentId = newParentPage.Id, NewPosition = 1
            };
            var requestData = serializer.Serialize(moveRequest);

            var processor = new MovePageRequestProcessor(pageRepository.Object);

            // Act
            var result = processor.Process(requestData);

            // Assert
            Assert.That(result, Is.Not.Null, "A valid response state instance should be returned.");
            Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK), "The result status code should be OK.");
            Assert.That(result.ContentType, Is.EqualTo(ContentTypes.Html), "The result content type should be HTML.");
            Mocks.VerifyAll();
        }
        public void Process_Success()
        {
            // Arrange
            var page     = Models.CreateDocumentationPage(id: 66387, order: 1, parentPageId: 23198);
            var sibling0 = Models.CreateDocumentationPage(id: 98231, order: 0, parentPageId: page.ParentPageId);
            var sibling2 = Models.CreateDocumentationPage(id: 66123, order: 2, parentPageId: page.ParentPageId);
            var child0   = Models.CreateDocumentationPage(id: 4392, order: 0, parentPageId: page.Id);
            var child1   = Models.CreateDocumentationPage(id: 9342, order: 1, parentPageId: page.Id);

            var siblings = new List <DocumentationPage> {
                sibling0, page, sibling2
            };
            var children = new List <DocumentationPage> {
                child0, child1
            };

            var pageRepository = Mocks.Create <IDocumentationPageRepository>();

            pageRepository.Setup(r => r.Read(page.Id)).Returns(page);
            pageRepository.Setup(r => r.ReadByParentId(page.ParentPageId)).Returns(siblings);   // read to update orders.
            pageRepository.Setup(r => r.ReadByParentId(page.Id)).Returns(children);             // read to update orders and parent id.
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == child0.Id && p.ParentPageId == page.ParentPageId && p.Order == 1)));
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == child1.Id && p.ParentPageId == page.ParentPageId && p.Order == 2)));
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == sibling2.Id && p.ParentPageId == page.ParentPageId && p.Order == 3)));
            pageRepository.Setup(r => r.Delete(page.Id));

            var bulletRepository = Mocks.Create <IBulletRepository>();

            bulletRepository.Setup(r => r.DeleteByPageId(page.Id));

            var userPageSettingsRepository = Mocks.Create <IUserPageSettingsRepository>();

            userPageSettingsRepository.Setup(r => r.DeleteByPageId(page.Id));

            var processor = new DeletePageRequestProcessor(bulletRepository.Object, pageRepository.Object, userPageSettingsRepository.Object);

            // Act
            var result = processor.Process(page.Id.ToString());

            // Assert
            Assert.That(result, Is.Not.Null, "A Valid ResponseState should be returned.");
            Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK), "The request should return a valid HTTP status.");
        }
        public void ReadTableOfContents_Visible()
        {
            // Arrange
            var root = Models.CreateDocumentationPage(order: 1, isHidden: false);

            DocumentationPageRepository.Create(root);
            var child = Models.CreateDocumentationPage(order: 1, parentPageId: root.Id, isHidden: true);

            DocumentationPageRepository.Create(child);
            var grandchild = Models.CreateDocumentationPage(order: 1, parentPageId: child.Id, isHidden: false);

            DocumentationPageRepository.Create(grandchild);

            // Act
            var toc = DocumentationPageRepository.ReadTableOfContents(false);

            // Assert
            Assert.AreEqual(1, toc.Count(), "Only one page should be returned because all other pages are hidden or beneath hidden pages.");
            Assert.AreEqual(root.Id, toc[0].Id, "The root page should be the only page included in the table of contents.");
        }
        public void Process_ChangeParentPage()
        {
            // Arrange
            var dataStorePage = Models.CreateDocumentationPage(id: 75326, parentPageId: 12943, order: 5);
            var clientPage    = Models.CreateDocumentationPage(id: dataStorePage.Id, parentPageId: 543, order: dataStorePage.Order);

            var serializer  = new JavaScriptSerializer();
            var requestData = serializer.Serialize(clientPage);

            var documentationPageRepository = Mocks.Create <IDocumentationPageRepository>();

            documentationPageRepository.Setup(r => r.Read(clientPage.Id)).Returns(dataStorePage);

            var processor = new SaveDocumentationPageRequestProcessor(documentationPageRepository.Object);

            // Act
            processor.Process(requestData);

            // Assert
            // InvalidOperationException should be thrown.
        }
        public void Process_MoveLowerInSameParent()
        {
            // Arrange
            var parentPage    = Models.CreateDocumentationPage(id: 37453);
            var firstSibling  = Models.CreateDocumentationPage(id: 87623, parentPageId: parentPage.Id, order: 0);
            var secondSibling = Models.CreateDocumentationPage(id: 12387, parentPageId: parentPage.Id, order: 1);
            var thirdSibling  = Models.CreateDocumentationPage(id: 54356, parentPageId: parentPage.Id, order: 2);
            var targetPage    = Models.CreateDocumentationPage(id: 76527, parentPageId: parentPage.Id, order: 3);
            var fourthSibling = Models.CreateDocumentationPage(id: 33452, parentPageId: parentPage.Id, order: 4);
            var siblings      = new List <DocumentationPage> {
                firstSibling, secondSibling, thirdSibling, targetPage, fourthSibling
            };

            var pageRepository = Mocks.Create <IDocumentationPageRepository>();

            pageRepository.Setup(r => r.Read(targetPage.Id)).Returns(targetPage);
            pageRepository.Setup(r => r.ReadByParentId(parentPage.Id)).Returns(siblings);
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == targetPage.Id && p.ParentPageId == parentPage.Id && p.Order == 1)));
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == secondSibling.Id && p.ParentPageId == parentPage.Id && p.Order == 2)));
            pageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == thirdSibling.Id && p.ParentPageId == parentPage.Id && p.Order == 3)));

            var serializer  = new JavaScriptSerializer();
            var moveRequest = new MoveTocRequest {
                PageId = targetPage.Id, NewParentId = parentPage.Id, NewPosition = 1
            };
            var requestData = serializer.Serialize(moveRequest);

            var processor = new MovePageRequestProcessor(pageRepository.Object);

            // Act
            var result = processor.Process(requestData);

            // Assert
            Assert.That(result, Is.Not.Null, "A valid response state instance should be returned.");
            Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK), "The result status code should be OK.");
            Assert.That(result.ContentType, Is.EqualTo(ContentTypes.Html), "The result content type should be HTML.");
            Mocks.VerifyAll();
        }
        public void ReadTableOfContents_All()
        {
            // Arrange
            var root_1 = Models.CreateDocumentationPage(order: 1);

            DocumentationPageRepository.Create(root_1);
            var child_1_1 = Models.CreateDocumentationPage(parentPageId: root_1.Id, order: 1);

            DocumentationPageRepository.Create(child_1_1);
            var child_1_1_1 = Models.CreateDocumentationPage(parentPageId: child_1_1.Id, order: 1);

            DocumentationPageRepository.Create(child_1_1_1);
            var child_1_2 = Models.CreateDocumentationPage(parentPageId: root_1.Id, order: 2);

            DocumentationPageRepository.Create(child_1_2);
            var root_2 = Models.CreateDocumentationPage(order: 2);

            DocumentationPageRepository.Create(root_2);
            var child_2_1 = Models.CreateDocumentationPage(parentPageId: root_2.Id, order: 1);

            DocumentationPageRepository.Create(child_2_1);

            // Act
            var toc = DocumentationPageRepository.ReadTableOfContents(true);

            // Assert
            Assert.AreEqual(6, toc.Count(), "Six pages should be returned in the table of contents.");
            Assert.IsNull(toc[0].Content, "Content should not be returned in the table of contents.");

            // Nodes are returned first by their depth starting with root nodes, then by their order, then by name.
            Assert.AreEqual(root_1.Id, toc[0].Id, "The first root node should be first in the table of contents.");
            Assert.AreEqual(root_2.Id, toc[1].Id, "The second root node should be returned second in the table of contents.");
            Assert.AreEqual(child_1_1.Id, toc[2].Id, "The first child node of the first root node should be returned third in the table of contents.");
            Assert.AreEqual(child_2_1.Id, toc[3].Id, "The child node of the second root node should be returned fourth in the table of contents.");
            Assert.AreEqual(child_1_2.Id, toc[4].Id, "The second child node of the first root node should be returned fifth in the table of contents.");
            Assert.AreEqual(child_1_1_1.Id, toc[5].Id, "The grandchild node should be returned sixth in the table of contents.");
        }
        public void DeleteExcept_Success()
        {
            // Arrange
            var keptPage = Models.CreateDocumentationPage();

            DocumentationPageRepository.Create(keptPage);
            var deletedPage = Models.CreateDocumentationPage();

            DocumentationPageRepository.Create(deletedPage);
            var anotherDeletedPage = Models.CreateDocumentationPage();

            DocumentationPageRepository.Create(anotherDeletedPage);

            // Act
            DocumentationPageRepository.DeleteExcept(new List <int> {
                keptPage.Id
            });

            // Assert
            var pages = DocumentationPageRepository.ReadAll().ToList();

            Assert.That(pages.Count, Is.EqualTo(1), "Only one page should be left in the repository.");
            Assert.That(pages[0].Id, Is.EqualTo(keptPage.Id), "The kept page should remain because its id was in the list.");
        }
        public void Process_NewPage()
        {
            // Arrange
            var parentPage         = Models.CreateDocumentationPage(id: 74362);
            var lowerSiblingPage   = Models.CreateDocumentationPage(id: 63254, parentPageId: parentPage.Id, order: 0);
            var higherSiblingPage  = Models.CreateDocumentationPage(id: 1342, parentPageId: parentPage.Id, order: 1);
            var highestSiblingPage = Models.CreateDocumentationPage(id: 8724, parentPageId: parentPage.Id, order: 2);
            var siblingPages       = new List <DocumentationPage> {
                lowerSiblingPage, higherSiblingPage, highestSiblingPage
            };

            var clientPage = Models.CreateDocumentationPage(parentPageId: parentPage.Id, order: 1);

            var documentationPageRepository = Mocks.Create <IDocumentationPageRepository>();

            documentationPageRepository.Setup(r => r.ReadByParentId(clientPage.ParentPageId)).Returns(siblingPages);
            documentationPageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == higherSiblingPage.Id && p.Order == 2)));
            documentationPageRepository.Setup(r => r.Update(It.Is <DocumentationPage>(p => p.Id == highestSiblingPage.Id && p.Order == 3)));
            documentationPageRepository.Setup(r => r.Create(It.Is <DocumentationPage>(p => p.Title == clientPage.Title)));

            var serializer  = new JavaScriptSerializer();
            var requestData = serializer.Serialize(clientPage);
            var processor   = new SaveDocumentationPageRequestProcessor(documentationPageRepository.Object);

            // Act
            var result = processor.Process(requestData);

            // Assert
            Mocks.VerifyAll();
            Assert.That(result, Is.Not.Null, "Response state instance expected.");
            Assert.That(result.ContentType, Is.EqualTo(ContentTypes.Json), "JSON result expected.");
            Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.OK), "Valid response code expected.");
            var resultPage = serializer.Deserialize <DocumentationPage>(result.Content);

            Assert.That(resultPage.Title, Is.EqualTo(clientPage.Title), "The title of the result page should match the client page.");
        }