public void GetScratchVersesFromASpecificPoemForASpecificUser()
        {
            IVerseRepository verseRepository = GetRepositoryWithEnrolledUnitOfWork();
            AuthorityType authorityType = new LegendAuthorityType();
            RegisterDataStoreObject(authorityType);
            UserProfile profile1 = CreateUserProfile(authorityType);
            RegisterDataStoreObject(profile1);
            UserProfile profile2 = CreateUserProfile(authorityType);
            RegisterDataStoreObject(profile2);
            Poem poem = CreatePoem<ClassicalPoem>(profile1.Id);
            RegisterDataStoreObject(poem);
            VerseType verseType = new ScratchVerseType();
            RegisterDataStoreObject(verseType);
            int numberOfVersesWrittenForOneUser = Rand.Next(10, 20);
            int numberOfVersesWrittenByAnotherUser = Rand.Next(10, 20);
            DateTime date = DateTime.Now;
            for (int i = 0; i < numberOfVersesWrittenForOneUser; i++)
            {
                Verse verse = new Verse
                              {
                                  AuthorProfileId = profile1.Id,
                                  FromIpAddress = "127.0.0.1",
                                  LastEdit = DateTime.UtcNow,
                                  Location = "Chisinau",
                                  OrderNr = 1,
                                  PoemId = poem.Id,
                                  Text = Guid.NewGuid().ToString(),
                                  VerseTypeId = verseType.Id,
                                  WrittenAt = date - TimeSpan.FromDays(10)
                              };
                RegisterDataStoreObject(verse);
            }

            for (int i = 0; i < numberOfVersesWrittenByAnotherUser; i++)
            {
                Verse verse = new Verse
                              {
                                  AuthorProfileId = profile2.Id,
                                  FromIpAddress = "127.0.0.1",
                                  LastEdit = DateTime.UtcNow,
                                  Location = "Chisinau",
                                  OrderNr = 1,
                                  PoemId = poem.Id,
                                  Text = Guid.NewGuid().ToString(),
                                  VerseTypeId = verseType.Id,
                                  WrittenAt = date - TimeSpan.FromDays(10)
                              };
                RegisterDataStoreObject(verse);
            }

            var versesForProfile1 = verseRepository.GetVersesFromPoemForUser(poem.Id, profile1.Id);
            var versesForProfile2 = verseRepository.GetVersesFromPoemForUser(poem.Id, profile2.Id);
            var allVerses = verseRepository.GetVersesFromPoem(poem.Id);

            Assert.AreEqual(numberOfVersesWrittenForOneUser, versesForProfile1.Count());
            Assert.AreEqual(numberOfVersesWrittenByAnotherUser, versesForProfile2.Count());
            Assert.AreEqual(numberOfVersesWrittenByAnotherUser + numberOfVersesWrittenForOneUser, allVerses.Count());
        }
        protected override VerseData OnUpdateVerseFromPoem(Verse verse, string verseText, VerseEngineeringUser user)
        {
            if (verse.AuthorProfileId != user.UserId)
            {
                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new StringContent("You are not allowed to update verse which wasn't written by you") });
            }

            verseService.UpdateVerseText(verse, verseText);
            return Mapper.Map<VerseData>(verse);
        }
        protected override VerseData OnPostVerseForPoem(Poem poem, AddVerseModel verseModel, VerseEngineeringUser user)
        {
            Verse verse = new Verse
            {
                AuthorProfileId = user.UserId,
                FromIpAddress = string.Empty,
                LastEdit = DateTime.UtcNow,
                WrittenAt = DateTime.UtcNow,
                Location = string.Empty,
                OrderNr = 0,
                PoemId = poem.Id,
                Text = verseModel.Text,
            };

            verseService.Insert<ScratchVerseType>(verse);
            return Mapper.Map<VerseData>(verse);
        }
        public void EditVerseSuccessful()
        {
            const int PoemId = 123456;
            const long AuthorProfileId = 123;
            const long VerseId = 1001;

            var requestUser = new VerseEngineeringUser(AuthorProfileId, "TestUser", "TestFacebookAccessToken");
            var verseToEdit = new Verse
            {
                AuthorProfileId = AuthorProfileId,
                Id = VerseId,
                PoemId = PoemId,
                Text = "Sample verse text",
                VerseType = new ScratchVerseType()
            };

            verseService.Setup(service => service.GetById(VerseId)).Returns(verseToEdit);
            verseService.Setup(service => service.UpdateVerseText(verseToEdit, "This is text to edit")).Callback(
                (Verse verse, string text) => { verse.Text = text; });

            var response = scratchPadVersesController.PutVerse(
                VerseId, new UpdateVerseModel { Text = "This is text to edit" }, requestUser);

            Assert.IsNotNull(response);
            Assert.IsTrue(response.Id == VerseId);
            Assert.IsTrue(response.PoemId == PoemId);
            Assert.IsTrue(response.Text == "This is text to edit");
        }
        public void EditVerseFailedBecauseTheUserIsNotTheAuthor()
        {
            const int PoemId = 123456;
            const long AuthorProfileId = 123;
            const long VerseId = 1001;

            var requestUser = new VerseEngineeringUser(AuthorProfileId, "TestUser", "TestFacebookAccessToken");
            var verseToDelete = new Verse
            {
                AuthorProfileId = 321,
                Id = VerseId,
                PoemId = PoemId,
                Text = "Sample verse text",
                VerseType = new ScratchVerseType()
            };

            verseService.Setup(service => service.GetById(VerseId)).Returns(verseToDelete);
            try
            {
                scratchPadVersesController.PutVerse(VerseId, new UpdateVerseModel { Text = "This is an edited verse" }, requestUser);
            }
            catch (HttpResponseException exception)
            {
                Assert.IsTrue(exception.Response.StatusCode == HttpStatusCode.Forbidden);
                return;
            }

            Assert.Fail();
        }
        public void DeleteVerseSuccessful()
        {
            const int PoemId = 123456;
            const long AuthorProfileId = 123;
            const long VerseId = 1001;

            var requestUser = new VerseEngineeringUser(AuthorProfileId, "TestUser", "TestFacebookAccessToken");
            var verseToDelete = new Verse
                {
                    AuthorProfileId = AuthorProfileId,
                    Id = VerseId,
                    PoemId = PoemId,
                    Text = "Sample verse text",
                    VerseType = new ScratchVerseType()
                };

            verseService.Setup(service => service.GetById(VerseId)).Returns(verseToDelete);
            verseService.Setup(service => service.Delete<ScratchVerseType>(verseToDelete));

            var response = scratchPadVersesController.DeleteVerseFromPoem(VerseId, requestUser);

            Assert.IsNotNull(response);
            Assert.IsTrue(response.Id == VerseId);
            Assert.IsTrue(response.PoemId == PoemId);
            Assert.IsTrue(response.Text == "Sample verse text");
        }
 protected override VerseData OnUpdateVerseFromPoem(Verse verse, string verseText, VerseEngineeringUser user)
 {
     throw new System.NotImplementedException();
 }
 private void UpdateGameMaster(Poem poem, Verse verse)
 {
     if (poem.CurrentGm != verse.AuthorProfileId)
     {
         poem.CurrentGm = verse.AuthorProfileId;
         poemService.Update(poem);
     }
 }
 public static bool AlreadyVoted(this UserProfile profile, Verse verse)
 {
     return verse.VerseVotes.Any(vote => vote.UserProfileId == profile.Id);
 }
        public void GetVersesWrittenEarlierFromDate()
        {
            IVerseRepository verseRepository = GetRepositoryWithEnrolledUnitOfWork();
            var prepared = PreparePoem<NoviceAuthorityType, HaikuPoem>();
            VerseType verseType = new CandidateVerseType();
            RegisterDataStoreObject(verseType);
            int numberOfVersesWrittenBeforeThreshold = Rand.Next(10, 20);
            int numberOfVersesWrittenAfterThreshold = Rand.Next(10, 20);
            DateTime date = new DateTime(2011, 10, 10);
            for (int i = 0; i < numberOfVersesWrittenBeforeThreshold; i++)
            {
                Verse verse = new Verse
                              {
                                  AuthorProfileId = prepared.Item1.Id,
                                  FromIpAddress = "127.0.0.1",
                                  LastEdit = DateTime.UtcNow,
                                  Location = "Chisinau",
                                  OrderNr = 1,
                                  PoemId = prepared.Item2.Id,
                                  Text = Guid.NewGuid().ToString(),
                                  VerseTypeId = verseType.Id,
                                  WrittenAt = date - TimeSpan.FromDays(10)
                              };
                RegisterDataStoreObject(verse);
            }

            for (int i = 0; i < numberOfVersesWrittenAfterThreshold; i++)
            {
                Verse verse = new Verse
                              {
                                  AuthorProfileId = prepared.Item1.Id,
                                  FromIpAddress = "127.0.0.1",
                                  LastEdit = DateTime.UtcNow,
                                  Location = "Chisinau",
                                  OrderNr = 1,
                                  PoemId = prepared.Item2.Id,
                                  Text = Guid.NewGuid().ToString(),
                                  VerseTypeId = verseType.Id,
                                  WrittenAt = date + TimeSpan.FromDays(10)
                              };
                RegisterDataStoreObject(verse);
            }

            var afterThreshold = verseRepository.GetVersesWrittenFrom(date);
            var allItems = verseRepository.GetVersesFromPoem(prepared.Item2.Id);

            Assert.AreEqual(numberOfVersesWrittenAfterThreshold, afterThreshold.Count());
            Assert.AreEqual(
                numberOfVersesWrittenAfterThreshold + numberOfVersesWrittenBeforeThreshold, allItems.Count());
        }
 private void AssertVersesAreEqual(Verse expectedVerse, Verse actualVerse)
 {
     Assert.AreEqual(expectedVerse.Id, actualVerse.Id);
     Assert.AreEqual(expectedVerse.AuthorProfileId, actualVerse.AuthorProfileId);
     Assert.AreEqual(expectedVerse.FromIpAddress, actualVerse.FromIpAddress);
     Assert.AreEqual(expectedVerse.LastEdit, actualVerse.LastEdit);
     Assert.AreEqual(expectedVerse.Location, actualVerse.Location);
     Assert.AreEqual(expectedVerse.OrderNr, actualVerse.OrderNr);
     Assert.AreEqual(expectedVerse.PoemId, actualVerse.PoemId);
     Assert.AreEqual(expectedVerse.Text, actualVerse.Text);
     Assert.AreEqual(expectedVerse.VerseTypeId, actualVerse.VerseTypeId);
     Assert.AreEqual(expectedVerse.WrittenAt, actualVerse.WrittenAt);
 }
        public void SuccessfulCreationAndInsertionOfVerses()
        {
            IVerseRepository verseRepository = GetRepositoryWithEnrolledUnitOfWork();
            var preparedTupple = PreparePoem<LegendAuthorityType, ClassicalPoem>();
            VerseType verseType = new CandidateVerseType();
            RegisterDataStoreObject(verseType);
            Verse verse = new Verse
                          {
                              AuthorProfileId = preparedTupple.Item1.Id,
                              FromIpAddress = "127.0.0.1",
                              LastEdit = DateTime.UtcNow,
                              Location = "Chisinau",
                              OrderNr = 1,
                              PoemId = preparedTupple.Item2.Id,
                              Text = Guid.NewGuid().ToString(),
                              VerseTypeId = verseType.Id,
                              WrittenAt = DateTime.UtcNow
                          };

            RegisterDataStoreObject(verse);
            var actualVerse = verseRepository.GetById(verse.Id);

            AssertVersesAreEqual(verse, actualVerse);
        }
        private Verse InsertCandidateVerseWithNoPreviousScratchVerseDefined(long poemId, AddVerseModel verseModel, long userId)
        {
            Verse verse = new Verse
            {
                AuthorProfileId = userId,
                FromIpAddress = string.Empty,
                LastEdit = DateTime.UtcNow,
                WrittenAt = DateTime.UtcNow,
                Location = string.Empty,
                OrderNr = 0,
                PoemId = poemId,
                Text = verseModel.Text,
            };

            verseService.Insert<CandidateVerseType>(verse);
            return verse;
        }
 protected override VerseData OnDeleteVerseFromPoem(Verse verse, VerseEngineeringUser user)
 {
     throw new NotImplementedException();
 }
 protected abstract VerseData OnDeleteVerseFromPoem(Verse verse, VerseEngineeringUser user);
 protected abstract VerseData OnUpdateVerseFromPoem(Verse verse, string verseText, VerseEngineeringUser user);
        public void CreateNewPoemVerseSuccessfulWithGameMasterChanged()
        {
            const int PoemId = 123456;
            const long AuthorProfileId = 123;
            const long VerseId = 1234567;

            Poem poem = new ClassicalPoem
                {
                    Id = PoemId,
                    Players =
                        new Collection<Player>(
                            new[] { new Player { UserProfileId = AuthorProfileId }, new Player { UserProfileId = 1 } }),
                    CurrentGm = AuthorProfileId,
                    CurrentGameMasterUserProfile = new UserProfile { Id = AuthorProfileId }
                };

            poemService.Setup(service => service.GetPoemById(PoemId)).Returns(poem);
            Verse verse = new Verse
                {
                    Id = VerseId,
                    PoemId = PoemId,
                    VerseType = new CandidateVerseType(),
                    AuthorProfileId = AuthorProfileId + 1,
                    Text = "This is a verse to be updated"
                };
            verseService.Setup(service => service.GetById(VerseId)).Returns(verse);
            verseService.Setup(service => service.UpdateVerse(verse, It.IsAny<PoemVerseType>()));
            verseService.Setup(service => service.GetVerseType<PoemVerseType>()).Returns(new PoemVerseType());
            poemService.Setup(service => service.Update(poem)).Callback(
                (Poem updated) => Assert.AreEqual(AuthorProfileId + 1, updated.CurrentGm));
            signalizerFactory.Setup(factory => factory.GetSignal<PoemVerseAddedSignal<Raw>>()).Returns(
                new PoemVerseAddedSignal<Raw>(logger.Object));
            signalizerFactory.Setup(factory => factory.GetSignal<PoemGameMasterChangedSignal<Raw>>()).Returns(
                new PoemGameMasterChangedSignal<Raw>(logger.Object));

            VerseEngineeringUser requestUser = new VerseEngineeringUser(
                AuthorProfileId, "TestUser", "TestFacebookAccessToken");
            VerseData verseData =
                poemVersesController.PostVerseForPoem(new AddVerseModel { Id = VerseId, PoemId = PoemId }, requestUser);

            Assert.AreEqual(VerseId, verseData.Id);
            Assert.AreEqual("This is a verse to be updated", verseData.Text);
            Assert.AreEqual(PoemId, verseData.PoemId);
        }