diff --git a/website/MyWebApp.Tests/AdminBlockTemplateControllerTests.cs b/website/MyWebApp.Tests/AdminBlockTemplateControllerTests.cs new file mode 100644 index 0000000..46f18a6 --- /dev/null +++ b/website/MyWebApp.Tests/AdminBlockTemplateControllerTests.cs @@ -0,0 +1,70 @@ +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; +using Microsoft.AspNetCore.Mvc; +using MyWebApp.Controllers; +using MyWebApp.Data; +using MyWebApp.Models; +using MyWebApp.Services; +using System.Collections.Generic; +using System.Threading.Tasks; +using Xunit; + +public class AdminBlockTemplateControllerTests +{ + private static (AdminBlockTemplateController controller, ApplicationDbContext ctx, SqliteConnection conn) Create() + { + var conn = new SqliteConnection("DataSource=:memory:"); + conn.Open(); + var options = new DbContextOptionsBuilder() + .UseSqlite(conn) + .Options; + var ctx = new ApplicationDbContext(options); + ctx.Database.EnsureCreated(); + var sanitizer = new HtmlSanitizerService(); + var controller = new AdminBlockTemplateController(ctx, sanitizer); + return (controller, ctx, conn); + } + + [Fact] + public async Task AddToPage_InvalidReturnsViewWithSelections() + { + var tuple = Create(); + using var connection = tuple.conn; + var ctx = tuple.ctx; + var controller = tuple.controller; + ctx.BlockTemplates.Add(new BlockTemplate { Id = 1, Name = "b", Html = "x" }); + ctx.Pages.Add(new Page { Id = 1, Slug = "home", Title = "Home", Layout = "single-column" }); + ctx.Roles.Add(new Role { Id = 1, Name = "Admin" }); + ctx.SaveChanges(); + + var result = await controller.AddToPage(1, new List { 1 }, "", "Admin"); + var view = Assert.IsType(result); + Assert.False(controller.ModelState.IsValid); + var selected = Assert.IsType>(controller.ViewBag.SelectedPageIds); + Assert.Contains(1, selected); + Assert.Equal("", controller.ViewBag.SelectedZone as string); + Assert.Equal("Admin", controller.ViewBag.SelectedRole as string); + } + + [Fact] + public async Task Create_InvalidModelPreservesSelections() + { + var tuple = Create(); + using var connection = tuple.conn; + var ctx = tuple.ctx; + var controller = tuple.controller; + ctx.Pages.Add(new Page { Id = 1, Slug = "home", Title = "Home", Layout = "single-column" }); + ctx.Roles.Add(new Role { Id = 1, Name = "Admin" }); + ctx.SaveChanges(); + + var model = new BlockTemplate(); + controller.ModelState.AddModelError("Name", "required"); + var result = await controller.Create(model, new List { 1 }, "main", "Admin"); + var view = Assert.IsType(result); + Assert.False(controller.ModelState.IsValid); + var selected = Assert.IsType>(controller.ViewBag.SelectedPageIds); + Assert.Contains(1, selected); + Assert.Equal("main", controller.ViewBag.SelectedZone as string); + Assert.Equal("Admin", controller.ViewBag.SelectedRole as string); + } +} diff --git a/website/MyWebApp/Controllers/AdminBlockTemplateController.cs b/website/MyWebApp/Controllers/AdminBlockTemplateController.cs index d799225..34119a8 100644 --- a/website/MyWebApp/Controllers/AdminBlockTemplateController.cs +++ b/website/MyWebApp/Controllers/AdminBlockTemplateController.cs @@ -54,6 +54,9 @@ public async Task Create(BlockTemplate model, List? pageIds, if (!ModelState.IsValid) { await LoadPagesAsync(); + ViewBag.SelectedPageIds = pageIds ?? new List(); + ViewBag.SelectedZone = zone; + ViewBag.SelectedRole = role; return View(model); } model.Html = _sanitizer.Sanitize(model.Html); @@ -80,6 +83,9 @@ public async Task Edit(BlockTemplate model, List? pageIds, s if (!ModelState.IsValid) { await LoadPagesAsync(); + ViewBag.SelectedPageIds = pageIds ?? new List(); + ViewBag.SelectedZone = zone; + ViewBag.SelectedRole = role; return View(model); } model.Html = _sanitizer.Sanitize(model.Html); @@ -175,6 +181,9 @@ public async Task AddToPage(int id) if (item == null) return NotFound(); await LoadPagesAsync(); ViewBag.BlockId = id; + ViewBag.SelectedPageIds = new List(); + ViewBag.SelectedZone = string.Empty; + ViewBag.SelectedRole = string.Empty; return View(); } @@ -188,6 +197,9 @@ public async Task AddToPage(int id, List pageIds, string zon { await LoadPagesAsync(); ViewBag.BlockId = id; + ViewBag.SelectedPageIds = pageIds ?? new List(); + ViewBag.SelectedZone = zone; + ViewBag.SelectedRole = role; ModelState.AddModelError("pageIds", "Page selection required"); return View(); } @@ -198,6 +210,9 @@ public async Task AddToPage(int id, List pageIds, string zon { await LoadPagesAsync(); ViewBag.BlockId = id; + ViewBag.SelectedPageIds = pageIds; + ViewBag.SelectedZone = zone; + ViewBag.SelectedRole = role; ModelState.AddModelError("zone", "Zone required"); return View(); } diff --git a/website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml b/website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml index 67a64ec..55180b3 100644 --- a/website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml +++ b/website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml @@ -1,4 +1,9 @@ @using MyWebApp.Models +@{ + var selectedPages = ViewBag.SelectedPageIds as List ?? new List(); + var selectedZone = ViewBag.SelectedZone as string ?? string.Empty; + var selectedRole = ViewBag.SelectedRole as string ?? string.Empty; +} @{ ViewData["Title"] = "Add Block To Page"; Layout = "../Admin/_AdminLayout"; @@ -13,10 +18,10 @@
@@ -25,20 +30,20 @@
- +
diff --git a/website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml b/website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml index 75acbb0..6e6c408 100644 --- a/website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml +++ b/website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml @@ -1,14 +1,19 @@ @using MyWebApp.Models +@{ + var selectedPages = ViewBag.SelectedPageIds as List ?? new List(); + var selectedZone = ViewBag.SelectedZone as string ?? string.Empty; + var selectedRole = ViewBag.SelectedRole as string ?? string.Empty; +}

Page Assignment

@@ -17,17 +22,17 @@