Skip to content

test(Web.Tests): migrate to xUnit v3 — headers, AAA, indentation (#190) - #191

Closed
mpaulosky wants to merge 12 commits into
mainfrom
squad/190-web-tests-xunit-v3
Closed

test(Web.Tests): migrate to xUnit v3 — headers, AAA, indentation (#190)#191
mpaulosky wants to merge 12 commits into
mainfrom
squad/190-web-tests-xunit-v3

Conversation

@mpaulosky

Copy link
Copy Markdown
Owner

Summary

Migrates tests/Web.Tests/ from xUnit v2 to xUnit v3 (issue #190), applying all squad testing conventions.

Closes #190

Working as Gimli (Tester)


Changes

Package migration (Web.Tests.csproj)

  • xunitxunit.v3 meta-package
  • Removed coverlet.msbuild (incompatible with v3 runner)
  • Retained coverlet.collector, xunit.runner.visualstudio
  • Added xunit.runner.json as <Content CopyToOutputDirectory="PreserveNewest"/>

New file

  • tests/Web.Tests/xunit.runner.json — parallelism settings matching Domain.Tests

File headers (11 files)

  • Fixed Unit.TestsWeb.Tests in Project Name field
  • ResultTests.cs: removed duplicate old-format 8-line header block

AAA pattern (9 files, ~77 test methods)

  • Added // Arrange, // Act, // Assert comments to all tests lacking them
  • Edge cases handled:
    • No-setup tests: // Arrange (none)
    • Exception-asserting tests: // Act & Assert combined block

Indentation (4 handler files)

  • GetBlogPostsHandlerTests.cs, CreateBlogPostHandlerTests.cs, DeleteBlogPostHandlerTests.cs, EditBlogPostHandlerTests.cs all had their entire class body at column 0
  • Fixed with a corrected brace-counting script (correct leading-} depth tracking)

Test results

Passed!  - Failed: 0, Passed: 127, Skipped: 0, Total: 127, Duration: 122 ms

Scope note

Issue #190 mentioned 23 CS files. Actual count is 17 files. All 17 were audited; the 6 files with correct headers and AAA patterns were left untouched.

mpaulosky and others added 12 commits April 24, 2026 08:45
Blog posts, README, and docs/index.html updated for v1.2.0. Reviewed and approved by Aragorn.
Fixes 3 review blockers identified in PR #126 review:

- docs/index.html: npm run css:watch → npm run tw:watch (matches root package.json)
- README.md + kickoff blog post: Aspire 13.2.2 → 13.2.3 (matches Directory.Packages.props)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Summary

Adds `workflow_dispatch` trigger to `squad-mark-released.yml` so the
Done → Released project board migration can be run manually.

## Problem

When v1.2.0 was published, `squad-mark-released.yml` did not fire —
likely because the release event and workflow landing on `main` had a
timing race. With no manual trigger, the only recovery path was direct
GraphQL mutations.

## Changes

- Add `workflow_dispatch: {}` trigger
- Update job `if` condition to always run on manual dispatch (skip the
pre-release/draft guard for `workflow_dispatch` events)
- Use `context.payload.release?.tag_name ?? 'manual dispatch'` to
prevent null-ref in the summary notice

## Testing

After merge to `dev` → `main`, the workflow will appear under **Actions
→ Squad Mark Released → Run workflow** for manual recovery use.

---
> ⚠️ This PR should be fast-tracked to `main` so `dev` and `main` stay
in sync.

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Boromir <boromir@squad.dev>
Closes #130

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closes #133

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Sprint 6: Code Quality

**Goal:** Eliminate analyzer warnings, enforce internal visibility on
Web feature types, expand test coverage, and migrate Unit.Tests into
Web.Tests.

---

## Merged Feature PRs

- Closes #137 — PR #144 — fix(quality): rename `ct` →
`cancellationToken` in all MediatR handlers
- Closes #138 — PR #145 — test: add unit tests for BlogPost, Result, and
ValidationBehavior (42 tests)
- Closes #139 — PR #146 — test: add unit tests for UserManagementHandler
(16 tests)
- Closes #140 — PR #147 — fix(quality): make Web feature types
`internal` (CA1515, ~28 types)
- Closes #141 — PR #148 — test: add unit tests for BlogPostMappings (22
tests)
- Closes #142 — PR #149 — fix(quality): add ConfigureAwait(false) and
specific exception catches
- Closes #143 — PR #150 — fix(quality): address Domain and
ServiceDefaults analyzer warnings
- Closes #151 — PR #152 — feat(tests): migrate Unit.Tests → Web.Tests
and remove Unit.Tests project

---

## Test Summary

- **80+ new tests** added across all PRs
- **105 Web.Tests passing** (0 failures)
- `DynamicProxyGenAssembly2` added to `InternalsVisibleTo` in Web.csproj
for NSubstitute support

## Notable Changes

- `Unit.Tests` project removed; all tests now live in `Web.Tests`
- ~28 Web feature types changed from `public` to `internal` (CA1515
compliance)
- All MediatR handler parameters renamed from `ct` to
`cancellationToken` for clarity
- `ConfigureAwait(false)` applied to all async calls in service layer
- Domain and ServiceDefaults analyzer warnings resolved

---

## Checklist

- [x] All sprint issues closed (#137#143, #151)
- [x] CI green (0 build errors)
- [x] 105 Web.Tests passing
- [x] Milestone at 100%

---------

Co-authored-by: Boromir <boromir@squad.dev>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closes milestone: Sprint 7 — xUnit v3 Pilot (Domain.Tests)

## Sprint Summary
- ✅ Added xUnit v3 packages (v3.2.2) to Directory.Packages.props
alongside xUnit v2
- ✅ Domain.Tests migrated to xUnit v3: 42/42 tests passing
- ✅ Zero source-level breaking changes required
- ✅ CI validation complete — xUnit v3 fully compatible
- ✅ ADR recorded with performance analysis (5–15% improvement projected)
- ✅ Retrospective template prepared for Phase 2 validation

## Issues Closed
- Closes #162
- Closes #163
- Closes #164
- Closes #165
- Closes #166
- Closes #167

## Checklist
- [x] All sprint issues closed
- [x] CI green
- [x] Milestone at 100%
- [x] All PRs merged to sprint branch

---------

Co-authored-by: Boromir <boromir@squad.dev>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
## Sprint 8 Retrospective — xUnit v3 Architecture.Tests Pilot

Closes #181

**Working as Aragorn (Lead Developer)**

---

## Summary

This PR delivers the Sprint 8 retrospective document for the xUnit v3
Architecture.Tests pilot. It captures what went well, areas for
improvement, key learnings, and recommendations for completing the xUnit
v3 rollout across the MyBlog test suite.

## Files Changed

- `docs/sprint-8-xunit-v3-pilot-retro.md` — Full retrospective document
- `.squad/agents/aragorn/history.md` — Aragorn's learnings from Sprint 8
appended

## Retrospective Highlights

### What Went Well
- Wave 1 PRs (#176, #177) merged with **zero rework**
- CI passed **immediately** after package update
- NetArchTest `[Fact]` attributes require **zero changes** for xUnit v3
— easiest migration surface in the test suite
- Wave dependency chain worked perfectly — 0 blocking issues between
waves
- Side effect: Boromir fixed a CI gap where `Domain.Tests` was missing
from `squad-preview.yml`

### Key Metrics
| Metric | Value |
|---|---|
| Sprint issues | 6 (#176#181) |
| Architecture.Tests passing | 11 tests @ 72ms |
| Domain.Tests passing | 42 tests |
| Combined passing | 53+ tests |
| Rework PRs | 0 |
| Blocking inter-wave issues | 0 |

### Key Decisions Referenced
- `boromir-xunit-v3-package-strategy.md` — meta-package pattern, CI gap
fix
- `gimli-xunit-v3-migration-pattern.md` — AAA comment pattern for
NetArchTest
- `aragorn-xunit-v3-rollout-strategy.md` (local inbox) — rollout
ordering, standardization

### Recommendations
1. **Blazor.Tests → Sprint 9** (bUnit has explicit xUnit v3 support)
2. **Unit.Tests → Sprint 9–10** (simpler migration surface)
3. **New test projects start with xUnit v3** — no more v2 projects
4. **Integration.Tests** requires a separate spike (IAsyncLifetime +
Docker concerns)
5. **Capture CI baseline metrics before migration** (Sprint 7 gap —
don't repeat)

---

## xUnit v3 Rollout Status

| Test Project | Status | Sprint |
|---|---|---|
| `tests/Domain.Tests` | ✅ Migrated | Sprint 7 |
| `tests/Architecture.Tests` | ✅ Migrated | Sprint 8 |
| `tests/Blazor.Tests` | 🔜 Recommended next | Sprint 9 |
| `tests/Unit.Tests` | 🔜 Planned | Sprint 9–10 |
| `tests/Integration.Tests` | ⚠️ Assess separately | TBD |

---------

Co-authored-by: Boromir <boromir@squad.dev>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…189)

## Problem
Sprint 6's migration of Unit.Tests to Web.Tests left 2 test files
orphaned:
- `tests/Unit.Tests/Data/BlogPostMappingsTests.cs` (~22 tests)
- `tests/Unit.Tests/Handlers/UserManagementHandlerTests.cs` (~16 tests)

These files were never compiled because Unit.Tests.csproj was deleted
during the migration. Result: ~38 test cases invisible to coverage
reporting.

**Current coverage:** 77.5% (threshold: 80%) — blocked from merge

## Solution
- Move 2 orphaned test files to Web.Tests
- Delete empty tests/Unit.Tests/ directory
- Restore 38 test cases to coverage measurement

## Verification
✅ Web.Tests compiles with moved files (0 errors)
✅ All 127 tests in Web.Tests pass

## Expected Outcome
Coverage restored to 80%+ and unblocks Sprint 9

---------

Co-authored-by: Boromir <boromir@squad.dev>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Aragorn gate: ✅ OPEN (xUnit v3 pattern proven via Sprint 7–8 pilots)
- Gimli plan: Issue #190, 127 tests across 3 phases (package → API → verify)
- Pippin docs: Session log created (not committed per .gitignore)
- Inbox: No new decisions this round

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ix indentation

- Upgrade xunit → xunit.v3 in Web.Tests.csproj
- Remove coverlet.msbuild (not used with v3); keep coverlet.collector
- Add xunit.runner.json with parallelism settings matching Domain.Tests
- Fix file headers: 'Unit.Tests' → 'Web.Tests' across all affected files
- Remove duplicate old-format header from ResultTests.cs
- Add AAA pattern (// Arrange, // Act, // Assert) to all test methods lacking them
- Fix indentation in 4 handler test files (entire class body was at col 0)
- All 127 tests pass

Closes #190

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ration

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings April 26, 2026 14:26
@github-actions github-actions Bot added the squad Squad triage inbox — Lead will assign to a member label Apr 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🏗️ PR Added to Squad Triage Queue

This PR has been labeled with squad and added to the triage queue.

Next steps:

  • The squad Lead will review and assign to an appropriate team member
  • A squad:member label will be added after triage

If you know which squad member should handle this, you can add the appropriate squad:member label yourself.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Migrates the tests/Web.Tests project to xUnit v3 (and aligns related test projects/docs/workflows) while applying squad testing conventions (headers, AAA comments, indentation) and updating supporting repo documentation.

Changes:

  • Migrated Web.Tests to xUnit v3 (xunit.v3), added xunit.runner.json, and removed coverlet.msbuild.
  • Added/expanded xUnit v3 support across Domain.Tests and Architecture.Tests (packages/config/tests), and removed the legacy Unit.Tests project from the solution.
  • Updated documentation + GitHub workflows to reflect the new testing layout and blog/README synchronization.

Reviewed changes

Copilot reviewed 90 out of 94 changed files in this pull request and generated 16 comments.

Show a summary per file
File Description
tests/Web.Tests/xunit.runner.json Adds xUnit runner config (parallelism, display options).
tests/Web.Tests/Web.Tests.csproj Swaps to xunit.v3, removes coverlet.msbuild, copies runner json.
tests/Web.Tests/Security/RoleClaimsHelperTests.cs Header project name corrected.
tests/Web.Tests/ResultTests.cs Header cleanup + AAA comment additions.
tests/Web.Tests/Handlers/UserManagementHandlerTests.cs New test coverage for UserManagement handler edge/error paths.
tests/Web.Tests/Handlers/GetBlogPostsHandlerTests.cs Indentation + AAA, adds cache exception test.
tests/Web.Tests/Handlers/EditBlogPostHandlerTests.cs Indentation + AAA, adds cache exception test.
tests/Web.Tests/Handlers/DeleteBlogPostHandlerTests.cs Indentation + AAA.
tests/Web.Tests/Handlers/CreateBlogPostHandlerTests.cs Indentation + AAA, adds “does not invalidate by id” test.
tests/Web.Tests/Features/BlogPosts/Commands/EditBlogPostCommandValidatorTests.cs Header normalization + AAA comments.
tests/Web.Tests/Features/BlogPosts/Commands/DeleteBlogPostCommandValidatorTests.cs Header normalization + AAA comments.
tests/Web.Tests/Features/BlogPosts/Commands/CreateBlogPostCommandValidatorTests.cs Header normalization + AAA comments.
tests/Web.Tests/Data/BlogPostMappingsTests.cs New mapping tests for ToDto() behavior.
tests/Web.Tests/BlogPostTests.cs AAA comments added.
tests/Web.Tests/Behaviors/ValidationBehaviorTests.cs AAA comments added.
tests/Web.Tests.Integration/Infrastructure/RedisFixture.cs Narrows fixture API visibility to internal helper.
tests/Unit.Tests/Unit.Tests.csproj Removes legacy Unit.Tests project.
tests/Unit.Tests/Handlers/GetBlogPostsHandlerTests.cs Removes old Unit.Tests handler tests.
tests/Unit.Tests/Handlers/GetBlogPostByIdHandlerTests.cs Removes old Unit.Tests handler tests.
tests/Unit.Tests/Handlers/EditBlogPostHandlerTests.cs Removes old Unit.Tests handler tests.
tests/Unit.Tests/Handlers/DeleteBlogPostHandlerTests.cs Removes old Unit.Tests handler tests.
tests/Unit.Tests/Handlers/CreateBlogPostHandlerTests.cs Removes old Unit.Tests handler tests.
tests/Unit.Tests/GlobalUsings.cs Removes Unit.Tests global usings.
tests/Domain.Tests/xunit.runner.json Adds xUnit runner config for Domain.Tests.
tests/Domain.Tests/Properties/AssemblyInfo.cs Adds CLS compliance attribute.
tests/Domain.Tests/GlobalUsings.cs Expands global usings for new Domain.Tests coverage.
tests/Domain.Tests/Entities/BlogPostTests.cs Adds BlogPost entity tests in Domain.Tests.
tests/Domain.Tests/Domain.Tests.csproj Migrates to xUnit v3 + adds needed packages and runner json.
tests/Domain.Tests/Behaviors/ValidationBehaviorTests.cs Adds ValidationBehavior unit tests in Domain.Tests.
tests/Domain.Tests/Abstractions/ResultTests.cs Adds Result abstraction tests in Domain.Tests.
tests/Architecture.Tests/xunit.runner.json Adds xUnit runner config for Architecture.Tests.
tests/Architecture.Tests/VsaLayerTests.cs AAA comments / minor refactor for clarity.
tests/Architecture.Tests/ThemeLayerTests.cs AAA comments.
tests/Architecture.Tests/DomainLayerTests.cs AAA comments + clearer assembly variables.
tests/Architecture.Tests/CachingLayerTests.cs AAA comments.
tests/Architecture.Tests/Architecture.Tests.csproj Migrates to xUnit v3 + adds runner json.
src/Web/Security/RoleClaimsHelper.cs Narrows helper visibility to internal.
src/Web/Properties/AssemblyInfo.cs Updates InternalsVisibleTo targets + adds CLS compliance.
src/Web/Infrastructure/Caching/IBlogPostCacheService.cs Narrows caching abstractions to internal.
src/Web/Infrastructure/Caching/CachingServiceExtensions.cs Narrows extension visibility to internal.
src/Web/Infrastructure/Caching/BlogPostCacheKeys.cs Narrows cache keys visibility to internal.
src/Web/Features/UserManagement/UserManagementHandler.cs Narrows handler visibility; improves cancellation/exception handling patterns.
src/Web/Features/UserManagement/RemoveRoleCommand.cs Narrows record visibility to internal.
src/Web/Features/UserManagement/GetUsersWithRolesQuery.cs Narrows query/DTO visibility to internal.
src/Web/Features/UserManagement/GetAvailableRolesQuery.cs Narrows query/DTO visibility to internal.
src/Web/Features/UserManagement/AssignRoleCommand.cs Narrows record visibility to internal.
src/Web/Features/BlogPosts/List/GetBlogPostsQuery.cs Narrows query visibility to internal.
src/Web/Features/BlogPosts/List/GetBlogPostsHandler.cs Narrows handler visibility; adds cancellation + broader exception handling.
src/Web/Features/BlogPosts/Edit/GetBlogPostByIdQuery.cs Narrows query visibility to internal.
src/Web/Features/BlogPosts/Edit/EditBlogPostHandler.cs Narrows handler visibility; adds cancellation + broader exception handling.
src/Web/Features/BlogPosts/Edit/EditBlogPostCommandValidator.cs Narrows validator visibility to internal.
src/Web/Features/BlogPosts/Edit/EditBlogPostCommand.cs Narrows command visibility to internal.
src/Web/Features/BlogPosts/Delete/DeleteBlogPostHandler.cs Narrows handler visibility; adds cancellation + broader exception handling.
src/Web/Features/BlogPosts/Delete/DeleteBlogPostCommandValidator.cs Narrows validator visibility to internal.
src/Web/Features/BlogPosts/Delete/DeleteBlogPostCommand.cs Narrows command visibility to internal.
src/Web/Features/BlogPosts/Create/CreateBlogPostHandler.cs Narrows handler visibility; adds cancellation + broader exception handling.
src/Web/Features/BlogPosts/Create/CreateBlogPostCommandValidator.cs Narrows validator visibility to internal.
src/Web/Features/BlogPosts/Create/CreateBlogPostCommand.cs Narrows command visibility to internal.
src/Web/Data/MongoDbBlogPostRepository.cs Narrows repository visibility to internal.
src/Web/Data/BlogPostDto.cs Narrows DTO visibility to internal.
src/ServiceDefaults/Properties/AssemblyInfo.cs Adds CLS compliance attribute.
src/ServiceDefaults/Extensions.cs Makes health endpoint filtering case-insensitive.
src/Domain/Properties/AssemblyInfo.cs Adds InternalsVisibleTo for Domain.Tests + CLS compliance.
src/Domain/Behaviors/ValidationBehavior.cs Adds null-guard for next delegate.
src/Domain/Abstractions/Result.cs Adds helper APIs and generic FromValue factory.
docs/sprint-8-xunit-v3-pilot-retro.md Adds Sprint 8 retrospective doc.
docs/sprint-7-xunit-v3-pilot-retro.md Adds Sprint 7 retrospective doc.
docs/index.html Updates GitHub Pages landing page content/structure.
docs/blog/index.md Adds blog index page to drive README sync.
docs/blog/2026-04-24-release-v1-2-0.md Adds blog post for v1.2.0 release.
docs/blog/2026-04-24-release-v1-1-0.md Adds blog post for v1.1.0 release.
docs/blog/2026-04-20-sprint-3-e2e-tests-ci-hardening.md Adds Sprint 3 blog post.
docs/blog/2026-04-20-sprint-2-cqrs-mediatr.md Adds Sprint 2 blog post.
docs/blog/2026-04-20-release-v1-0-0.md Adds v1.0.0 release blog post.
docs/blog/2026-04-18-myblog-project-kickoff.md Adds project kickoff blog post.
docs/adr/sprint8-architecture-tests-xunit-v3-rollout.md Adds ADR documenting Architecture.Tests xUnit v3 rollout.
docs/adr/sprint7-xunit-v3-migration.md Adds ADR documenting xUnit v3 pilot decision.
docs/SQUAD-COMMANDS.md Adds squad command reference doc.
README.md Updates README (badges, blog section, testing/projects).
MyBlog.slnx Removes Unit.Tests from solution.
Directory.Packages.props Adds xUnit v3 package versions centrally.
.squad/agents/pippin/history.md Updates agent history.
.squad/agents/gimli/history.md Updates agent history.
.squad/agents/boromir/history.md Updates agent history.
.squad/agents/aragorn/history.md Updates agent history.
.squad/agents/aragorn/charter.md Updates review sequence to include Codecov check.
.github/workflows/squad-test.yml Adds Domain.Tests job and updates summary/gating.
.github/workflows/squad-release.yml Updates release workflow test matrix (drops Unit.Tests, adds Domain/Web).
.github/workflows/squad-preview.yml Adds Domain.Tests to preview gate.
.github/workflows/squad-mark-released.yml Adds manual dispatch and improves release/manual behavior.
.github/workflows/squad-insider-release.yml Updates insider test matrix (drops Unit.Tests, adds Domain/Web).
.github/workflows/release-blog.yml Formatting tweaks for generated issue body.
.github/workflows/milestone-release-decision.yml Formatting fixes for generated comments/issue body.
.github/workflows/milestone-blog.yml Formatting fixes for generated issue body (markdown separators).

Comment thread docs/index.html
Comment on lines +250 to +257
├── tests/
│ ├── Unit.Tests/ # Domain entity + handler unit tests
│ ├── Architecture.Tests/ # Layer dependency enforcement
│ ├── Integration.Tests/ # Aspire integration tests
│ ├── AppHost.Tests/ # Aspire AppHost + E2E tests
│ ├── Web.Tests/ # Web layer tests
│ ├── Web.Tests.Bunit/ # Blazor component tests (bUnit)
│ └── Web.Tests.Integration/ # Web integration tests

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The docs site’s “Project Structure” block still lists tests/Unit.Tests/, but this PR deletes Unit.Tests and removes it from the solution. Please update the structure listing to avoid referencing a non-existent project/directory.

Copilot uses AI. Check for mistakes.
//Project Name : Web.Tests
//=======================================================

namespace Unit.Data;

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file is in tests/Web.Tests/Data, but the namespace is Unit.Data. Please rename the namespace to align with the Web test project (e.g., Web.Data or Web.Tests.Data) to avoid confusion and keep namespaces consistent with the folder/project.

Copilot uses AI. Check for mistakes.
public static Result<T> FromValue(T? value)
{
if (value is null)
return Fail("Value cannot be null.");

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Result.FromValue<T>(...) already exists and returns the error message "Provided value is null.". The newly added Result<T>.FromValue(...) duplicates that behavior but returns a different message ("Value cannot be null."), which creates inconsistent semantics depending on which API a caller uses. Consider removing the duplicate API or aligning the failure message with Result.FromValue for consistency.

Suggested change
return Fail("Value cannot be null.");
return Fail("Provided value is null.");

Copilot uses AI. Check for mistakes.
Comment thread docs/blog/index.md
Comment on lines +1 to +3
# MyBlog Development Blog

Welcome to the MyBlog technical blog! Here we document the project's evolution—from architecture decisions and feature releases to testing strategies and DevOps automation. Each post captures what we built, why it matters, and what's coming next.

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This markdown file is missing YAML front matter and starts with an H1. Repo markdown validators require front matter metadata and no H1 headings (content should start at ##). Please add the required front matter block and change the title to an H2 (or rely on post_title in front matter).

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +6
title: "Release: v1.1.0 — Blazor Theme System with TailwindCSS v4"
date: 2026-04-24
author: Bilbo
tags: [release, v1.1.0, blazor, tailwind, theme, testing, sprint-4]
summary: "v1.1.0 ships a complete theme system with light/dark/system modes, four color schemes, and reorganized test infrastructure."

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Front matter doesn’t match repo-required schema (expects fields like post_title, author1, post_slug, categories, ai_note, post_date, etc.). This file currently uses title/date/author. Update the YAML keys to the required set so markdown validation passes and metadata is consistent across docs.

Suggested change
title: "Release: v1.1.0 — Blazor Theme System with TailwindCSS v4"
date: 2026-04-24
author: Bilbo
tags: [release, v1.1.0, blazor, tailwind, theme, testing, sprint-4]
summary: "v1.1.0 ships a complete theme system with light/dark/system modes, four color schemes, and reorganized test infrastructure."
post_title: "Release: v1.1.0 — Blazor Theme System with TailwindCSS v4"
author1: Bilbo
post_slug: release-v1-1-0
microsoft_alias: ""
featured_image: ""
categories: [release]
tags: [release, v1.1.0, blazor, tailwind, theme, testing, sprint-4]
ai_note: "AI was not used in the creation of this post."
summary: "v1.1.0 ships a complete theme system with light/dark/system modes, four color schemes, and reorganized test infrastructure."
post_date: 2026-04-24

Copilot uses AI. Check for mistakes.
Comment on lines 180 to +185
client_secret = clientSecret,
audience = $"https://{domain}/api/v2/",
grant_type = "client_credentials"
}, ct);
}, cancellationToken).ConfigureAwait(false);
tokenResponse.EnsureSuccessStatusCode();
var tokenData = await tokenResponse.Content.ReadFromJsonAsync<TokenResponse>(ct);
var tokenData = await tokenResponse.Content.ReadFromJsonAsync<TokenResponse>(cancellationToken).ConfigureAwait(false);

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IHttpClientFactory doesn’t have a parameterless CreateClient() method (it requires a client name). This handler currently calls httpClientFactory.CreateClient() just above this block; please pass an explicit name (and configure it), otherwise this won’t compile against the standard interface.

Copilot uses AI. Check for mistakes.

using MyBlog.Web.Features.UserManagement;

namespace Unit.Handlers;

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test file lives under tests/Web.Tests, but the namespace is Unit.Handlers. That looks like leftover from the removed Unit.Tests project and makes discovery/organization confusing. Please rename the namespace to match the Web.Tests convention used by the other handler tests (e.g., Web.Handlers).

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +6
title: "Release: v1.2.0 — Redis Caching and L1/L2 Cache Strategy"
date: 2026-04-24
author: Bilbo
tags: [release, v1.2.0, redis, caching, aspire, sprint-5]
summary: "v1.2.0 introduces intelligent caching with Redis: L1 in-memory, L2 distributed, with automatic invalidation on mutations."

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Front matter doesn’t match repo-required schema (expects fields like post_title, author1, post_slug, categories, ai_note, post_date, etc.). This file currently uses title/date/author. Update the YAML keys to the required set so markdown validation passes and metadata is consistent across docs.

Suggested change
title: "Release: v1.2.0 — Redis Caching and L1/L2 Cache Strategy"
date: 2026-04-24
author: Bilbo
tags: [release, v1.2.0, redis, caching, aspire, sprint-5]
summary: "v1.2.0 introduces intelligent caching with Redis: L1 in-memory, L2 distributed, with automatic invalidation on mutations."
post_title: "Release: v1.2.0 — Redis Caching and L1/L2 Cache Strategy"
author1: Bilbo
post_slug: "release-v1-2-0-redis-caching-and-l1-l2-cache-strategy"
microsoft_alias: bilbo
featured_image: ""
categories: [release]
tags: [release, v1.2.0, redis, caching, aspire, sprint-5]
ai_note: "AI-assisted content."
summary: "v1.2.0 introduces intelligent caching with Redis: L1 in-memory, L2 distributed, with automatic invalidation on mutations."
post_date: 2026-04-24

Copilot uses AI. Check for mistakes.
Comment on lines +2 to +6
title: "Sprint 2: CQRS and MediatR Deep Dive"
date: 2026-04-20
author: Bilbo
tags: [cqrs, mediatr, testing, domain, sprint-2]
summary: "Sprint 2 establishes command-query separation and MediatR handlers for clean, testable domain logic."

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Front matter doesn’t match repo-required schema (expects fields like post_title, author1, post_slug, categories, ai_note, post_date, etc.). This file currently uses title/date/author. Update the YAML keys to the required set so markdown validation passes and metadata is consistent across docs.

Suggested change
title: "Sprint 2: CQRS and MediatR Deep Dive"
date: 2026-04-20
author: Bilbo
tags: [cqrs, mediatr, testing, domain, sprint-2]
summary: "Sprint 2 establishes command-query separation and MediatR handlers for clean, testable domain logic."
post_title: "Sprint 2: CQRS and MediatR Deep Dive"
author1: Bilbo
post_slug: "sprint-2-cqrs-mediatr"
microsoft_alias: bilbo
featured_image: ""
categories: [development]
tags: [cqrs, mediatr, testing, domain, sprint-2]
ai_note: "No AI assistance was used in the creation of this post."
summary: "Sprint 2 establishes command-query separation and MediatR handlers for clean, testable domain logic."
post_date: 2026-04-20

Copilot uses AI. Check for mistakes.
Comment thread README.md
Comment on lines +70 to +72
│ ├── Unit.Tests/ # Domain entity + handler unit tests
│ ├── Architecture.Tests/ # Layer dependency enforcement
│ ├── Integration.Tests/ # Aspire integration tests

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tests/Unit.Tests is referenced in the project structure, but this PR removes the Unit.Tests project from the repo/solution. Please update this section (and any other docs) to reflect the current test projects (e.g., Domain.Tests, Web.Tests, etc.) so readers don’t look for a deleted project.

Suggested change
│ ├── Unit.Tests/ # Domain entity + handler unit tests
│ ├── Architecture.Tests/ # Layer dependency enforcement
│ ├── Integration.Tests/ # Aspire integration tests
│ ├── Domain.Tests/ # Domain entity + handler unit tests
│ ├── Architecture.Tests/ # Layer dependency enforcement

Copilot uses AI. Check for mistakes.
@mpaulosky

Copy link
Copy Markdown
Owner Author

Closing due to incorrect base branch (targeting main instead of dev) and scope contamination. Will recreate with clean branch from dev targeting only Web.Tests xUnit v3 migration changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

squad Squad triage inbox — Lead will assign to a member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants