From 9e724783d83afd346a36ac85a65edaf0b8615758 Mon Sep 17 00:00:00 2001 From: Levi Zitting Date: Sun, 4 Oct 2026 09:49:34 -0500 Subject: [PATCH] feat: add private member password reset journey --- SgfDevs.Tests/MemberPasswordResetTests.cs | 177 ++++++++++++++++++ .../MemberPasswordResetController.cs | 151 +++++++++++++++ SgfDevs/Program.cs | 6 +- SgfDevs/ViewModels/MemberPasswordResetDto.cs | 20 ++ member-bridge.md | 9 + 5 files changed, 361 insertions(+), 2 deletions(-) create mode 100644 SgfDevs.Tests/MemberPasswordResetTests.cs create mode 100644 SgfDevs/Controllers/MemberPasswordResetController.cs create mode 100644 SgfDevs/ViewModels/MemberPasswordResetDto.cs create mode 100644 member-bridge.md diff --git a/SgfDevs.Tests/MemberPasswordResetTests.cs b/SgfDevs.Tests/MemberPasswordResetTests.cs new file mode 100644 index 0000000..43cd302 --- /dev/null +++ b/SgfDevs.Tests/MemberPasswordResetTests.cs @@ -0,0 +1,177 @@ +#nullable enable + +using System.Net; +using System.Reflection; +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.WebUtilities; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using SGFDevs.Controllers; +using SGFDevs.Models; +using SGFDevs.ViewModels; +using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Core.Mail; +using Umbraco.Cms.Core.Models.Email; +using Umbraco.Cms.Core.Security; +using Umbraco.Cms.Web.Common.Security; +using Xunit; + +namespace SgfDevs.Tests; + +public class MemberPasswordResetTests +{ + [Fact] + public async Task ForgotIsGenericIncludingSendFailureAndEncodesCanonicalLinkAndName() + { + var f = new Fixture(); + var found = await f.Controller.ForgotPassword(new() { Email = "fictional@example.test" }); + var message = Assert.IsType(f.Message); + var body = Assert.IsType(message.Body); + Assert.DoesNotContain("