Skip to content

Commit 9a1df8f

Browse files
Arnab-Developerlinkdotnet
authored andcommitted
Show author name in read blog post page
1 parent c56f694 commit 9a1df8f

File tree

3 files changed

+79
-7
lines changed

3 files changed

+79
-7
lines changed

src/LinkDotNet.Blog.Web/Features/ShowBlogPost/ShowBlogPostPage.razor

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ else if (BlogPost is not null)
5353
</div>
5454
<span class="read-time"></span>
5555
<span class="me-2">@BlogPost.ReadingTimeInMinutes minute read</span>
56-
<div class="d-flex align-items-center">
56+
@if (AppConfiguration.Value.UseMultiAuthorMode)
57+
{
58+
<span class="me-2">@BlogPost.AuthorName</span>
59+
}
60+
<div class="d-flex align-items-center">
5761
<BookmarkButton IsBookmarked="isBookmarked" Bookmarked="BlogPostBookmarked"></BookmarkButton>
5862
</div>
5963
@if (BlogPost.Tags is not null && BlogPost.Tags.Any())

tests/LinkDotNet.Blog.IntegrationTests/Web/Features/ShowBlogPost/ShowBlogPostPageTests.cs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Threading.Tasks;
1+
using System.Threading.Tasks;
22
using Blazored.Toast.Services;
33
using LinkDotNet.Blog.Domain;
44
using LinkDotNet.Blog.Infrastructure;
@@ -138,17 +138,49 @@ public async Task ShortCodesShouldBeReplacedByTheirContent()
138138
cut.Find(".blogpost-content > p").TextContent.ShouldBe("This is a Content shortcode");
139139
}
140140

141-
private void RegisterComponents(BunitContext ctx, ILocalStorageService? localStorageService = null)
141+
[Fact]
142+
public async Task ShouldShowAuthorNameWhenUseMultiAuthorModeIsTrue()
143+
{
144+
using var ctx = new BunitContext();
145+
ctx.JSInterop.Mode = JSRuntimeMode.Loose;
146+
ctx.AddAuthorization();
147+
RegisterComponents(ctx, useMultiAuthorMode: true);
148+
var blogPost = new BlogPostBuilder().WithAuthorName("Test Author").IsPublished().Build();
149+
await Repository.StoreAsync(blogPost);
150+
151+
var cut = ctx.Render<ShowBlogPostPage>(
152+
p => p.Add(b => b.BlogPostId, blogPost.Id));
153+
154+
cut.FindAll("span:contains('Test Author')").ShouldHaveSingleItem();
155+
}
156+
157+
[Fact]
158+
public async Task ShouldNotShowAuthorNameWhenUseMultiAuthorModeIsFalse()
159+
{
160+
using var ctx = new BunitContext();
161+
ctx.JSInterop.Mode = JSRuntimeMode.Loose;
162+
ctx.AddAuthorization();
163+
RegisterComponents(ctx, useMultiAuthorMode: false);
164+
var blogPost = new BlogPostBuilder().WithAuthorName("Test Author").IsPublished().Build();
165+
await Repository.StoreAsync(blogPost);
166+
167+
var cut = ctx.Render<ShowBlogPostPage>(
168+
p => p.Add(b => b.BlogPostId, blogPost.Id));
169+
170+
cut.FindAll("span:contains('Test Author')").ShouldBeEmpty();
171+
}
172+
173+
private void RegisterComponents(BunitContext ctx, ILocalStorageService? localStorageService = null, bool useMultiAuthorMode = false)
142174
{
143175
ctx.Services.AddScoped(_ => Repository);
144176
ctx.Services.AddScoped(_ => localStorageService ?? Substitute.For<ILocalStorageService>());
145177
ctx.Services.AddScoped(_ => Substitute.For<IToastService>());
146178
ctx.Services.AddScoped(_ => Substitute.For<IUserRecordService>());
147-
ctx.Services.AddScoped(_ => Options.Create(new ApplicationConfigurationBuilder().Build()));
179+
ctx.Services.AddScoped(_ => Options.Create(new ApplicationConfigurationBuilder().WithUseMultiAuthorMode(useMultiAuthorMode).Build()));
148180
ctx.Services.AddScoped(_ => Substitute.For<IInstantJobRegistry>());
149181
var shortCodeRepository = Substitute.For<IRepository<ShortCode>>();
150182
shortCodeRepository.GetAllAsync().Returns(PagedList<ShortCode>.Empty);
151183
ctx.Services.AddScoped(_ => shortCodeRepository);
152184
ctx.Services.AddScoped(_ => Substitute.For<IBookmarkService>());
153185
}
154-
}
186+
}

tests/LinkDotNet.Blog.UnitTests/Web/Features/ShowBlogPost/ShowBlogPostPageTests.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,43 @@ public void ShouldSetCanoncialUrlOfOgDataWithoutSlug()
164164

165165
cut.FindComponent<OgData>().Instance.CanonicalRelativeUrl.ShouldBe("blogPost/1");
166166
}
167-
167+
168+
[Fact]
169+
public void ShouldShowAuthorNameWhenUseMultiAuthorModeIsTrue()
170+
{
171+
var repositoryMock = Substitute.For<IRepository<BlogPost>>();
172+
var blogPost = new BlogPostBuilder()
173+
.WithAuthorName("Test Author")
174+
.Build();
175+
blogPost.Id = "1";
176+
repositoryMock.GetByIdAsync("1").Returns(blogPost);
177+
Services.AddScoped(_ => repositoryMock);
178+
Services.AddScoped(_ => Options.Create(new ApplicationConfigurationBuilder().WithUseMultiAuthorMode(true).Build()));
179+
180+
var cut = Render<ShowBlogPostPage>(
181+
p => p.Add(s => s.BlogPostId, "1"));
182+
183+
cut.FindAll("span:contains('Test Author')").ShouldHaveSingleItem();
184+
}
185+
186+
[Fact]
187+
public void ShouldNotShowAuthorNameWhenUseMultiAuthorModeIsFalse()
188+
{
189+
var repositoryMock = Substitute.For<IRepository<BlogPost>>();
190+
var blogPost = new BlogPostBuilder()
191+
.WithAuthorName("Test Author")
192+
.Build();
193+
blogPost.Id = "1";
194+
repositoryMock.GetByIdAsync("1").Returns(blogPost);
195+
Services.AddScoped(_ => repositoryMock);
196+
Services.AddScoped(_ => Options.Create(new ApplicationConfigurationBuilder().WithUseMultiAuthorMode(false).Build()));
197+
198+
var cut = Render<ShowBlogPostPage>(
199+
p => p.Add(s => s.BlogPostId, "1"));
200+
201+
cut.FindAll("span:contains('Test Author')").ShouldBeEmpty();
202+
}
203+
168204
private class PageTitleStub : ComponentBase
169205
{
170206
[Parameter]
@@ -185,4 +221,4 @@ private class SimilarBlogPostSectionStub : ComponentBase
185221
[Parameter]
186222
public BlogPost BlogPost { get; set; } = default!;
187223
}
188-
}
224+
}

0 commit comments

Comments
 (0)