Skip to content

test(e2e): assert the /events end user talk schedule renders - #1395

Merged
mrbobbytables merged 1 commit into
mainfrom
quality/test-end-user-talk-schedule-e2e
Oct 13, 2026
Merged

mrbobbytables merged 1 commit into
mainfrom
quality/test-end-user-talk-schedule-e2e

Conversation

@hivecommons-hive

Copy link
Copy Markdown
Contributor

Test Improvement

Adds tests/e2e/end-user-talk-schedule.spec.js, the first end-to-end
assertions for the KubeCon NA 2026 end user talk schedule that
src/components/EndUserTalkSchedule/index.js renders into /events.

The component reports 100.00% lines and 100.00% regions in the browser
coverage report, and that number is incidental. tests/e2e/events.spec.js
predates the component — it was written for the page's Markdown (frontmatter
metadata, ## section order, the hero photo, the figcaption link, the
outbound event hosts) and the schedule arrived later, with the data, in #1369.
Loading /events for any of those existing assertions executes every line of
the component, so 83 talk cards, the in-page day-jump anchors and the
Sessionize provenance links are executed with nothing asserted about what they
produced. grep over tests/e2e/ for End user talk days, End user talks,
Sessionize and kubecon-na-2026 returns no matches on main.

The consequence is that the coverage number cannot fall. A regression that
empties the schedule, breaks the MDX mount, or changes the heading ids the
jump links target leaves /events serving its Markdown sections with the
schedule missing or inert, at 100.00% coverage, with every check green.

tests/end-user-talk-schedule.test.mjs is a thorough unit contract, but it
calls EndUserTalkSchedule() and walks the returned React element tree
through tests/tools/react-element-tree.mjs. Three failure modes survive it,
the same three tests/e2e/awards.spec.js records for AwardsTimeline:

  • The component reaches the page as an MDX import. The element tree proves
    what the function returns; it cannot prove MDX compiled the import and
    mounted it.
  • The day navigation is a row of #day.id anchors pointing at h5 elements
    carrying that id. The unit test matches those hrefs against ids in the
    element tree. Only the served document proves the ids survive into the DOM
    and that each anchor resolves to a real target.
  • The provenance paragraph cites the Sessionize API and the live schedule.
    The element tree cannot distinguish that citation from the page's own
    "Full schedule" bullet, which links the same URL — so this spec scopes the
    assertion to the component's own paragraph rather than the article.

What it asserts

Every expectation is derived from data/kubecon-na-2026-end-user-talks.json
through loadSiteData(), the way awards.spec.js is driven from
data/awards.json, so a re-run of npm run collect:end-user-talks is covered
on arrival instead of needing this spec rewritten.

  • a fixture guard: the data exposes days, and the flattened talk list length
    equals talkCount — without it every assertion below could degrade into a
    check over nothing
  • the component mounts inside the docs article, with the session count and
    timezone taken from the data
  • one jump link per day in corpus order, each #id resolving to exactly one
    element in the served document carrying that day's label
  • every talk card's title, url, speakers and room, compared as a whole list in
    corpus order so the day/slot grouping is asserted too
  • each slot's time[datetime] value and label, start then end, in corpus order
  • the provenance paragraph, scoped to the component, citing apiUrl and
    sourceUrl and the UTC-formatted verified date

Outbound hrefs are asserted as rendered attributes only and are never
requested, so the suite makes no third-party traffic from CI. The talk cards
and slot times are each read in a single evaluateAll round trip rather than
one locator assertion per record: at 83 sessions the per-record form would
dominate the suite's wall time without testing anything the single read does
not.

Verification

At main f5586b0 plus this commit, node v26.10.0:

  • npx playwright test tests/e2e/end-user-talk-schedule.spec.js — 6 passed
  • npx playwright test (full suite) — 320 passed
  • npm run test:unit:coverage:check — exits 0
  • npx prettier --check on the new file — clean
  • baseline browser-coverage capture before this change, via the documented
    CONTRIBUTING.md "Browser source coverage" procedure (run base-1791878466,
    sealed passed, 346 specs passed in chromium) reports
    src/components/EndUserTalkSchedule/index.js | 100.00 | 100.00 | |, which
    is the evidence that the existing coverage number is not an assertion.

Related Issue

Refs #1374 (non-closing: #1374 is the sec-check finding that the talks feed
renders 85 hrefs with no host allow-list, and it is already marked
hive/covered-by-pr. This PR asserts the rendered DOM and closes none of
that; it is filed here because the issue opened for this e2e-assertion gap was
consolidated into #1374 on arrival. The allow-list gate remains #1374's to
track.)

This PR is disjoint from the open hold-gated PRs on the same feed: #1375 adds
tests/end-user-talks-link-safety.test.mjs, #1383 adds
tests/end-user-talks-data.test.mjs, and #1385 edits CONTRIBUTING.md and
.cspell.yml. This PR adds one new file, tests/e2e/end-user-talk-schedule.spec.js,
and touches nothing else.


Filed by quality agent (hold-gated mode). Human review required.

— hive: agent=quality backend=copilot model=claude-opus-5 copilot=1.0.88

src/components/EndUserTalkSchedule/index.js reports 100.00% lines and
100.00% regions in the browser coverage report, and that number is
incidental. tests/e2e/events.spec.js predates the component (added with
the schedule in #1369) and asserts only the page's Markdown-sourced
headings, hero photo, figcaption link and outbound hosts; loading
/events for any of those executes every line of the component, so 83
talk cards, the in-page day-jump anchors and the Sessionize provenance
links are executed with no assertion made about them.

Adds tests/e2e/end-user-talk-schedule.spec.js, driven from
data/kubecon-na-2026-end-user-talks.json through loadSiteData() the way
awards.spec.js is driven from data/awards.json, so a re-run of
collect:end-user-talks is covered on arrival rather than needing the
spec rewritten.

Signed-off-by: quality <quality@hive.kubestellar.io>
@hivecommons-hive

Copy link
Copy Markdown
Contributor Author

Important

Held for human review by the hive's ACMM level gate.

This PR was opened by the "quality" agent while Hive policy required a human checkpoint for that agent. Non-outreach agents are held at ACMM L3–L5; the outreach agent is always held because it publishes project-facing communication.

Hive will keep the hold label until a human removes it. Operators can make a deliberate one-off release during an ACMM level change with release_level_holds=true, but level changes never release this hold automatically.

@mrbobbytables
mrbobbytables added this pull request to the merge queue Oct 13, 2026
Merged via the queue into main with commit 254902f Oct 13, 2026
8 checks passed
@mrbobbytables
mrbobbytables deleted the quality/test-end-user-talk-schedule-e2e branch October 16, 2026 01:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant