Skip to content

fix(mocks-http): auto-prepend / to partial endpoint paths (#5838)#5874

Merged
thomhurst merged 2 commits into
mainfrom
fix/5838-httpclient-mock-auto-leading-slash
May 10, 2026
Merged

fix(mocks-http): auto-prepend / to partial endpoint paths (#5838)#5874
thomhurst merged 2 commits into
mainfrom
fix/5838-httpclient-mock-auto-leading-slash

Conversation

@thomhurst
Copy link
Copy Markdown
Owner

Summary

  • Normalize partial endpoint paths in RequestMatcher.Path() and PathStartsWith() so OnPost("my_endpoint") matches the same requests as OnPost("/my_endpoint").
  • Skip normalization for absolute URLs (containing ://) and regex patterns (PathMatches), preserving existing behaviour.
  • Adds 4 regression tests in MockHttpHandlerTests.

Why

Per #5838, the mismatch is silent and easy to overlook: requests resolve to RequestUri.PathAndQuery (always rooted with /), but the configured path is stored verbatim, so a partial endpoint never matches and falls through to the default 404 (or HttpRequestException when ThrowOnUnmatched).

Test plan

  • dotnet test --project TUnit.Mocks.Http.Tests --framework net10.0 — 45/45 passing (4 new).

Closes #5838

`Mock.HttpClient(...).Handler.OnPost("my_endpoint")` previously failed to
match because the request URI's `PathAndQuery` is `/my_endpoint`. Normalize
in `RequestMatcher.Path()` and `PathStartsWith()` so partial and rooted
forms are equivalent. Absolute URLs (containing `://`) and regex patterns
are left untouched.

Closes #5838
Copy link
Copy Markdown
Contributor

@claude claude Bot left a comment

Choose a reason for hiding this comment

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

Code Review

Overall: Solid, well-scoped fix. The implementation is clean and the test coverage is good. A few things worth flagging:


Coupling between and the absolute-URI fallback in

The NormalizePath helper skips absolute URLs (via Contains("://")), and separately, MatchesPath has a fallback that checks the full requestUri.ToString() when the path-only check fails:

// MatchesPath
if (_exactPath != null && !string.Equals(path, _exactPath, ...))
{
    var absUri = requestUri?.ToString() ?? "";
    if (!string.Equals(absUri, _exactPath, ...))
        return false;
}

These two mechanisms are co-conspirators — the :// guard in NormalizePath ensures absolute URLs reach MatchesPath unmodified so the fallback can do its job — but this contract is entirely implicit and not co-located. A future developer could update one without realising the other depends on it. A short comment like:

// Absolute URLs are left as-is; MatchesPath has a full-URI fallback for them.
if (value.Contains("://", StringComparison.Ordinal)) return value;

…would make the invariant explicit.


has no absolute-URI fallback (pre-existing, but worth noting)

_exactPath has the double-check against the raw URI string; _pathPrefix does not. This means PathStartsWith("https://my.domain/api") silently never matches, even though the symmetric Path("https://my.domain/foo") does work. This PR doesn't change that, but since you're touching this area it's worth a TODO comment or a follow-up issue to make both matchers consistent.


test name is slightly misleading

PathMatches uses a completely separate field (_pathPattern) and was never wired through NormalizePath, so the test is really just confirming that existing regex behaviour was not accidentally broken by the refactor. That's useful, but the test name implies the normalization was considered and rejected for regex — a comment like // PathMatches stores a compiled Regex, not a plain string, so NormalizePath is not involved would convey that intent.


now shows the normalized path

_exactPath and _pathPrefix are stored after normalization, so Describe() (used in failure messages) will render /my_endpoint even when the user wrote my_endpoint. That's arguably better UX (shows what's actually matched), but it's a subtle behaviour change worth being aware of. No action needed, just noting it.


The fix itself is correct, the NormalizePath helper is a clean abstraction, and the four regression tests cover the important boundaries. The main concern is the undocumented contract between NormalizePath and the absolute-URI fallback in MatchesPath — a one-line comment would significantly reduce future maintenance risk.

Copy link
Copy Markdown
Contributor

@claude claude Bot left a comment

Choose a reason for hiding this comment

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

Code Review

Overall: Solid, well-scoped fix. The implementation is clean and the test coverage is good. A few things worth flagging.

Coupling between NormalizePath and the absolute-URI fallback in MatchesPath

The NormalizePath helper skips absolute URLs (via Contains("://")), and separately, MatchesPath has a fallback that checks the full requestUri.ToString() when the path-only check fails. These two mechanisms are co-conspirators: the "://" guard ensures absolute URLs reach MatchesPath unmodified so the fallback can do its job, but this contract is entirely implicit and not co-located. A future developer could update one without realising the other depends on it.

A short comment on that branch in NormalizePath would make the invariant explicit:

// Absolute URLs are left as-is; MatchesPath has a full-URI fallback for them.
if (value.Contains("://", StringComparison.Ordinal)) return value;

PathStartsWith has no absolute-URI fallback (pre-existing, but worth noting)

_exactPath has the double-check against the raw URI string in MatchesPath; _pathPrefix does not. This means PathStartsWith("https://my.domain/api") silently never matches, even though the symmetric Path("https://my.domain/foo") does work. This PR does not introduce the asymmetry, but since you are touching this area it is a good opportunity for a TODO comment or a follow-up issue to make both matchers consistent.

MatchesByPath_RegexNotNormalized test name is slightly misleading

PathMatches uses a completely separate field (_pathPattern) and was never wired through NormalizePath, so the test is really just confirming that existing regex behaviour was not accidentally broken by the refactor. That is useful, but the test name implies the normalization was considered and rejected for regex. A comment explaining that PathMatches stores a compiled Regex so NormalizePath is not involved would convey that intent more clearly.

Describe() now shows the normalized path

_exactPath and _pathPrefix are stored after normalization, so Describe() (used in failure messages) will render "/my_endpoint" even when the user wrote "my_endpoint". That is arguably better UX since it shows what is actually being matched, but it is a subtle behaviour change worth being aware of. No action needed, just noting it.


The fix itself is correct, the NormalizePath helper is a clean abstraction, and the four regression tests cover the important boundaries. The main concern is the undocumented contract between NormalizePath and the absolute-URI fallback in MatchesPath: a one-line comment there would significantly reduce future maintenance risk.

@codacy-production
Copy link
Copy Markdown

codacy-production Bot commented May 10, 2026

Not up to standards ⛔

🔴 Issues 2 minor

Alerts:
⚠ 2 issues (≤ 0 issues of at least minor severity)

Results:
2 new issues

Category Results
CodeStyle 2 minor

View in Codacy

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

Copy link
Copy Markdown
Contributor

@claude claude Bot left a comment

Choose a reason for hiding this comment

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

Follow-up Review (commit d98a339)

The refactor commit makes two changes to NormalizePath:

  1. Merges the null/rooted guard into a single expression — clean, no concern.
  2. Replaces value.Contains("://", StringComparison.Ordinal) with Uri.TryCreate(value, UriKind.Absolute, out _) — this is a genuine improvement. Using the BCL's URI parser is more semantically correct than a string probe; it handles edge cases like urn: schemes, avoids potential false positives on path segments that coincidentally contain ://, and makes the intent explicit.

Outstanding from the previous review

Undocumented coupling between NormalizePath and MatchesPath's absolute-URI fallback — still not addressed. The invariant (absolute URIs must reach MatchesPath unnormalized so the requestUri.ToString() fallback can fire) is still implicit. A one-line comment on the Uri.TryCreate branch in NormalizePath would pay it off.

PathStartsWith has no absolute-URI fallback — pre-existing asymmetry, still not addressed. Calling PathStartsWith("https://my.domain/api") silently never matches because path is PathAndQuery (rooted) but there's no fallback to compare against requestUri.ToString(), unlike _exactPath. A TODO comment or a follow-up issue is sufficient.

MatchesByPath_RegexNotNormalized test name — still slightly misleading (see prior review). No action needed if the intent is just regression-guarding existing behaviour, but a brief inline comment would clarify.


New observation on Uri.TryCreate

One subtle edge case: Uri.TryCreate("localhost:8080/api", UriKind.Absolute, out _) returns true on .NET (the BCL treats localhost as a custom URI scheme). So a caller who writes OnGet("localhost:8080/api") will get the value stored as-is and silently never match — whereas the old Contains("://") check would at least have prepended / (also broken, but differently). This is an unlikely usage, not a blocker, but worth a comment or a note in the XML doc that path is expected to be a rooted path or a full http(s):// URL.


Overall the refactor is correct and the core bug fix is solid. The two outstanding actionable items from the first review (coupling comment, PathStartsWith asymmetry note) remain open.

@thomhurst thomhurst merged commit 84775b4 into main May 10, 2026
13 of 14 checks passed
@thomhurst thomhurst deleted the fix/5838-httpclient-mock-auto-leading-slash branch May 10, 2026 17:13
@claude claude Bot mentioned this pull request May 10, 2026
1 task
intellitect-bot pushed a commit to IntelliTect/EssentialCSharp.Web that referenced this pull request May 18, 2026
Updated [TUnit](https://github.com/thomhurst/TUnit) from 1.40.5 to
1.45.0.

<details>
<summary>Release notes</summary>

_Sourced from [TUnit's
releases](https://github.com/thomhurst/TUnit/releases)._

## 1.45.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.45.0 -->

## What's Changed
### Other Changes
* fix(generator): place CallerArgumentExpression before params in
[GenerateAssertion] emit by @​JohnVerheij in
thomhurst/TUnit#5940
* fix(sourcegen): drop covariant TActual when [GenerateAssertion] method
has its own type parameters by @​JohnVerheij in
thomhurst/TUnit#5935
* feat(assertions): add CancellationToken overload to WaitsFor and
Eventually by @​JohnVerheij in
thomhurst/TUnit#5938
* fix(html-report): extract categories using MTP Key=name convention by
@​thomhurst in thomhurst/TUnit#5946
* feat(html-report): rewrite as split-pane design template by
@​thomhurst in thomhurst/TUnit#5947
### Dependencies
* chore(deps): update microsoft.testing to 2.2.3 by @​thomhurst in
thomhurst/TUnit#5927
* chore(deps): update mstest to 4.2.3 by @​thomhurst in
thomhurst/TUnit#5928
* chore(deps): update tunit to 1.44.39 by @​thomhurst in
thomhurst/TUnit#5929
* chore(deps): update aspire to 13.3.3 by @​thomhurst in
thomhurst/TUnit#5933
* chore(deps): update dependency dompurify to v3.4.4 by @​thomhurst in
thomhurst/TUnit#5944
* chore(deps): update dependency qs to v6.15.2 by @​thomhurst in
thomhurst/TUnit#5941


**Full Changelog**:
thomhurst/TUnit@v1.44.39...v1.45.0

## 1.44.39

<!-- Release notes generated using configuration in .github/release.yml
at v1.44.39 -->

## What's Changed
### Other Changes
* fix(tests): retry trx read to dodge MTP post-exit flush race on
Windows by @​thomhurst in thomhurst/TUnit#5888
* fix(pipeline): timeout + retry InstallPlaywrightModule so a hung
download fails fast by @​thomhurst in
thomhurst/TUnit#5889
* fix(otel): require two consecutive idle windows in DrainAsync to catch
in-transit POSTs by @​thomhurst in
thomhurst/TUnit#5890
* test(assertions): drop flaky wall-clock upper bound on WaitsFor
timeout test by @​thomhurst in
thomhurst/TUnit#5886
* fix(sourcegen): drop spurious ')' in MethodAssertionGenerator
Task<bool> emit by @​JohnVerheij in
thomhurst/TUnit#5920
* fix(sourcegen): merge generic parameter lists in [AssertionExtension]
emit by @​JohnVerheij in thomhurst/TUnit#5921
* fix(aspnetcore): scope correlation processor per-factory to stop
cross-factory tag leak by @​thomhurst in
thomhurst/TUnit#5891
* Changed FSharp.Core version to 10.1.300 by @​licon4812 in
thomhurst/TUnit#5909
* feat(mocks): add Mock.HttpClientFactory() helper by @​thomhurst in
thomhurst/TUnit#5894
* Harden WaitsFor timeout test by @​thomhurst in
thomhurst/TUnit#5926
* fix(sourcegen): emit `default` literal for value-type assertion
parameters by @​JohnVerheij in
thomhurst/TUnit#5919
### Dependencies
* chore(deps): update dependency nunit to 4.6.0 by @​thomhurst in
thomhurst/TUnit#5826
* chore(deps): update tunit to 1.44.0 by @​thomhurst in
thomhurst/TUnit#5882
* chore(deps): update dependency mockolate to 3.2.0 by @​thomhurst in
thomhurst/TUnit#5892
* chore(deps): update dependency yaml to v2.9.0 by @​thomhurst in
thomhurst/TUnit#5887
* chore(deps): update dependency nuget.protocol to 7.6.0 by @​thomhurst
in thomhurst/TUnit#5897
* chore(deps): update dependency microsoft.entityframeworkcore to 10.0.8
by @​thomhurst in thomhurst/TUnit#5898
* chore(deps): update dependency microsoft.templateengine.authoring.cli
to v10.0.300 by @​thomhurst in
thomhurst/TUnit#5899
* chore(deps): update microsoft.extensions by @​thomhurst in
thomhurst/TUnit#5905
* chore(deps): update microsoft.aspnetcore to 10.0.8 by @​thomhurst in
thomhurst/TUnit#5904
* chore(deps): update dependency
microsoft.templateengine.authoring.templateverifier to 10.0.300 by
@​thomhurst in thomhurst/TUnit#5902
* chore(deps): update aspire to 13.3.1 by @​thomhurst in
thomhurst/TUnit#5900
* chore(deps): update dependency system.commandline to 2.0.8 by
@​thomhurst in thomhurst/TUnit#5903
* chore(deps): update dependency azure.storage.blobs to 12.28.0 by
@​thomhurst in thomhurst/TUnit#5910
* chore(deps): update dependency dotnet-sdk to v10.0.300 by @​thomhurst
in thomhurst/TUnit#5901
* chore(deps): update dependency stackexchange.redis to 2.13.1 by
@​thomhurst in thomhurst/TUnit#5906
* chore(deps): update aspire to 13.3.2 by @​thomhurst in
thomhurst/TUnit#5924
* chore(deps): bump mermaid from 11.12.2 to 11.15.0 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5893
* chore(deps): update dependency streamjsonrpc to 2.24.92 by @​thomhurst
in thomhurst/TUnit#5915
* chore(deps): update dependency dompurify to v3.4.3 by @​thomhurst in
thomhurst/TUnit#5913
* chore(deps): update microsoft.build to 18.6.3 by @​thomhurst in
thomhurst/TUnit#5914


**Full Changelog**:
thomhurst/TUnit@v1.44.0...v1.44.39

## 1.44.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.44.0 -->

## What's Changed
### Other Changes
* Generated mocks live in the same namespace as the mocked type by
@​thomhurst in thomhurst/TUnit#5870
* Show multi-step test spans in class timeline, align report ordering
with execution, and correlate linked OTel activities by @​Copilot in
thomhurst/TUnit#5847
* fix: don't leak RUC onto Should-style comparer overloads (#​5857) by
@​thomhurst in thomhurst/TUnit#5873
* Fix culture-dependent timestamp in HTML test report (#​5868) by
@​thomhurst in thomhurst/TUnit#5872
* fix(mocks-http): auto-prepend `/` to partial endpoint paths (#​5838)
by @​thomhurst in thomhurst/TUnit#5874
* Replace Report.ExpandClassTimeline with [ClassTimeline] attribute by
@​thomhurst in thomhurst/TUnit#5875
* feat(assertions): make ShouldAssertion<T> implement IAssertion
(#​5824) by @​thomhurst in thomhurst/TUnit#5876
* feat(mocks): support non-span ref struct out/ref params by @​thomhurst
in thomhurst/TUnit#5878
* fix(core): fill optional params when invoking MethodDataSource via
reflection by @​thomhurst in
thomhurst/TUnit#5880
* Mocks: structural fix for Mock<T> / mocked-member name collisions by
@​thomhurst in thomhurst/TUnit#5881
* chore(mocks): promote TUnit.Mocks packages to stable by @​thomhurst in
thomhurst/TUnit#5877
### Dependencies
* chore(deps): update tunit to 1.43.41 by @​thomhurst in
thomhurst/TUnit#5863
* chore(deps): update dependency tunit.assertions.fsharp to 1.43.41 by
@​thomhurst in thomhurst/TUnit#5865
* chore(deps): bump @​babel/plugin-transform-modules-systemjs from
7.28.5 to 7.29.4 in /docs by @​dependabot[bot] in
thomhurst/TUnit#5867
* chore(deps): bump fast-uri from 3.1.0 to 3.1.2 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5862


**Full Changelog**:
thomhurst/TUnit@v1.43.41...v1.44.0

## 1.43.41

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.41 -->

## What's Changed
### Other Changes
* feat(playwright): expose default Context/Launch options on settings by
@​thomhurst in thomhurst/TUnit#5861
* fix(hooks): resolve TestDiscovery hook context type by attribute kind,
not method name by @​thomhurst in
thomhurst/TUnit#5860
### Dependencies
* chore(deps): update tunit to 1.43.38 by @​thomhurst in
thomhurst/TUnit#5858


**Full Changelog**:
thomhurst/TUnit@v1.43.38...v1.43.41

## 1.43.38

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.38 -->

## What's Changed
### Other Changes
* feat(playwright): add TUnitPlaywrightSettings defaults by @​thomhurst
in thomhurst/TUnit#5859


**Full Changelog**:
thomhurst/TUnit@v1.43.37...v1.43.38

## 1.43.37

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.37 -->

## What's Changed
### Other Changes
* docs: clarify MethodDataSourceAttribute.Factory is
source-generator-managed by @​Copilot in
thomhurst/TUnit#5835
* fix(assertions): skip ref-struct members in IsEquivalentTo (#​5841) by
@​thomhurst in thomhurst/TUnit#5842
* feat(playwright): add composition-based fixtures by @​thomhurst in
thomhurst/TUnit#5840
### Dependencies
* chore(deps): update tunit to 1.43.11 by @​thomhurst in
thomhurst/TUnit#5821
* chore(deps): update dependency polyfill to 10.4.0 by @​thomhurst in
thomhurst/TUnit#5830
* chore(deps): update dependency polyfill to 10.4.0 by @​thomhurst in
thomhurst/TUnit#5829
* chore(deps): update react to ^19.2.6 by @​thomhurst in
thomhurst/TUnit#5839
* chore(deps): update dependency polyfill to 10.5.0 by @​thomhurst in
thomhurst/TUnit#5848
* chore(deps): update dependency polyfill to 10.5.0 by @​thomhurst in
thomhurst/TUnit#5849
* chore(deps): update aspire to 13.3.0 by @​thomhurst in
thomhurst/TUnit#5851
* chore(deps): update dependency brace-expansion to v5.0.6 by
@​thomhurst in thomhurst/TUnit#5853
* chore(deps): update dependency polyfill to 10.5.1 by @​thomhurst in
thomhurst/TUnit#5854
* chore(deps): update dependency polyfill to 10.5.1 by @​thomhurst in
thomhurst/TUnit#5855
* chore(deps): update verify to 31.16.3 by @​thomhurst in
thomhurst/TUnit#5856


**Full Changelog**:
thomhurst/TUnit@v1.43.11...v1.43.37

## 1.43.11

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.11 -->

## What's Changed
### Other Changes
* perf(engine): skip execution ledger for independent tests by
@​thomhurst in thomhurst/TUnit#5813
* perf(engine): skip tracked object graph rediscovery by @​thomhurst in
thomhurst/TUnit#5814
* fix: suppress XML doc warnings in generated sources by @​mvanhorn in
thomhurst/TUnit#5797
* Fix xUnit Throws migration docs by @​thomhurst in
thomhurst/TUnit#5819
* Fix Should optional overload generation by @​thomhurst in
thomhurst/TUnit#5820
### Dependencies
* chore(deps): update dependency mockolate to 3.1.0 by @​thomhurst in
thomhurst/TUnit#5811
* chore(deps): update tunit to 1.43.2 by @​thomhurst in
thomhurst/TUnit#5809
* chore(deps): update dependency nunit.analyzers to 4.13.0 by
@​thomhurst in thomhurst/TUnit#5815
* chore(deps): update dependency yaml to v2.8.4 by @​thomhurst in
thomhurst/TUnit#5812

## New Contributors
* @​mvanhorn made their first contribution in
thomhurst/TUnit#5797

**Full Changelog**:
thomhurst/TUnit@v1.43.2...v1.43.11

## 1.43.2

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.2 -->

## What's Changed
### Other Changes
* fix(assertions): emit auto-generated header in
MethodAssertionGenerator output by @​JohnVerheij in
thomhurst/TUnit#5796
* fix(engine): enforce runtime exclusion for global [NotInParallel]
(#​5800) by @​thomhurst in thomhurst/TUnit#5805
* feat(mocks): add Arg.AnyArgs() shortcut for setup/verify by
@​thomhurst in thomhurst/TUnit#5792
* fix(should): add specialized assertion sources by @​thomhurst in
thomhurst/TUnit#5806
### Dependencies
* chore(deps): update tunit to 1.41.0 by @​thomhurst in
thomhurst/TUnit#5789
* chore(deps): update microsoft.testing to 2.2.2 by @​thomhurst in
thomhurst/TUnit#5793
* chore(deps): update mstest to 4.2.2 by @​thomhurst in
thomhurst/TUnit#5794
* chore(deps): update docusaurus by @​thomhurst in
thomhurst/TUnit#5798
* chore(deps): update dependency dompurify to v3.4.2 by @​thomhurst in
thomhurst/TUnit#5799
* chore(deps): update dependency mockolate to v3 by @​thomhurst in
thomhurst/TUnit#5801


**Full Changelog**:
thomhurst/TUnit@v1.41.0...v1.43.2

## 1.41.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.41.0 -->

## TUnit Should() Assertions (beta)
This versions comes with a beta version of TUnit.Assertions.Should -
meaning that you can do:
`myCode.Should().BeEqualTo(fluentShouldSyntax);`

For more information see the docs:
https://tunit.dev/docs/assertions/should-syntax

## What's Changed
### Other Changes
* fix(reporters): unwrap TestFailedException for failure grouping by
@​thomhurst in thomhurst/TUnit#5776
* Fix item-at Satisfies source typing by @​thomhurst in
thomhurst/TUnit#5764
* ci(docs): add link-check automation and tighten Docusaurus strictness
by @​thomhurst in thomhurst/TUnit#5779
* feat: add TUnit.Assertions.Should package by @​thomhurst in
thomhurst/TUnit#5785
### Dependencies
* chore(deps): update tunit to 1.40.10 by @​thomhurst in
thomhurst/TUnit#5775
* chore(deps): update actions/cache action to v5 by @​thomhurst in
thomhurst/TUnit#5780
* chore(deps): update dependency microsoft.net.test.sdk to 18.5.1 by
@​thomhurst in thomhurst/TUnit#5784


**Full Changelog**:
thomhurst/TUnit@v1.40.10...v1.41.0

## 1.40.10

<!-- Release notes generated using configuration in .github/release.yml
at v1.40.10 -->

## What's Changed
### Other Changes
* refactor(opentelemetry): depend on TUnit.Core instead of umbrella
TUnit by @​thomhurst in thomhurst/TUnit#5774
### Dependencies
* chore(deps): update tunit to 1.40.5 by @​thomhurst in
thomhurst/TUnit#5769


**Full Changelog**:
thomhurst/TUnit@v1.40.5...v1.40.10

Commits viewable in [compare
view](thomhurst/TUnit@v1.40.5...v1.45.0).
</details>

Updated [TUnit.AspNetCore](https://github.com/thomhurst/TUnit) from
1.40.5 to 1.45.0.

<details>
<summary>Release notes</summary>

_Sourced from [TUnit.AspNetCore's
releases](https://github.com/thomhurst/TUnit/releases)._

## 1.45.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.45.0 -->

## What's Changed
### Other Changes
* fix(generator): place CallerArgumentExpression before params in
[GenerateAssertion] emit by @​JohnVerheij in
thomhurst/TUnit#5940
* fix(sourcegen): drop covariant TActual when [GenerateAssertion] method
has its own type parameters by @​JohnVerheij in
thomhurst/TUnit#5935
* feat(assertions): add CancellationToken overload to WaitsFor and
Eventually by @​JohnVerheij in
thomhurst/TUnit#5938
* fix(html-report): extract categories using MTP Key=name convention by
@​thomhurst in thomhurst/TUnit#5946
* feat(html-report): rewrite as split-pane design template by
@​thomhurst in thomhurst/TUnit#5947
### Dependencies
* chore(deps): update microsoft.testing to 2.2.3 by @​thomhurst in
thomhurst/TUnit#5927
* chore(deps): update mstest to 4.2.3 by @​thomhurst in
thomhurst/TUnit#5928
* chore(deps): update tunit to 1.44.39 by @​thomhurst in
thomhurst/TUnit#5929
* chore(deps): update aspire to 13.3.3 by @​thomhurst in
thomhurst/TUnit#5933
* chore(deps): update dependency dompurify to v3.4.4 by @​thomhurst in
thomhurst/TUnit#5944
* chore(deps): update dependency qs to v6.15.2 by @​thomhurst in
thomhurst/TUnit#5941


**Full Changelog**:
thomhurst/TUnit@v1.44.39...v1.45.0

## 1.44.39

<!-- Release notes generated using configuration in .github/release.yml
at v1.44.39 -->

## What's Changed
### Other Changes
* fix(tests): retry trx read to dodge MTP post-exit flush race on
Windows by @​thomhurst in thomhurst/TUnit#5888
* fix(pipeline): timeout + retry InstallPlaywrightModule so a hung
download fails fast by @​thomhurst in
thomhurst/TUnit#5889
* fix(otel): require two consecutive idle windows in DrainAsync to catch
in-transit POSTs by @​thomhurst in
thomhurst/TUnit#5890
* test(assertions): drop flaky wall-clock upper bound on WaitsFor
timeout test by @​thomhurst in
thomhurst/TUnit#5886
* fix(sourcegen): drop spurious ')' in MethodAssertionGenerator
Task<bool> emit by @​JohnVerheij in
thomhurst/TUnit#5920
* fix(sourcegen): merge generic parameter lists in [AssertionExtension]
emit by @​JohnVerheij in thomhurst/TUnit#5921
* fix(aspnetcore): scope correlation processor per-factory to stop
cross-factory tag leak by @​thomhurst in
thomhurst/TUnit#5891
* Changed FSharp.Core version to 10.1.300 by @​licon4812 in
thomhurst/TUnit#5909
* feat(mocks): add Mock.HttpClientFactory() helper by @​thomhurst in
thomhurst/TUnit#5894
* Harden WaitsFor timeout test by @​thomhurst in
thomhurst/TUnit#5926
* fix(sourcegen): emit `default` literal for value-type assertion
parameters by @​JohnVerheij in
thomhurst/TUnit#5919
### Dependencies
* chore(deps): update dependency nunit to 4.6.0 by @​thomhurst in
thomhurst/TUnit#5826
* chore(deps): update tunit to 1.44.0 by @​thomhurst in
thomhurst/TUnit#5882
* chore(deps): update dependency mockolate to 3.2.0 by @​thomhurst in
thomhurst/TUnit#5892
* chore(deps): update dependency yaml to v2.9.0 by @​thomhurst in
thomhurst/TUnit#5887
* chore(deps): update dependency nuget.protocol to 7.6.0 by @​thomhurst
in thomhurst/TUnit#5897
* chore(deps): update dependency microsoft.entityframeworkcore to 10.0.8
by @​thomhurst in thomhurst/TUnit#5898
* chore(deps): update dependency microsoft.templateengine.authoring.cli
to v10.0.300 by @​thomhurst in
thomhurst/TUnit#5899
* chore(deps): update microsoft.extensions by @​thomhurst in
thomhurst/TUnit#5905
* chore(deps): update microsoft.aspnetcore to 10.0.8 by @​thomhurst in
thomhurst/TUnit#5904
* chore(deps): update dependency
microsoft.templateengine.authoring.templateverifier to 10.0.300 by
@​thomhurst in thomhurst/TUnit#5902
* chore(deps): update aspire to 13.3.1 by @​thomhurst in
thomhurst/TUnit#5900
* chore(deps): update dependency system.commandline to 2.0.8 by
@​thomhurst in thomhurst/TUnit#5903
* chore(deps): update dependency azure.storage.blobs to 12.28.0 by
@​thomhurst in thomhurst/TUnit#5910
* chore(deps): update dependency dotnet-sdk to v10.0.300 by @​thomhurst
in thomhurst/TUnit#5901
* chore(deps): update dependency stackexchange.redis to 2.13.1 by
@​thomhurst in thomhurst/TUnit#5906
* chore(deps): update aspire to 13.3.2 by @​thomhurst in
thomhurst/TUnit#5924
* chore(deps): bump mermaid from 11.12.2 to 11.15.0 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5893
* chore(deps): update dependency streamjsonrpc to 2.24.92 by @​thomhurst
in thomhurst/TUnit#5915
* chore(deps): update dependency dompurify to v3.4.3 by @​thomhurst in
thomhurst/TUnit#5913
* chore(deps): update microsoft.build to 18.6.3 by @​thomhurst in
thomhurst/TUnit#5914


**Full Changelog**:
thomhurst/TUnit@v1.44.0...v1.44.39

## 1.44.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.44.0 -->

## What's Changed
### Other Changes
* Generated mocks live in the same namespace as the mocked type by
@​thomhurst in thomhurst/TUnit#5870
* Show multi-step test spans in class timeline, align report ordering
with execution, and correlate linked OTel activities by @​Copilot in
thomhurst/TUnit#5847
* fix: don't leak RUC onto Should-style comparer overloads (#​5857) by
@​thomhurst in thomhurst/TUnit#5873
* Fix culture-dependent timestamp in HTML test report (#​5868) by
@​thomhurst in thomhurst/TUnit#5872
* fix(mocks-http): auto-prepend `/` to partial endpoint paths (#​5838)
by @​thomhurst in thomhurst/TUnit#5874
* Replace Report.ExpandClassTimeline with [ClassTimeline] attribute by
@​thomhurst in thomhurst/TUnit#5875
* feat(assertions): make ShouldAssertion<T> implement IAssertion
(#​5824) by @​thomhurst in thomhurst/TUnit#5876
* feat(mocks): support non-span ref struct out/ref params by @​thomhurst
in thomhurst/TUnit#5878
* fix(core): fill optional params when invoking MethodDataSource via
reflection by @​thomhurst in
thomhurst/TUnit#5880
* Mocks: structural fix for Mock<T> / mocked-member name collisions by
@​thomhurst in thomhurst/TUnit#5881
* chore(mocks): promote TUnit.Mocks packages to stable by @​thomhurst in
thomhurst/TUnit#5877
### Dependencies
* chore(deps): update tunit to 1.43.41 by @​thomhurst in
thomhurst/TUnit#5863
* chore(deps): update dependency tunit.assertions.fsharp to 1.43.41 by
@​thomhurst in thomhurst/TUnit#5865
* chore(deps): bump @​babel/plugin-transform-modules-systemjs from
7.28.5 to 7.29.4 in /docs by @​dependabot[bot] in
thomhurst/TUnit#5867
* chore(deps): bump fast-uri from 3.1.0 to 3.1.2 in /docs by
@​dependabot[bot] in thomhurst/TUnit#5862


**Full Changelog**:
thomhurst/TUnit@v1.43.41...v1.44.0

## 1.43.41

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.41 -->

## What's Changed
### Other Changes
* feat(playwright): expose default Context/Launch options on settings by
@​thomhurst in thomhurst/TUnit#5861
* fix(hooks): resolve TestDiscovery hook context type by attribute kind,
not method name by @​thomhurst in
thomhurst/TUnit#5860
### Dependencies
* chore(deps): update tunit to 1.43.38 by @​thomhurst in
thomhurst/TUnit#5858


**Full Changelog**:
thomhurst/TUnit@v1.43.38...v1.43.41

## 1.43.38

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.38 -->

## What's Changed
### Other Changes
* feat(playwright): add TUnitPlaywrightSettings defaults by @​thomhurst
in thomhurst/TUnit#5859


**Full Changelog**:
thomhurst/TUnit@v1.43.37...v1.43.38

## 1.43.37

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.37 -->

## What's Changed
### Other Changes
* docs: clarify MethodDataSourceAttribute.Factory is
source-generator-managed by @​Copilot in
thomhurst/TUnit#5835
* fix(assertions): skip ref-struct members in IsEquivalentTo (#​5841) by
@​thomhurst in thomhurst/TUnit#5842
* feat(playwright): add composition-based fixtures by @​thomhurst in
thomhurst/TUnit#5840
### Dependencies
* chore(deps): update tunit to 1.43.11 by @​thomhurst in
thomhurst/TUnit#5821
* chore(deps): update dependency polyfill to 10.4.0 by @​thomhurst in
thomhurst/TUnit#5830
* chore(deps): update dependency polyfill to 10.4.0 by @​thomhurst in
thomhurst/TUnit#5829
* chore(deps): update react to ^19.2.6 by @​thomhurst in
thomhurst/TUnit#5839
* chore(deps): update dependency polyfill to 10.5.0 by @​thomhurst in
thomhurst/TUnit#5848
* chore(deps): update dependency polyfill to 10.5.0 by @​thomhurst in
thomhurst/TUnit#5849
* chore(deps): update aspire to 13.3.0 by @​thomhurst in
thomhurst/TUnit#5851
* chore(deps): update dependency brace-expansion to v5.0.6 by
@​thomhurst in thomhurst/TUnit#5853
* chore(deps): update dependency polyfill to 10.5.1 by @​thomhurst in
thomhurst/TUnit#5854
* chore(deps): update dependency polyfill to 10.5.1 by @​thomhurst in
thomhurst/TUnit#5855
* chore(deps): update verify to 31.16.3 by @​thomhurst in
thomhurst/TUnit#5856


**Full Changelog**:
thomhurst/TUnit@v1.43.11...v1.43.37

## 1.43.11

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.11 -->

## What's Changed
### Other Changes
* perf(engine): skip execution ledger for independent tests by
@​thomhurst in thomhurst/TUnit#5813
* perf(engine): skip tracked object graph rediscovery by @​thomhurst in
thomhurst/TUnit#5814
* fix: suppress XML doc warnings in generated sources by @​mvanhorn in
thomhurst/TUnit#5797
* Fix xUnit Throws migration docs by @​thomhurst in
thomhurst/TUnit#5819
* Fix Should optional overload generation by @​thomhurst in
thomhurst/TUnit#5820
### Dependencies
* chore(deps): update dependency mockolate to 3.1.0 by @​thomhurst in
thomhurst/TUnit#5811
* chore(deps): update tunit to 1.43.2 by @​thomhurst in
thomhurst/TUnit#5809
* chore(deps): update dependency nunit.analyzers to 4.13.0 by
@​thomhurst in thomhurst/TUnit#5815
* chore(deps): update dependency yaml to v2.8.4 by @​thomhurst in
thomhurst/TUnit#5812

## New Contributors
* @​mvanhorn made their first contribution in
thomhurst/TUnit#5797

**Full Changelog**:
thomhurst/TUnit@v1.43.2...v1.43.11

## 1.43.2

<!-- Release notes generated using configuration in .github/release.yml
at v1.43.2 -->

## What's Changed
### Other Changes
* fix(assertions): emit auto-generated header in
MethodAssertionGenerator output by @​JohnVerheij in
thomhurst/TUnit#5796
* fix(engine): enforce runtime exclusion for global [NotInParallel]
(#​5800) by @​thomhurst in thomhurst/TUnit#5805
* feat(mocks): add Arg.AnyArgs() shortcut for setup/verify by
@​thomhurst in thomhurst/TUnit#5792
* fix(should): add specialized assertion sources by @​thomhurst in
thomhurst/TUnit#5806
### Dependencies
* chore(deps): update tunit to 1.41.0 by @​thomhurst in
thomhurst/TUnit#5789
* chore(deps): update microsoft.testing to 2.2.2 by @​thomhurst in
thomhurst/TUnit#5793
* chore(deps): update mstest to 4.2.2 by @​thomhurst in
thomhurst/TUnit#5794
* chore(deps): update docusaurus by @​thomhurst in
thomhurst/TUnit#5798
* chore(deps): update dependency dompurify to v3.4.2 by @​thomhurst in
thomhurst/TUnit#5799
* chore(deps): update dependency mockolate to v3 by @​thomhurst in
thomhurst/TUnit#5801


**Full Changelog**:
thomhurst/TUnit@v1.41.0...v1.43.2

## 1.41.0

<!-- Release notes generated using configuration in .github/release.yml
at v1.41.0 -->

## TUnit Should() Assertions (beta)
This versions comes with a beta version of TUnit.Assertions.Should -
meaning that you can do:
`myCode.Should().BeEqualTo(fluentShouldSyntax);`

For more information see the docs:
https://tunit.dev/docs/assertions/should-syntax

## What's Changed
### Other Changes
* fix(reporters): unwrap TestFailedException for failure grouping by
@​thomhurst in thomhurst/TUnit#5776
* Fix item-at Satisfies source typing by @​thomhurst in
thomhurst/TUnit#5764
* ci(docs): add link-check automation and tighten Docusaurus strictness
by @​thomhurst in thomhurst/TUnit#5779
* feat: add TUnit.Assertions.Should package by @​thomhurst in
thomhurst/TUnit#5785
### Dependencies
* chore(deps): update tunit to 1.40.10 by @​thomhurst in
thomhurst/TUnit#5775
* chore(deps): update actions/cache action to v5 by @​thomhurst in
thomhurst/TUnit#5780
* chore(deps): update dependency microsoft.net.test.sdk to 18.5.1 by
@​thomhurst in thomhurst/TUnit#5784


**Full Changelog**:
thomhurst/TUnit@v1.40.10...v1.41.0

## 1.40.10

<!-- Release notes generated using configuration in .github/release.yml
at v1.40.10 -->

## What's Changed
### Other Changes
* refactor(opentelemetry): depend on TUnit.Core instead of umbrella
TUnit by @​thomhurst in thomhurst/TUnit#5774
### Dependencies
* chore(deps): update tunit to 1.40.5 by @​thomhurst in
thomhurst/TUnit#5769


**Full Changelog**:
thomhurst/TUnit@v1.40.5...v1.40.10

Commits viewable in [compare
view](thomhurst/TUnit@v1.40.5...v1.45.0).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: HttpClient Mock - Add / at the beginning if not given for partial endpoints

1 participant