private async Task <Models.User> RetrieveAuthor(Models.Post post) { var userCollection = MongoWrapper.Database.GetCollection <Models.User>(nameof(User)); var userFilterBuilder = new FilterDefinitionBuilder <Models.User>(); var userFilter = userFilterBuilder.And ( userFilterBuilder.Eq(u => u._id, post.Poster._id), GeneralUtils.NotDeactivated(userFilterBuilder) ); var userProjectionBuilder = new ProjectionDefinitionBuilder <Models.User>(); var userProjection = userProjectionBuilder .Include(m => m._id) .Include(m => m.FullName) .Include(m => m.Avatar) .Include(m => m.Phone) .Include(m => m.StartDate) .Include(m => m.Email) .Include(m => m.Address) .Include("_t"); return((await userCollection.FindAsync(userFilter, new FindOptions <Models.User> { Limit = 1, AllowPartialResults = true, Projection = userProjection })).SingleOrDefault()); }
public void PerformPostNewMessageOnNewUserTest() { // act string input = "Alice -> I love the weather today"; var user = new User { UserId = Guid.NewGuid(), Username = "******" }; _userManagerMock.Setup(x => x.GetUserByUsername(user.Username, false)).Returns((User) null); _userManagerMock.Setup(x => x.AddUser(user.Username)).Returns(user); _messageManagerMock.Setup(x => x.AddMessage(user.UserId, input)); var perform = new Post(_userManagerMock.Object, _messageManagerMock.Object); // actual var actual = perform.Perform(input); // assert Assert.AreEqual(actual, string.Empty); _userManagerMock.Verify(x=>x.AddUser(It.IsAny<string>()), Times.Once); _messageManagerMock.Verify(x=>x.AddMessage(It.IsAny<Guid>(),It.IsAny<string>()), Times.AtLeastOnce); }
public void PerformPostMessageOnExistingUserTest() { // act string input = "Bob -> Good game though."; User user = new User { UserId = Guid.NewGuid(), Username = "******" }; Message userMessage = new Message { UserId = user.UserId }; _userManagerMock.Setup(x => x.GetUserByUsername(user.Username, false)).Returns(user); _messageManagerMock.Setup(x => x.AddMessage(user.UserId, input)); var perform = new Post(_userManagerMock.Object, _messageManagerMock.Object); // actual var actual = perform.Perform(input); // assert Assert.AreEqual(actual, string.Empty); _userManagerMock.Verify(x => x.AddUser(It.IsAny<string>()), Times.Never); _messageManagerMock.Verify(x => x.AddMessage(It.IsAny<Guid>(), It.IsAny<string>()), Times.AtLeastOnce); }
public static string ViewPost(Post post) { if ((post.Title == null) || (post.Content == null)) return String.Empty; return String.Format("<h2>{0}</h2><div>{1}</div>", post.Title, post.Content); }
public static Post GetFileData(FileInfo file, SnowSettings snowSettings) { var rawPost = File.ReadAllText(file.FullName); var fileNameMatches = FileNameRegex.Match(file.Name); var rawSettings = string.Empty; if (!fileNameMatches.Success) { file.Name.OutputIfDebug(" - Skipping file: "); " - File does not match the format {year}-{month}-{day}-{slug}.(md|markdown)".OutputIfDebug(); return new Post.MissingPost(); } var result = MarkdownFileParser.ParseDataFromFile(rawPost); var settings = ParseSettings(result.Header); var year = fileNameMatches.Groups["year"].Value; var month = fileNameMatches.Groups["month"].Value; var day = fileNameMatches.Groups["day"].Value; var slug = fileNameMatches.Groups["slug"].Value.ToUrlSlug(); var date = DateTime.ParseExact(year + month + day, "yyyyMMdd", CultureInfo.InvariantCulture); /// if a 'date' property is found in markdown file header, that date will be used instead of the date in the file name if (settings.ContainsKey("date")) { try { date = DateTime.Parse((string)settings["date"]); } finally { /// do nothing, let the current 'date' be as is } } var bodySerialized = Markdown.Transform(result.Body); var excerptSerialized = Markdown.Transform(result.Excerpt ?? string.Empty); var postHeader = new Post { FileName = file.Name, MarkdownHeader = rawSettings, Content = bodySerialized, ContentExcerpt = excerptSerialized, Settings = settings, Year = date.Year, Month = date.Month, Day = date.Day, Date = date, Url = slug }; postHeader.SetSnowSettings(snowSettings); postHeader.SetHeaderSettings(settings); return postHeader; }
public static Post GetFileData(FileInfo file, Browser browser, SnowSettings snowSettings) { var response = browser.Get("/post/" + HttpUtility.UrlEncodeUnicode(file.Name)); var rawPost = File.ReadAllText(file.FullName); var fileNameMatches = FileNameRegex.Match(file.Name); var settings = new Dictionary<string, dynamic>(); var rawSettings = string.Empty; if (!fileNameMatches.Success) { throw new ApplicationException("File " + file.Name + " does not match the format {year}-{month}-{day}-{slug}.(md|markdown)"); } //Get the Header info from a Post Markdown File //Find the first index of --- var startOfSettingsIndex = rawPost.IndexOf("---", StringComparison.InvariantCultureIgnoreCase); if (startOfSettingsIndex >= 0) { //Find the second index of --- after the first var endOfSettingsIndex = rawPost.IndexOf("---", startOfSettingsIndex + 3, StringComparison.InvariantCultureIgnoreCase); //If we find the 2nd index, parse the settings //Otherwise we assume there's no header or settings... if (endOfSettingsIndex >= 0) { rawSettings = rawPost.Substring(startOfSettingsIndex + 3, endOfSettingsIndex - 3); settings = ParseSettings(rawSettings); } } var year = fileNameMatches.Groups["year"].Value; var month = fileNameMatches.Groups["month"].Value; var day = fileNameMatches.Groups["day"].Value; var slug = fileNameMatches.Groups["slug"].Value.ToUrlSlug(); var date = DateTime.ParseExact(year + month + day, "yyyyMMdd", CultureInfo.InvariantCulture); var result = new Post { FileName = file.Name, MarkdownHeader = rawSettings, Content = response.Body.AsString(), Settings = settings, Year = date.Year, Month = date.Month, Day = date.Day, Date = date, Url = slug }; result.SetSnowSettings(snowSettings); result.SetHeaderSettings(settings); return result; }
private void EnrichPostWithAuthor(Models.Post post, Models.User user) { if (user == null) { Logger.LogWarning("Post Author was not found! post id: {}, poster id: {}", post._id, post.Poster._id); } else { post.Poster = user; } }
public ActionResult AddPost(Post post) { if (ModelState.IsValid) { post.CreationDate = DateTime.Now; post.UserId = userRepository.GetUserInfo(User.Identity.Name).Id; repository.InsertPost(post); return RedirectToAction("Index", "Blog"); } return View(); }
public void Check_AddPost() { var newPost = new Post {Id = 10}; var postStore = new PostStore(_databaseContextMock.Object); postStore.AddPost(newPost); var result = postStore.GetById(1); Assert.IsNotNull(result); Assert.AreEqual(1, result.Id); }
public void Should_parse_parse_author() { var settings = new Dictionary<string, object>() { {"author", "author name"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal("author name", post.Author); }
public void Should_parse_layout() { var settings = new Dictionary<string, object>() { {"layout", "layout"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal("layout", post.Layout); }
public void Should_parse_email() { var settings = new Dictionary<string, object>() { {"email", "*****@*****.**"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal("*****@*****.**", post.Email); }
public void Should_parse_category() { var settings = new Dictionary<string, object>() { {"category", "1, 2"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal("1", post.Categories.First()); Assert.Equal("2", post.Categories.Last()); }
public static Post GetFileData(FileInfo file, SnowSettings snowSettings) { var rawPost = File.ReadAllText(file.FullName); var fileNameMatches = FileNameRegex.Match(file.Name); var rawSettings = string.Empty; if (!fileNameMatches.Success) { file.Name.OutputIfDebug(" - Skipping file: "); " - File does not match the format {year}-{month}-{day}-{slug}.(md|markdown)".OutputIfDebug(); return new Post.MissingPost(); } var result = MarkdownFileParser.ParseDataFromFile(rawPost); var settings = ParseSettings(result.Header); var year = fileNameMatches.Groups["year"].Value; var month = fileNameMatches.Groups["month"].Value; var day = fileNameMatches.Groups["day"].Value; var slug = fileNameMatches.Groups["slug"].Value.ToUrlSlug(); var date = DateTime.ParseExact(year + month + day, "yyyyMMdd", CultureInfo.InvariantCulture); var bodySerialized = Markdown.Transform(result.Body); var excerptSerialized = Markdown.Transform(result.Excerpt ?? string.Empty); var postHeader = new Post { FileName = file.Name, MarkdownHeader = rawSettings, Content = bodySerialized, ContentExcerpt = excerptSerialized, Settings = settings, Year = date.Year, Month = date.Month, Day = date.Day, Date = date, Url = slug }; postHeader.SetSnowSettings(snowSettings); postHeader.SetHeaderSettings(settings); return postHeader; }
public void Should_sort_categories_ascending() { // Arrange var post = new Post(); var settings = new Dictionary<string, object> { {"categories", "b, A, C, .Net"} }; // Act post.SetHeaderSettings(settings); // Assert var categories = post.Categories.ToArray(); Assert.Equal(".Net", categories[0]); Assert.Equal("A", categories[1]); Assert.Equal("b", categories[2]); Assert.Equal("C", categories[3]); }
public static Post GetFileData(FileInfo file, Browser browser, SnowSettings snowSettings) { var response = browser.Get("/post/" + HttpUtility.UrlEncodeUnicode(file.Name)); var rawPost = File.ReadAllText(file.FullName); var fileNameMatches = FileNameRegex.Match(file.Name); var rawSettings = string.Empty; if (!fileNameMatches.Success) { file.Name.OutputIfDebug(" - Skipping file: "); " - File does not match the format {year}-{month}-{day}-{slug}.(md|markdown)".OutputIfDebug(); return new Post.MissingPost(); } var result = ParseDataFromFile(rawPost); var settings = ParseSettings(result.Item1); var year = fileNameMatches.Groups["year"].Value; var month = fileNameMatches.Groups["month"].Value; var day = fileNameMatches.Groups["day"].Value; var slug = fileNameMatches.Groups["slug"].Value.ToUrlSlug(); var date = DateTime.ParseExact(year + month + day, "yyyyMMdd", CultureInfo.InvariantCulture); var postHeader = new Post { FileName = file.Name, MarkdownHeader = rawSettings, Content = response.Body.AsString(), Settings = settings, Year = date.Year, Month = date.Month, Day = date.Day, Date = date, Url = slug }; postHeader.SetSnowSettings(snowSettings); postHeader.SetHeaderSettings(settings); return postHeader; }
public PostModule(IDocumentSession documentSession) : base("/posts") { DocumentSession = documentSession; Get["/"] = parameters => { var data = DocumentSession.Query<Post>(); return View["Index", data]; }; Get[Route.Root().AnyIntAtLeastOnce("id")] = parameters => { var model = DocumentSession.Load<Post>((int)parameters.id); return View["Edit", model]; }; Post[Route.Root().AnyIntAtLeastOnce("id")] = parameters => { var model = DocumentSession.Load<Post>((int)parameters.id); this.BindTo(model); DocumentSession.SaveChanges(); return Response.AsRedirect("/posts"); }; Get["/create"] = parameters => { var model = new Post(); return View["Create", model]; }; Post["/create"] = parameters => { var model = this.Bind<Post>(); DocumentSession.Store(model); DocumentSession.SaveChanges(); return Response.AsRedirect("/posts"); }; }
private static void ComposeDrafts(Post post, string output, Browser browserComposer) { try { var siteUrl = TestModule.Settings.SiteUrl; TestModule.Data = post; TestModule.GeneratedUrl = siteUrl + post.Url; var result = browserComposer.Post("/compose"); result.ThrowIfNotSuccessful(post.FileName); var body = result.Body.AsString(); var outputFolder = Path.Combine(output, post.Url.Trim('/')); //Outputfolder is incorrect with leading slash on urlFormat var outputFile = Path.Combine(outputFolder, "index.html"); if (outputFolder.IsFileUrl()) { outputFile = outputFolder; outputFolder = Path.GetDirectoryName(outputFolder); } if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } File.WriteAllText(outputFile, body); } catch (Exception) { } }
private static void ComposeParsedFiles(Post post, string output, Browser browserComposer) { try { TestModule.Data = post; var result = browserComposer.Post("/compose"); result.ThrowIfNotSuccessful(post.FileName); var body = result.Body.AsString(); var outputFolder = Path.Combine(output, post.Url.Trim('/')); //Outputfolder is incorrect with leading slash on urlFormat if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } File.WriteAllText(Path.Combine(outputFolder, "index.html"), body); } catch (Exception ex) { Console.Write(ex); } }
private static string MonthAbbreviated(string url, Post post) { return url.Replace("MMM", post.Date.ToString("MMM")); }
private static string Day(string url, Post post) { return url.Replace("dd", post.Date.ToString("dd")); }
public ActionResult AddPost() { Post newPost = new Post(); return View(newPost); }
public async Task <dynamic> Post([FromBody] CreatePostRequest requestBody) { var userId = new ObjectId(this.GetCurrentUserId()); var userCollection = MongoWrapper.Database.GetCollection <Models.User>(nameof(Models.User)); var userFilterBuilder = new FilterDefinitionBuilder <Models.User>(); var userFilter = userFilterBuilder.And( GeneralUtils.NotDeactivated(userFilterBuilder), userFilterBuilder.Eq(u => u._id, userId) ); var userProjectionBuilder = new ProjectionDefinitionBuilder <Models.User>(); var userProjection = userProjectionBuilder .Include(m => m._id) .Include(m => m.FullName) .Include(m => m.Avatar) .Include(m => m.FileBytesLimit) .Include(m => m.FileBytesOccupied) .Include("_t"); var userTask = userCollection.FindAsync(userFilter, new FindOptions <Models.User> { Limit = 1, AllowPartialResults = false, Projection = userProjection }); Models.User user = null; List <(FileReference, Func <Task>)> files = new List <(FileReference, Func <Task>)>(); Task <(FileReference, Func <Task>)> fileReferenceTask = Task.FromResult <(FileReference, Func <Task>)>((null, () => Task.CompletedTask)); if (requestBody.Midias != null) { long totalSize = 0; foreach (MidiaRequest midiaRequest in requestBody.Midias) { if (midiaRequest.Id != null) { fileReferenceTask = GeneralUtils.GetFileForReferenceToken ( MongoWrapper, midiaRequest.Id, userId ); var(fileReference, expirer) = await fileReferenceTask; totalSize += fileReference.FileInfo.Size; files.Add((fileReference, expirer)); } } user = (await userTask).Single(); GeneralUtils.CheckSizeForUser(totalSize, user.FileBytesOccupied, user.FileBytesLimit); } var postCollection = MongoWrapper.Database.GetCollection <Models.Post>(nameof(Models.Post)); var creationDate = DateTime.UtcNow; var post = new Models.Post { _id = ObjectId.GenerateNewId(creationDate), Title = requestBody.Titulo, Text = requestBody.Descricao, Comments = new List <Models.Comment>(), Likes = new HashSet <ObjectId>(), FileReferences = files.Select(f => f.Item1).ToList(), Ip = HttpContext.Connection.RemoteIpAddress, Poster = user ?? (await userTask).Single(), Position = requestBody.Coordenada == null ? null : new GeoJsonPoint <GeoJson3DGeographicCoordinates>(requestBody.Coordenada.ToGeoJsonCoordinate()) }; await postCollection.InsertOneAsync(post); // Consume the file tokens files.AsParallel().ForAll(async f => await f.Item2()); return(new ResponseBody { Code = ResponseCode.GenericSuccess, Data = post._id, Message = "Postagem criada com sucesso!", Success = true }); }
public void SeedPostsWithComments(List<User> users, List<PostCategory> categories, List<Pet> pets, List<Region> regions) { for (int i = 0; i < 20; i++) { var post = new Post { Title = $"Post title {i}", Content = $"Some Post content... {i}", User = users[rand.Next(0, users.Count)], PostCategory = categories[rand.Next(0, categories.Count)], Pet = pets[rand.Next(0, pets.Count)], EventTime = DateTime.Now.AddDays(-(rand.Next(0, 15))), Region = regions[rand.Next(0, regions.Count)] }; var commentsCount = rand.Next(0, 10); for (int j = 0; j < commentsCount; j++) { var comment = new Comment { Content = $"Comment content {j}", User = users[rand.Next(0, users.Count)], Post = post }; post.Comments.Add(comment); } this.context.Posts.Add(post); } this.context.SaveChanges(); }
public void Should_parse_series() { var settings = new Dictionary<string, object>() { { "series", new Series { Current = 2, Name = "Series name", Parts = new SortedList<int, Series.Part> { { 1, new Series.Part { Name = "Part1", Url = "/url/to/part1" } }, { 2, new Series.Part { Name = "Part2", Url = "/url/to/part2" } }, } } } }; var post = new Post(); post.SetHeaderSettings(settings); var series = post.Series; Assert.Equal(2, series.Parts.Count); }
public void Should_parse_meta_description() { var settings = new Dictionary<string, object>() { {"metadescription", "meta description"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal("meta description", post.MetaDescription); }
private static string Author(string url, Post post) { return url.Replace("{author}", post.Author); }
private bool ShouldProcess(Post post) { return post.Published == Published.True; }
public void Published_should_support_private() { var settings = new Dictionary<string, object>() { {"published", "private"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal(Published.Private, post.Published); }
public void Published_should_default_to_true_when_unknown_value() { var settings = new Dictionary<string, object>() { {"published", ""} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal(Published.True, post.Published); }
private static string Category(string url, Post post) { return url.Replace("{category}", post.Categories.FirstOrDefault()); }
internal static bool ShouldProcess(Post post) { return post.Published == Published.True; }
public void Should_parse_title() { var settings = new Dictionary<string, object>() { {"title", "Post title"} }; var post = new Post(); post.SetHeaderSettings(settings); Assert.Equal("Post title", post.Title); }