public void Create_WhenPostTextNull_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                Nickname = "NewVALIDNICK",
                AuthCode = new string('b', 40)
            };
            var httpServer = new InMemoryHttpServer("http://localhost/");
            var userResponse = httpServer.CreatePostRequest("api/users/register", testUser);
            var userContentString = userResponse.Content.ReadAsStringAsync().Result;
            var userModel = JsonConvert.DeserializeObject<UserLoggedModel>(userContentString);

            var testPost = new PostNewModel()
            {
                Title = "Title",
                Text = null,
                Tags = { }
            };

            var response = httpServer.CreatePostRequest("api/posts", testPost,
                "application/json", userModel.SessionKey);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public void Create_WhenPostModelValid_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                Nickname = "NewVALIDNICK",
                AuthCode = new string('b', 40)
            };
            var httpServer = new InMemoryHttpServer("http://localhost/");
            var userResponse = httpServer.CreatePostRequest("api/users/register", testUser);
            var userContentString = userResponse.Content.ReadAsStringAsync().Result;
            var userModel = JsonConvert.DeserializeObject<UserLoggedModel>(userContentString);

            var testPost = new PostNewModel()
            {
                Title = "Post",
                Text = "ValidText",
                Tags = new string[] { "valid" }
            };

            var response = httpServer.CreatePostRequest("api/posts", testPost,
                "application/json", userModel.SessionKey);

            Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
            Assert.IsNotNull(response.Content);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var model = JsonConvert.DeserializeObject<PostCreatedModel>(contentString);
            Assert.AreEqual(testPost.Title, model.Title);
            Assert.IsTrue(model.Id != 0);
        }
        public void GetByTags_WhenPostModelValidMany_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                Nickname = "NewVALIDNICK",
                AuthCode = new string('b', 40)
            };
            var httpServer = new InMemoryHttpServer("http://localhost/");
            var userResponse = httpServer.CreatePostRequest("api/users/register", testUser);
            var userContentString = userResponse.Content.ReadAsStringAsync().Result;
            var userModel = JsonConvert.DeserializeObject<UserLoggedModel>(userContentString);

            var testPostOne = new PostNewModel()
            {
                Title = "Post",
                Text = "ValidText",
                Tags = new string[] { "other" }
            };

            var testPostTwo = new PostNewModel()
            {
                Title = "Next Post",
                Text = "NextText",
                Tags = new string[] { "other" }
            };

            var testPostThree = new PostNewModel()
            {
                Title = "Third Post",
                Text = "Some",
                Tags = new string[] { "other" }
            };

            httpServer.CreatePostRequest("api/posts", testPostOne,
                "application/json", userModel.SessionKey);
            httpServer.CreatePostRequest("api/posts", testPostTwo,
                "application/json", userModel.SessionKey);
            httpServer.CreatePostRequest("api/posts", testPostThree,
                "application/json", userModel.SessionKey);

            var response = httpServer.CreateGetRequest("api/posts?tags=other",
                "application/json", userModel.SessionKey);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.IsNotNull(response.Content);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var model = JsonConvert.DeserializeObject<List<PostModel>>(contentString);
            Assert.AreEqual(3, model.Count);
        }
        public void Create_WhenSessionKeyNotValid_ShouldSaveToDatabase()
        {
            var testPost = new PostNewModel()
            {
                Title = "Post",
                Text = "ValidText",
                Tags = { }
            };

            var httpServer = new InMemoryHttpServer("http://localhost/");
            var response = httpServer.CreatePostRequest("api/posts", testPost,
                "application/json", new string('a', 50));

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public HttpResponseMessage PostNewPost(PostNewModel model,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
              () =>
              {
                  var context = new BlogSystemContext();
                  using (context)
                  {
                      var user = context.Users.FirstOrDefault(
                          usr => usr.SessionKey == sessionKey);
                      if (user == null)
                      {
                          throw new InvalidOperationException("Invalid sessionKey");
                      }

                      if (model.Title == null || model.Text == null)
                      {
                          throw new ArgumentNullException("Post title or post text cannot be null");
                      }

                      string[] titleWords = model.Title.Split(
                          new char[] { ' ', ',', '.', '!', '?', '\'', '(', ')' },
                          StringSplitOptions.RemoveEmptyEntries);

                      IList<Tag> tags = new List<Tag>();
                      if (model.Tags != null)
                      {
                          foreach (var item in model.Tags)
                          {
                              var tag = context.Tags.FirstOrDefault(t => t.Name == item.ToLower());
                              if (tag == null)
                              {
                                  tag = new Tag()
                                  {
                                      Name = item.ToLower()
                                  };

                                  context.Tags.Add(tag);
                                  context.SaveChanges();
                              }

                              tags.Add(tag);
                          }
                      }

                      foreach (var item in titleWords)
                      {
                          var tag = context.Tags.FirstOrDefault(t => t.Name == item.ToLower());
                          if (tag == null)
                          {
                              tag = new Tag()
                              {
                                  Name = item.ToLower()
                              };

                              context.Tags.Add(tag);
                              context.SaveChanges();
                          }

                          tags.Add(tag);
                      }

                      var post = new Post()
                      {
                          Title = model.Title,
                          Text = model.Text,
                          PostDate = DateTime.Now,
                          User = user,
                          Tags = tags
                      };

                      context.Posts.Add(post);
                      context.SaveChanges();

                      var createdModel = new PostCreatedModel()
                      {
                          Id = post.Id,
                          Title = post.Title
                      };

                      var response =
                          this.Request.CreateResponse(HttpStatusCode.Created,
                                          createdModel);
                      return response;
                  }
              });

            return responseMsg;
        }