Skip to content

Commit

Permalink
Show user not found in PM with deleted user update tests #321
Browse files Browse the repository at this point in the history
This took me hours because of ADHD and an inability to focus. So on the off chance that you happen to read this, as a consumer of open source software, please thank the contributors who make the stuff that you use the most. It ain't easy, and it's free to you.
  • Loading branch information
jeffputz committed Sep 9, 2023
1 parent 8bfe336 commit b2fc6be
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 6 deletions.
20 changes: 14 additions & 6 deletions src/PopForums.Mvc/Areas/Forums/Views/PrivateMessages/View.cshtml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@inject IUserRetrievalShim UserRetrievalShim
@using PopForums
@model PrivateMessageView
@{
var user = UserRetrievalShim.GetUser();
Expand Down Expand Up @@ -29,12 +30,19 @@
<div id="PostStream"></div>
</div>

<div>
<pf-pmform></pf-pmform>
<div>
@if (Model.State.IsUserNotFound)
{
<p>@Resources.UserNotFound</p>
}
else
{
<pf-pmform></pf-pmform>
}

<form asp-action="ArchivePM" asp-route-id="@Model.PrivateMessage.PMID">
<p><input type="submit" value="@PopForums.Resources.Archive" class="btn btn-primary" /></p>
</form>
</div>
<form asp-action="ArchivePM" asp-route-id="@Model.PrivateMessage.PMID">
<p><input type="submit" value="@PopForums.Resources.Archive" class="btn btn-primary"/></p>
</form>
</div>

</div>
11 changes: 11 additions & 0 deletions src/PopForums.Sql/Repositories/PrivateMessageRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,4 +178,15 @@ await _sqlObjectFactory.GetConnection().UsingAsync(connection =>
pmPostID = connection.QueryFirstOrDefaultAsync<int?>("SELECT TOP 1 PMPostID FROM pf_PrivateMessagePost WHERE PostTime > @lastReadTime AND PMID = @pmID ORDER BY PostTime", new { lastReadTime, pmID }));
return await pmPostID;
}

public async Task<bool> IsUserNotFound(int pmID)
{
Task<int> pmUserCount = null;
await _sqlObjectFactory.GetConnection().UsingAsync(connection =>
pmUserCount = connection.ExecuteScalarAsync<int>("SELECT COUNT(*) FROM pf_PrivateMessageUser WHERE PMID = @pmID", new { pmID }));
Task<int> pmUserMessageCount = null;
await _sqlObjectFactory.GetConnection().UsingAsync(connection =>
pmUserMessageCount = connection.ExecuteScalarAsync<int>("SELECT COUNT(DISTINCT UserID) FROM pf_PrivateMessagePost WHERE PMID = @pmID", new { pmID }));
return pmUserCount.Result != pmUserMessageCount.Result;
}
}
112 changes: 112 additions & 0 deletions src/PopForums.Test/Composers/PrivateMessageStateComposerTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
using System.Text.Json;
using PopForums.Composers;

namespace PopForums.Test.Composers;

public class PrivateMessageStateComposerTests
{
protected PrivateMessageStateComposer GetComposer()
{
_privateMessageService = Substitute.For<IPrivateMessageService>();
return new PrivateMessageStateComposer(_privateMessageService);
}

private IPrivateMessageService _privateMessageService;

public class GetState : PrivateMessageStateComposerTests
{
[Fact]
public async Task MessagesMappedWithBuffer()
{
var composer = GetComposer();
var pm = new PrivateMessage { LastViewDate = DateTime.UtcNow, PMID = 123 };
var posts = new List<PrivateMessagePost>();
var post1 = new PrivateMessagePost{ PMID = pm.PMID, UserID = 2, Name = "Jeff", PostTime = new DateTime(2020,1,1), FullText = "post1", PMPostID = 1};
var post2 = new PrivateMessagePost{ PMID = pm.PMID, UserID = 3, Name = "Diana", PostTime = new DateTime(2021,1,1), FullText = "post2", PMPostID = 2};
var post3 = new PrivateMessagePost{ PMID = pm.PMID, UserID = 4, Name = "Simon", PostTime = new DateTime(2022,1,1), FullText = "post3", PMPostID = 3};
posts.Add(post1);
posts.Add(post2);
_privateMessageService.GetMostRecentPosts(pm.PMID, pm.LastViewDate).Returns(posts);
_privateMessageService.GetPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost> { post3 });

var state = await composer.GetState(pm);

Assert.Equal(post3.UserID, state.Messages[0].UserID);
Assert.Equal(post3.Name, state.Messages[0].Name);
Assert.Equal(post3.PostTime.ToString("o"), state.Messages[0].PostTime);
Assert.Equal(post3.FullText, state.Messages[0].FullText);
Assert.Equal(post3.PMPostID, state.Messages[0].PMPostID);

Assert.Equal(post1.UserID, state.Messages[1].UserID);
Assert.Equal(post1.Name, state.Messages[1].Name);
Assert.Equal(post1.PostTime.ToString("o"), state.Messages[1].PostTime);
Assert.Equal(post1.FullText, state.Messages[1].FullText);
Assert.Equal(post1.PMPostID, state.Messages[1].PMPostID);

Assert.Equal(post2.UserID, state.Messages[2].UserID);
Assert.Equal(post2.Name, state.Messages[2].Name);
Assert.Equal(post2.PostTime.ToString("o"), state.Messages[2].PostTime);
Assert.Equal(post2.FullText, state.Messages[2].FullText);
Assert.Equal(post2.PMPostID, state.Messages[2].PMPostID);
}

[Fact]
public async Task NewestPostIDSet()
{
var composer = GetComposer();
var pm = new PrivateMessage { LastViewDate = DateTime.UtcNow, PMID = 123 };
var posts = new List<PrivateMessagePost>();
var post1 = new PrivateMessagePost{ PMID = pm.PMID };
var post2 = new PrivateMessagePost{ PMID = pm.PMID };
var post3 = new PrivateMessagePost{ PMID = pm.PMID };
posts.Add(post1);
posts.Add(post2);
_privateMessageService.GetMostRecentPosts(pm.PMID, pm.LastViewDate).Returns(posts);
_privateMessageService.GetPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost> { post3 });

var state = await composer.GetState(pm);

Assert.Equal(post1.PMPostID, state.NewestPostID);
}

[Fact]
public async Task PMIDSet()
{
var composer = GetComposer();
var pm = new PrivateMessage { LastViewDate = DateTime.UtcNow, PMID = 123 };
_privateMessageService.GetMostRecentPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost>());
_privateMessageService.GetPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost>());

var state = await composer.GetState(pm);

Assert.Equal(pm.PMID, state.PmID);
}

[Fact]
public async Task PMUsersJsonSet()
{
var composer = GetComposer();
var pm = new PrivateMessage { LastViewDate = DateTime.UtcNow, PMID = 123, Users = new JsonElement()};
_privateMessageService.GetMostRecentPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost>());
_privateMessageService.GetPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost>());

var state = await composer.GetState(pm);

Assert.Equal(pm.Users, state.Users);
}

[Fact]
public async Task IsUserNotFoundSet()
{
var composer = GetComposer();
var pm = new PrivateMessage { LastViewDate = DateTime.UtcNow, PMID = 123, Users = new JsonElement()};
_privateMessageService.GetMostRecentPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost>());
_privateMessageService.GetPosts(pm.PMID, pm.LastViewDate).Returns(new List<PrivateMessagePost>());
_privateMessageService.IsUserNotFound(pm.PMID).Returns(true);

var state = await composer.GetState(pm);

Assert.True(state.IsUserNotFound);
}
}
}
2 changes: 2 additions & 0 deletions src/PopForums/Composers/PrivateMessageStateComposer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public async Task<PrivateMessageState> GetState(PrivateMessage pm)
var clientMessages = ClientPrivateMessagePost.MapForClient(messages);
state.Messages = clientMessages;
state.Users = pm.Users;
var isUserNotFound = await _privateMessageService.IsUserNotFound(pm.PMID);
state.IsUserNotFound = isUserNotFound;
return state;
}
}
1 change: 1 addition & 0 deletions src/PopForums/Models/PrivateMessageState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ public class PrivateMessageState
public JsonElement Users { get; set; }
public ClientPrivateMessagePost[] Messages { get; set; }
public int? NewestPostID { get; set; }
public bool IsUserNotFound { get; set; }
}
1 change: 1 addition & 0 deletions src/PopForums/Repositories/IPrivateMessageRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ public interface IPrivateMessageRepository
Task UpdateLastPostTime(int pmID, DateTime lastPostTime);
Task<int> GetExistingFromIDs(List<int> ids);
Task<int?> GetFirstUnreadPostID(int pmID, DateTime lastReadTime);
Task<bool> IsUserNotFound(int pmID);
}
6 changes: 6 additions & 0 deletions src/PopForums/Services/PrivateMessageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public interface IPrivateMessageService
Task Archive(User user, PrivateMessage pm);
Task Unarchive(User user, PrivateMessage pm);
Task<int?> GetFirstUnreadPostID(int pmID, DateTime lastViewDate);
Task<bool> IsUserNotFound(int pmID);
}

public class PrivateMessageService : IPrivateMessageService
Expand Down Expand Up @@ -171,4 +172,9 @@ public async Task Unarchive(User user, PrivateMessage pm)
{
return await _privateMessageRepository.GetFirstUnreadPostID(pmID, lastViewDate);
}

public async Task<bool> IsUserNotFound(int pmID)
{
return await _privateMessageRepository.IsUserNotFound(pmID);
}
}

0 comments on commit b2fc6be

Please sign in to comment.