public void CrudByPage_Success()
        {
            // Arrange
            var targetPage = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(targetPage);
            var noisePage = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(noisePage);

            var targetBullet1 = Models.CreateBullet(pageId: targetPage.Id);

            BulletRepository.Create(targetBullet1);
            var targetBullet2 = Models.CreateBullet(pageId: targetPage.Id);

            BulletRepository.Create(targetBullet2);
            var noiseBullet = Models.CreateBullet(pageId: noisePage.Id);

            BulletRepository.Create(noiseBullet);

            // Act
            var existingTargetBullets = BulletRepository.ReadByPageId(targetPage.Id);

            BulletRepository.DeleteByPageId(targetPage.Id);
            var deletedTargetBullets = BulletRepository.ReadByPageId(targetPage.Id);
            var noiseBullets         = BulletRepository.ReadByPageId(noisePage.Id);

            // Assert
            Assert.AreEqual(2, existingTargetBullets.Count(), "Two bullets should exist before they are deleted.");
            Assert.IsNotNull(existingTargetBullets.Where(b => b.Id == targetBullet1.Id).FirstOrDefault(), "The first target bullet should be included in the bullets read.");
            Assert.IsNotNull(existingTargetBullets.Where(b => b.Id == targetBullet2.Id).FirstOrDefault(), "The second target bullet should be included in the bullets read.");
            Assert.AreEqual(0, deletedTargetBullets.Count(), "Zero bullets should exist after they are deleted.");
            Assert.AreEqual(1, noiseBullets.Count(), "One noise bullet should still exist in the database.");
            Assert.IsNotNull(noiseBullets.Where(b => b.Id == noiseBullet.Id).FirstOrDefault(), "The noise bullet should exist in the noise bullets read.");
        }
        public void Process_NewPage()
        {
            // Arrange
            var clientHelp   = Models.CreateFirstTimeHelp();
            var clientBullet = Models.CreateBullet(clientHelp.Id);

            clientHelp.Bullets.Add(clientBullet);

            var helpRepository = Mocks.Create <IFirstTimeHelpRepository>();

            helpRepository.Setup(r => r.Create(It.Is <FirstTimeHelp>(p => p.Title == clientHelp.Title)));

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

            bulletRepository.Setup(r => r.Create(It.Is <Bullet>(b => b.Text == clientBullet.Text)));

            var serializer  = new JavaScriptSerializer();
            var requestData = serializer.Serialize(clientHelp);
            var processor   = new SaveFirstTimeHelpRequestProcessor(bulletRepository.Object, helpRepository.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 <FirstTimeHelp>(result.Content);

            Assert.That(resultPage.Title, Is.EqualTo(clientHelp.Title), "The title of the result page should match the client page.");
            Assert.That(resultPage.Bullets.Count, Is.EqualTo(clientHelp.Bullets.Count), "The page returned should have the same number of bullets as the original client page.");
        }
        public void Crud_Success()
        {
            var page = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(page);

            var newBullet = Models.CreateBullet(pageId: page.Id);

            Assert.AreEqual(0, newBullet.Id, "The bullet id should not be set until after data layer Bullet_Create method is called.");

            BulletRepository.Create(newBullet);
            Assert.AreNotEqual(0, newBullet.Id, "The bullet id should have been set by the data layer.");

            var oldText = newBullet.Text;

            newBullet.Text = "New Bullet Text.";
            BulletRepository.Update(newBullet);

            var existingBullet = BulletRepository.ReadByPageId(page.Id).FirstOrDefault();

            Assert.IsNotNull(existingBullet, "The bullet should still exist in the database.");
            Assert.AreNotEqual(oldText, existingBullet.Text, "The bullet's text should have been updated.");
            Assert.AreEqual(newBullet.VerticalOffset, existingBullet.VerticalOffset, "The rest of the bullet instances' properties should be the same.");

            BulletRepository.Delete(existingBullet.Id);

            var deletedBullet = BulletRepository.ReadByPageId(existingBullet.Id).FirstOrDefault();

            Assert.That(deletedBullet, Is.Null, "The bullet should no longer exist in the database.");
        }
        public void Import_ExistingBullet()
        {
            // Arrange
            var help = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(help);
            var bullet = Models.CreateBullet(pageId: help.Id);

            BulletRepository.Create(bullet);

            // Modify the bullet informatio nto verify the values in the data store are overwritten.
            bullet.Number         = 10;
            bullet.Text           = "Import unit test bullet text.";
            bullet.VerticalOffset = 1089;


            // Act
            BulletRepository.Import(bullet);
            var results = BulletRepository.ReadByPageId(help.Id);

            // Assert
            Assert.That(results, Is.Not.Null, "The bullet should still exist in the data store.");
            Assert.That(results.Count, Is.EqualTo(1), "There should be exactly one bullet associated with the page.");
            var result = results.First();

            Assert.That(result.Id, Is.EqualTo(bullet.Id), "The id should remain the same.");
            Assert.That(result.Text, Is.EqualTo(bullet.Text), "The bullet text should have been updated in the data store.");
            Assert.That(result.VerticalOffset, Is.EqualTo(bullet.VerticalOffset), "The vertical offset should have been updated in the data store.");
        }
        public void DeleteExcept_Success()
        {
            // Arrange
            var keptHelp = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(keptHelp);
            var keptBullet = Models.CreateBullet(pageId: keptHelp.Id);

            BulletRepository.Create(keptBullet);

            var deletedHelp = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(deletedHelp);
            var deletedBullet = Models.CreateBullet(pageId: deletedHelp.Id);

            BulletRepository.Create(deletedBullet);
            var anotherDeletedBullet = Models.CreateBullet(pageId: deletedHelp.Id);

            BulletRepository.Create(anotherDeletedBullet);

            // Act
            BulletRepository.DeleteExcept(new List <int> {
                keptBullet.Id
            });

            // Assert
            var bullets = BulletRepository.ReadAll().ToList();

            Assert.That(bullets.Count, Is.EqualTo(1), "Exactly one bullet should be left in the repository.");
            Assert.That(bullets[0].Id, Is.EqualTo(keptBullet.Id), "The remaining bullet should be the one associated with the undeleted page.");
        }
        public void Process_ExistingPage()
        {
            // Arrange
            var dataStorePage = Models.CreateFirstTimeHelp(id: 84926);

            var dataStoreBullets = new List <Bullet>();

            dataStoreBullets.Add(Models.CreateBullet(id: 54829, pageId: dataStorePage.Id));
            dataStoreBullets.Add(Models.CreateBullet(id: 29334, pageId: dataStorePage.Id));
            var updatedBullet = dataStoreBullets[0];
            var deletedBullet = dataStoreBullets[1];

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

            clientHelp.Bullets.Add(Models.CreateBullet(clientHelp.Id));
            clientHelp.Bullets.Add(dataStoreBullets[0]);
            var newBullet = clientHelp.Bullets[0];

            var helpRepository = Mocks.Create <IFirstTimeHelpRepository>();

            helpRepository.Setup(r => r.Update(It.Is <FirstTimeHelp>(p => p.Id == clientHelp.Id)));

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

            bulletRepository.Setup(r => r.ReadByPageId(clientHelp.Id)).Returns(dataStoreBullets);
            bulletRepository.Setup(r => r.Create(It.Is <Bullet>(b => b.Text == newBullet.Text)));
            bulletRepository.Setup(r => r.Update(It.Is <Bullet>(b => b.Id == updatedBullet.Id)));
            bulletRepository.Setup(r => r.Delete(deletedBullet.Id));

            var serializer  = new JavaScriptSerializer();
            var requestData = serializer.Serialize(clientHelp);
            var processor   = new SaveFirstTimeHelpRequestProcessor(bulletRepository.Object, helpRepository.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 resultHelp = serializer.Deserialize <FirstTimeHelp>(result.Content);

            Assert.That(resultHelp.Id, Is.EqualTo(clientHelp.Id), "The page id should not change.");
            Assert.That(resultHelp.Bullets.Count, Is.EqualTo(clientHelp.Bullets.Count), "The returned page should have the same number of bullets as the client page.");
            foreach (var clientBullet in clientHelp.Bullets)
            {
                Assert.That(resultHelp.Bullets.Where(resultBullet => resultBullet.Text == clientBullet.Text).Count(), Is.EqualTo(1), "All bullets in client model should be returned in the result.");
            }
            Mocks.VerifyAll();
        }
        public void Import_NewBullet()
        {
            // Arrange
            var help = Models.CreateFirstTimeHelp();

            FirstTimeHelpRepository.Create(help);
            var bullet = Models.CreateBullet(pageId: help.Id);

            bullet.Id = 42098;

            // Act
            BulletRepository.Import(bullet);
            var results = BulletRepository.ReadByPageId(help.Id);

            // Assert
            Assert.That(results, Is.Not.Null, "The bullet should have been added to the data store.");
            Assert.That(results.Count, Is.EqualTo(1), "There should be exactly one bullet associated with the page.");
            var result = results.First();

            Assert.That(result.Id, Is.EqualTo(bullet.Id), "The id should have been created using the input id.");
        }