Skip to content

Tests, API-backed feature gaps, and Fluent emoji everywhere - #3

Merged
Zingzy merged 5 commits into
mainfrom
feat/tests-and-gaps
Aug 29, 2026
Merged

Tests, API-backed feature gaps, and Fluent emoji everywhere#3
Zingzy merged 5 commits into
mainfrom
feat/tests-and-gaps

Conversation

@Zingzy

@Zingzy Zingzy commented Aug 28, 2026

Copy link
Copy Markdown
Member

Stacked on #1. Tests, the API-backed feature gaps, and Fluent emoji, plus a commit addressing the review of this branch.

Tests

JUnit, coroutines-test, and turbine join the catalog, CI runs the suite before building, and 33 tests cover the densest logic: URL and password validators, error mapping, widget config state round-trips, emoji codepoint detection, and the mock repository's filter/search/sort/paging contract.

Feature gaps the API already supported

  • Live alias availability. Typing an alias checks the server behind a 400ms debounce. The result is typed rather than boolean, so a reserved or malformed alias says so instead of claiming it is taken.
  • Last-click sort. The sort rail gains Active, mapping to the list endpoint's last-click order.
  • Device and UTM source dimensions. Two new breakdown cards, filterable from both the cards and the filter sheet, available as widget dimensions and widget filters, honored by the mock's share math.

Fluent emoji

The emoji alias renders as bundled Fluent artwork inside the create field, and widget labels mix Glance text runs with asset-backed images.

What the review of this branch caught

  • Emoji detection asked whether a codepoint was non-ASCII, which is true of the middle dot separating every widget label. Every label chased an asset that does not exist, on every render. Detection is now a codepoint-range test, misses are cached, and a label needing more than Glance's ten-child limit falls back to plain text rather than failing to render.
  • Slice labels are escaped before encoding: a newline in one silently dropped the record, which a test now proves.
  • The UTM dimension read UTMSOURCE in widget labels.
  • Analytics filter chips lagged the breakdown cards, so a device filter could be applied with no way to see or clear it.
  • Alias input resets on dismiss, so a surviving draft rechecks instead of holding a stale verdict.

Copilot AI lite review requested due to automatic review settings August 28, 2026 21:44

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 0ff42060-2d93-405f-9530-d5534162ac1f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@Zingzy
Zingzy force-pushed the feat/tests-and-gaps branch from 3731f08 to 18db13f Compare August 28, 2026 22:55
@Zingzy
Zingzy force-pushed the fix/security-hardening branch from b3c8047 to 14e1a79 Compare August 28, 2026 23:12
Zingzy added 5 commits August 29, 2026 04:42
JUnit, coroutines-test, and turbine enter the catalog; CI runs the
suite before building. Coverage starts where logic is densest: URL
and password validators, the suggestion recipe as a property test,
error mapping, widget config state round-trips, and the mock
repository's filter/search/sort/paging contract.
Typing an alias checks the server behind a 400ms debounce; a taken
alias reads "Already taken" under the field and holds the submit
button, with the server still the backstop. The sort rail gains
Active, the list endpoint's last-click order.
The click-dimensions the API has carried since #259 reach the app:
two new breakdown cards with device glyphs and source monograms,
filterable like the rest, available as widget dimensions and
widget filters, and honored by the mock's share math.
The create sheet's emoji alias renders as bundled Fluent artwork
in the field's prefix slot (a zero-width value keeps the prefix
visible while read-only). Widget micro-labels mix Glance text runs
with asset-backed images, so an emoji-scoped widget shows the real
artwork; config scope rows and the preview label follow.
Emoji detection tested the wrong thing: 'not ASCII' matched the middle
dot in every widget label, so each separator chased an asset that does
not exist, on every render. Detection is now a codepoint-range test,
misses are cached, and a label needing more than Glance's ten children
falls back to plain text instead of failing to render.

Slice labels are escaped, since a newline in one silently dropped the
record. The UTM dimension carries a display name rather than reading
UTMSOURCE, analytics filters offer the dimensions its cards can filter
by, and a taken alias is told apart from a reserved or invalid one.
Alias input resets on dismiss so a surviving draft rechecks.
@Zingzy
Zingzy force-pushed the feat/tests-and-gaps branch from 18db13f to 10728b1 Compare August 28, 2026 23:13
@Zingzy
Zingzy changed the base branch from fix/security-hardening to main August 29, 2026 09:03
@Zingzy
Zingzy merged commit 095c6d7 into main Aug 29, 2026
3 checks passed
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.

2 participants