public void CreatePost_WhenTextIsNotValid_ShouldNotSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE", // MISSING TEXT
                Tags = new string[] { "FIRST", "SECOND" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            var response = httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<PostModel>(contentString);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            Assert.IsNull(postModel.Title);
        }
        public void CreatePost_WithValidData_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };
            var userModel = Helpers.RegisterTestValidUser(httpServer, testUser);

            var testPost = new PostModel()
            {
                Title = "NEW POST",
                Tags = new List<string>()
                {
                    "post"
                },
                Text = "this is just a test post"
            };

            var response = httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testPost);
            Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
            Assert.IsNotNull(response.Content);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<ResponsePostModel>(contentString);

            Assert.AreEqual(postModel.Title, testPost.Title);
            Assert.IsTrue(postModel.Id > 0);
        }
Beispiel #3
0
        public static IEnumerable<Tag> GetTags(PostModel post, BlogContext context)
        {
            var result = new List<Tag>();

            if (post != null)
            {
                post.Tags.ForEach(pt => GetTag(context, pt, result));
                var matches = Regex.Matches(post.Title, @"\w+");
                matches.Cast<Match>().Select(m => m.Value).ForEach(pt => GetTag(context, pt, result));
            }

            return result;
        }
        //POST api/posts/create
        public HttpResponseMessage PostCreate(PostModel post, string sessionKey)
        {
            var context = new BlogContext();
            var responseMsg = this.PerformOperationAndHandleExceptionsWithSessionKey(sessionKey, context, () =>
            {
                HttpResponseMessage response;
                var newPost = new Post();
                using (var tran = new TransactionScope())
                {
                    newPost.Title = post.Title;
                    newPost.Text = post.Text;
                    newPost.PostDate = DateTime.Now;
                    newPost.User = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);

                    var tags = Helpers.GetTags(post, context);
                    tags.ForEach(t => newPost.Tags.Add(t));
                
                    context.Posts.Add(newPost);
                    context.SaveChanges();
                    tran.Complete();
                }

                if (newPost.Id > 0)
                {
                    response = this.Request.CreateResponse(HttpStatusCode.Created, new ResponsePostModel()
                    {
                        Id = newPost.Id,
                        Title = newPost.Title
                    });
                }
                else
                {
                    response = this.Request.CreateResponse(HttpStatusCode.InternalServerError);
                }

                return response;
            });

            return responseMsg;
        }
        public void LeaveComment_WhenWrongSessionKey_ShouldNotSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            var postResponse = httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            var contentString = postResponse.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<PostModel>(contentString);

            var newComment = new CommentModel()
            {
                Text = "VALIDCOMMENTTEXT"
            };

            //Try to make a comment with wrong sessionKey
            string invalidSessionKey = "sdasdasdasddsaijdij2jiwjijei2jiedjisjidsa";

            var response = httpServer.Put("api/posts/" + postModel.Id + "/comment?sessionKey=" + invalidSessionKey,
                newComment);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        //POST api/posts/
        public HttpResponseMessage PostCreate(PostModel post,
            [ValueProvider(typeof(HeaderValueProviderFactory<string>))] string sessionKey)
        {
            var context = new BloggingSystemContext();
            var user = context.Users.FirstOrDefault(usr => usr.SessionKey == sessionKey);
            var responseMsg = this.PerformOperationAndHandleExceptionsWithSessionKey(
                sessionKey, context, () =>
            {
                var newPost = new Post();
                newPost.Title = post.Title;
                newPost.Text = post.Text;
                newPost.PostDate = DateTime.Now;
                newPost.User = user;
                newPost.Tags = new List<Tag>();

                var pattern = new Regex(
                    @"( [^\W_\d]              # starting with a letter
                                              # followed by a run of either...
                        ( [^\W_\d] |          #   more letters or
                          [-'\d](?=[^\W_\d])  #   ', -, or digit followed by a letter
                        )*
                        [^\W_\d]              # and finishing with a letter
                      )",
                    RegexOptions.IgnorePatternWhitespace);

                foreach (Match m in pattern.Matches(newPost.Title))
                {
                    var tagContent = m.Groups[1].Value.ToLower();
                    if (context.Tags.FirstOrDefault(t => t.Content == tagContent) == null)
                    {
                        newPost.Tags.Add(new Tag()
                        {
                            Content = tagContent,
                        });
                    }
                }

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

                var createdPost = new CreatedPost()
                {
                    Id = newPost.Id,
                    Title = newPost.Title
                };

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

            return responseMsg;
        }
        public void CreatePost_WithNullData_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };
            var userModel = Helpers.RegisterTestValidUser(httpServer, testUser);

            var testPost = new PostModel();

            var response = httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testPost);
            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public void GetPostByTags_WithNullData_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };
            var userModel = Helpers.RegisterTestValidUser(httpServer, testUser);

            var testPost = new PostModel()
            {
                Title = "NEW POST created",
                Tags = new List<string>()
                {
                    "post",
                    "web",
                    "api",
                    "root",
                },
                Text = "this is just a test post"
            };

            var createResponse = httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testPost);

            var response = httpServer.Get("api/posts?tags=&sessionKey=" + userModel.SessionKey);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            Assert.IsNotNull(response.Content);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<List<PostModel>>(contentString);

            Assert.IsTrue(postModel.Count == 0);
        }
        public void CreateCommentar_WithInvalideSessionKeyData_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };
            var userModel = Helpers.RegisterTestValidUser(httpServer, testUser);

            var testPost = new PostModel()
            {
                Title = "NEW POST created",
                Tags = new List<string>()
                {
                    "post",
                    "web",
                    "api",
                    "root",
                },
                Text = "this is just a test post"
            };

            var postResponse = httpServer.Post("api/posts?sessionKey=32543tfg", testPost);
            var postContentString = postResponse.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<PostModel>(postContentString);

            var testComment = new CommentModel()
            {
                Text = "Abe kefi me toq post"
            };

            var commentResponse = httpServer.Put("api/posts/" + postModel.Id + "/comment?sessionKey=dsadasda", testComment);
            Assert.AreEqual(HttpStatusCode.BadRequest, commentResponse.StatusCode);
        }
        private PostModel PostCreatePost(InMemoryHttpServer httpServer, PostModel testPost)
        {
            LoggedUserModel loggedUser = RegisterTestUser(httpServer, testUser);
            var headers = new Dictionary<string, string>();
            headers["X-sessionKey"] = loggedUser.SessionKey;

            var response = httpServer.Post("api/posts/create", testPost, headers);
            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<PostModel>(contentString);
            return postModel;
        }
        public void CreatePost_WithInValidSessionKey_ShouldSaveToDatabase()
        {
            var testPost = new PostModel()
            {
                Title = "NEW POST",
                Tags = new List<string>()
                {
                    "post"
                },
                Text = "this is just a test post"
            };

            var response = httpServer.Post("api/posts?sessionKey=fgfkfkffkk", testPost);
            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public HttpResponseMessage PostNewPost(PostModel model, string sessionKey)
        {
            var responseMsg = this.PerformOperationAndHandleExceptions(
                () =>
                {
                    var context = new BlogContext();

                    using (context)
                    {
                        var user = context.Users.FirstOrDefault(u => u.SessionKey == sessionKey);

                        if (user == null)
                        {
                            throw new InvalidOperationException("Users doesn't exists");
                        }

                        if (model.Title == null)
                        {
                            throw new InvalidOperationException("Title cannot be null");
                        }

                        if (model.Text == null)
                        {
                            throw new InvalidOperationException("Text cannot be null");
                        }

                        Post post = new Post();
                        post.Title = model.Title;
                        post.Text = model.Text;
                        post.PostDate = DateTime.Now;
                        post.PostedBy = user;

                        foreach (var tag in model.Tags)
                        {
                            Tag currentTag = CreateOrLoadTag(context, tag.ToLower());
                            post.Tags.Add(currentTag);
                        }

                        string[] titleTags = Regex.Split(model.Title, @"[,!\. ;?']+");

                        foreach (var titleTagName in titleTags)
                        {
                            Tag titleTag = CreateOrLoadTag(context, titleTagName.ToLower());
                            post.Tags.Add(titleTag);
                        }

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

                        var response = this.Request.CreateResponse(HttpStatusCode.Created, new
                        {
                            Title = post.Title,
                            Id = post.Id
                        });

                        return response;
                    }
                });

            return responseMsg;
        }
        public void CreatePost_WhenUserDoesntExists_ShouldNotSaveToDatabase()
        {
            //Sendind wrong session key should trigger an exception which will return a BadRequest

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            string randomSessionKey = "dasdsadasdji2iejridsiadjwqijrjifji3jirjiifejiehu4rushurehuu";

            var response = httpServer.Post("api/posts?sessionKey=" + randomSessionKey, testNewPost);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<PostModel>(contentString);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
            Assert.IsTrue(postModel.Id == 0);
        }
        public void LeaveComment_WhenPostNotExists_ShouldNotSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            var newComment = new CommentModel()
            {
                Text = "VALIDCOMMENTTEXT"
            };

            int invalidPostId = 0;

            var response = httpServer.Put("api/posts/" + invalidPostId + "/comment?sessionKey=" + userModel.SessionKey,
                newComment);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }
        public void LeaveComment_WhenCommentModelIsValid_ShouldSaveToDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            var postResponse = httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            var contentString = postResponse.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<PostModel>(contentString);

            var newComment = new CommentModel()
            {
                Text = "VALIDCOMMENTTEXT"
            };

            var response = httpServer.Put("api/posts/" + postModel.Id + "/comment?sessionKey=" + userModel.SessionKey,
                newComment);

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
        public void GetPostsByTags_WhenTagsThatAreNotInDatabase()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            var response = httpServer.Get("api/posts?tags=RANDOMTAG&sessionKey=" + userModel.SessionKey);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<IEnumerable<PostModel>>(contentString);

            var expectedPostsCount = 0;

            Assert.AreEqual(expectedPostsCount, postModel.Count());
        }
        public void GetPostsByTags_WhenTagsAreValid()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            var testNewPost1 = new PostModel()
            {
                Title = "Some title",
                Text = "Some different Text",
                Tags = new string[] { "Yo", "Exam" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost1);

            var response = httpServer.Get("api/posts?tags=FIRST,SECOND&sessionKey=" + userModel.SessionKey);

            var contentString = response.Content.ReadAsStringAsync().Result;
            var postModel = JsonConvert.DeserializeObject<IEnumerable<PostModel>>(contentString);

            var currentPost = postModel.FirstOrDefault();

            var expectedPostsCount = 1;
            var expectedTags = 3;

            Assert.AreEqual(expectedPostsCount, postModel.Count());
            Assert.AreEqual(expectedTags, currentPost.Tags.Count());
        }
        public void GetPostsByTags_WhenTagsAreNull()
        {
            var testUser = new UserModel()
            {
                Username = "******",
                DisplayName = "VALIDNICK",
                AuthCode = new string('b', 40)
            };

            var testNewPost = new PostModel()
            {
                Title = "VALIDTITLE",
                Text = "VALIDTEXT",
                Tags = new string[] { "FIRST", "SECOND" }
            };

            LoggedUserModel userModel = RegisterUser.RegisterTestUser(httpServer, testUser);

            httpServer.Post("api/posts?sessionKey=" + userModel.SessionKey, testNewPost);

            //sendind request with empty tags parameter
            var response = httpServer.Get("api/posts?tags=&sessionKey=" + userModel.SessionKey);

            Assert.AreEqual(HttpStatusCode.BadRequest, response.StatusCode);
        }