Add internal HttpClient constructor to CalDavClient + 12 tests
Details
Adds an internal constructor accepting HttpClient for test injection,
enabling comprehensive testing of the CalDAV protocol implementation.
Tests cover: calendar discovery (PROPFIND chain), well-known fallback,
non-calendar/non-VEVENT filtering, Apple color alpha stripping, event
fetching (REPORT), sync-collection with changed/deleted events, PUT
with ETag/conflict handling, and DELETE with 404 acceptance.
Refactor GeocodingService and RoutingService with HttpClient injection + tests
Details
Convert both services from static classes to instance classes with
internal HttpClient constructors for testability. Add InternalsVisibleTo
to Journal csproj. Update MapSectionEditor to use instance fields.
New tests (10 cases):
- GeocodingServiceTests: valid result, empty input, empty array response,
missing lat/lon, empty display name, URL parameter verification
- RoutingServiceTests: fewer than 2 waypoints, valid route response,
non-Ok code, empty routes array
Refactor ReaderService with HttpClient injection + add tests
Details
Add internal constructor accepting HttpClient to ReaderService for
testability, following the same pattern used by RssParserService and
other HTTP-dependent services. The public parameterless constructor
still delegates to the shared static HttpClient for production use.
Add 5 tests covering: readable article extraction, HTTP failure (404),
non-readable content, HTTP exception handling, and word count.
Fix GroupBlock alignment: render children via BlockWrapper's ChildBlocksHost
Details
The core issue: GroupBlock children were rendered inside the parent BlockWrapper's
content column (Grid column 2), which is offset right by the handle gutter
(~38px). Negative margins couldn't reliably break out of that layout.
Fix: BlockWrapper.UpdateChildBlocksBinding() now detects GroupBlock content and
binds its Children to ChildBlocksHost — the ItemsControl that sits OUTSIDE the
handle Grid, at full BlockWrapper width. Each child gets its own BlockWrapper
with handles, so text naturally aligns with the page title.
GroupBlockEditor now only renders the compact header (collapse toggle + label)
and add button. Children rendering is fully delegated to the parent BlockWrapper.
Collapse state toggles ChildBlocksHost visibility via FindParentBlockWrapper().
Fix GroupBlock children alignment: pull left past handle gutter
Details
Children ItemsControl gets Margin="-38,0,0,0" to compensate for the parent
BlockWrapper's handle gutter (focus accent 4px + handles 28px + 6px gap).
This shifts the group's content flush left to align with the page title.
Get notified about new releases