Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions website/MyWebApp.Tests/AdminBlockTemplateControllerTests.cs
Original file line number Diff line number Diff line change
@@ -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<ApplicationDbContext>()
.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<int> { 1 }, "", "Admin");
var view = Assert.IsType<ViewResult>(result);
Assert.False(controller.ModelState.IsValid);
var selected = Assert.IsType<List<int>>(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<int> { 1 }, "main", "Admin");
var view = Assert.IsType<ViewResult>(result);
Assert.False(controller.ModelState.IsValid);
var selected = Assert.IsType<List<int>>(controller.ViewBag.SelectedPageIds);
Assert.Contains(1, selected);
Assert.Equal("main", controller.ViewBag.SelectedZone as string);
Assert.Equal("Admin", controller.ViewBag.SelectedRole as string);
}
}
15 changes: 15 additions & 0 deletions website/MyWebApp/Controllers/AdminBlockTemplateController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ public async Task<IActionResult> Create(BlockTemplate model, List<int>? pageIds,
if (!ModelState.IsValid)
{
await LoadPagesAsync();
ViewBag.SelectedPageIds = pageIds ?? new List<int>();
ViewBag.SelectedZone = zone;
ViewBag.SelectedRole = role;
return View(model);
}
model.Html = _sanitizer.Sanitize(model.Html);
Expand All @@ -80,6 +83,9 @@ public async Task<IActionResult> Edit(BlockTemplate model, List<int>? pageIds, s
if (!ModelState.IsValid)
{
await LoadPagesAsync();
ViewBag.SelectedPageIds = pageIds ?? new List<int>();
ViewBag.SelectedZone = zone;
ViewBag.SelectedRole = role;
return View(model);
}
model.Html = _sanitizer.Sanitize(model.Html);
Expand Down Expand Up @@ -175,6 +181,9 @@ public async Task<IActionResult> AddToPage(int id)
if (item == null) return NotFound();
await LoadPagesAsync();
ViewBag.BlockId = id;
ViewBag.SelectedPageIds = new List<int>();
ViewBag.SelectedZone = string.Empty;
ViewBag.SelectedRole = string.Empty;
return View();
}

Expand All @@ -188,6 +197,9 @@ public async Task<IActionResult> AddToPage(int id, List<int> pageIds, string zon
{
await LoadPagesAsync();
ViewBag.BlockId = id;
ViewBag.SelectedPageIds = pageIds ?? new List<int>();
ViewBag.SelectedZone = zone;
ViewBag.SelectedRole = role;
ModelState.AddModelError("pageIds", "Page selection required");
return View();
}
Expand All @@ -198,6 +210,9 @@ public async Task<IActionResult> AddToPage(int id, List<int> pageIds, string zon
{
await LoadPagesAsync();
ViewBag.BlockId = id;
ViewBag.SelectedPageIds = pageIds;
ViewBag.SelectedZone = zone;
ViewBag.SelectedRole = role;
ModelState.AddModelError("zone", "Zone required");
return View();
}
Expand Down
19 changes: 12 additions & 7 deletions website/MyWebApp/Views/AdminBlockTemplate/AddToPage.cshtml
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
@using MyWebApp.Models
@{
var selectedPages = ViewBag.SelectedPageIds as List<int> ?? new List<int>();
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";
Expand All @@ -13,10 +18,10 @@
<div>
<label>Assign To Pages</label>
<select id="page-select" name="pageIds" multiple size="5">
<option value="0">All Pages</option>
<option value="0" selected="@(selectedPages.Contains(0))">All Pages</option>
@foreach (var p in ViewBag.Pages as List<Page>)
{
<option value="@p.Id">@p.Slug</option>
<option value="@p.Id" selected="@(selectedPages.Contains(p.Id))">@p.Slug</option>
}
</select>
</div>
Expand All @@ -25,20 +30,20 @@
<select id="zone-select" name="zone">
@foreach (var z in ViewBag.Zones as List<string>)
{
<option value="@z">@z</option>
<option value="@z" selected="@(selectedZone == z)">@z</option>
}
</select>
</div>
<div>
<label>Role</label>

<select name="role">
<option value="">(none)</option>
<option value="" selected="@(string.IsNullOrEmpty(selectedRole))">(none)</option>
@foreach (var r in ViewBag.Roles as List<Role>)
{
<option value="@r.Name">@r.Name</option>
<option value="@r.Name" selected="@(selectedRole == r.Name)">@r.Name</option>
}

</select>
</div>
<button type="submit">Add</button>
Expand Down
15 changes: 10 additions & 5 deletions website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
@using MyWebApp.Models
@{
var selectedPages = ViewBag.SelectedPageIds as List<int> ?? new List<int>();
var selectedZone = ViewBag.SelectedZone as string ?? string.Empty;
var selectedRole = ViewBag.SelectedRole as string ?? string.Empty;
}
<div class="block-assignment">
<h3>Page Assignment</h3>
<div>
<label>Pages</label>
<input type="text" id="page-display" readonly />
<select id="page-select" name="pageIds" multiple size="5">
<option value="0">All Pages</option>
<option value="0" selected="@(selectedPages.Contains(0))">All Pages</option>
@foreach (var p in ViewBag.Pages as List<Page>)

Check warning on line 14 in website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.

Check warning on line 14 in website/MyWebApp/Views/AdminBlockTemplate/_PageAssignment.cshtml

View workflow job for this annotation

GitHub Actions / build

Dereference of a possibly null reference.
{
<option value="@p.Id">@p.Slug</option>
<option value="@p.Id" selected="@(selectedPages.Contains(p.Id))">@p.Slug</option>
}
</select>
</div>
Expand All @@ -17,17 +22,17 @@
<select id="zone-select" name="zone">
@foreach (var z in ViewBag.Zones as List<string>)
{
<option value="@z">@z</option>
<option value="@z" selected="@(selectedZone == z)">@z</option>
}
</select>
</div>
<div>
<label>Role</label>
<select name="role">
<option value="">(none)</option>
<option value="" selected="@(string.IsNullOrEmpty(selectedRole))">(none)</option>
@foreach (var r in ViewBag.Roles as List<Role>)
{
<option value="@r.Name">@r.Name</option>
<option value="@r.Name" selected="@(selectedRole == r.Name)">@r.Name</option>
}
</select>
</div>
Expand Down
Loading