Skip to content

[quality] the member-dialog logo-less e2e case reads data/members.json, so a landscape refresh can silently retire it #1148

Description

@hivecommons-hive

Finding

tests/e2e/member-directory.spec.js is the only browser coverage of the
member profile dialog's logo-less arm
(src/components/MemberDirectory/MemberProfile.js:35-41, the large initials
shown in place of an <img>). It selects the member that drives the case by
reading the shipped data file directly:

const membersData = JSON.parse(
  readFileSync(resolve('data/members.json'), 'utf8'),
);
const members = membersData.members || [];
const withoutLogo = members.find((member) => !member.logo);
...
test.skip(!withoutLogo, 'every member in data/members.json carries a logo');

data/members.json is regenerated from the CNCF landscape by
npm run generate:members, so which organizations lack a logo is upstream
state rather than a source edit. At main = 7ab301e exactly two of 101
members carry no logo (DiDi, Subaru Corporation). On the day the landscape
gives both of them one, the case stops running — and it stops running as a
skip, which no gate reports: --check-source and --check-source-regions
score the regions a run reached, and a case that never executes simply
contributes nothing. The suite would stay green while the dialog's only
browser coverage of that arm quietly disappeared.

This is the hazard the overlay mechanism already exists to remove.
tests/e2e/fixtures/data/members.json appends coverage-fixture-org with
"logo": null (added so MemberCard renders
membershipLabel('member-and-contributor')), and
tests/tools/e2e-data-fixtures.cjs exposes loadSiteData() precisely so a
spec reads the document the page was built from.
tests/e2e/data-fixtures.spec.js and tests/e2e/data-variants.spec.js both
read their data that way; this spec is the one that does not.

Evidence and provenance

  • The skip is one landscape refresh away. data/members.json at main =
    7ab301e: 101 members, 2 without a logo. Reproduce with
    node -e "const m=require('./data/members.json').members; console.log(m.length, m.filter(x=>!x.logo).map(x=>x.name))".
  • The overlay already guarantees the shape. Verified locally at 7ab301e:
    loadSiteData('members.json', {}) yields 101 members and 2 without a logo,
    loadSiteData('members.json', {E2E_COVERAGE: '1'}) yields 102 and 3 — the
    third being Coverage Fixture Organization.
  • Unit — covered, and blind to this. npm run test:unit:coverage
    (TZ=UTC node tests/tools/coverage-report.mjs, node v26.10.0) run locally
    on 2026-10-07 at 7ab301e: src files at 100.00% lines / 99.96% regions,
    with MemberProfile.js fully covered through tests/tools/fake-dom.mjs.
    The unit gate therefore cannot notice the browser case retiring.
  • E2E — the case runs today. CI artifact e2e-coverage, id 11466369399,
    workflow Validate repository, job End-to-end coverage, run
    37585915961:
    src/components/MemberDirectory/MemberProfile.js at 100.00% lines /
    92.31% regions. The initials arm's region
    (35:24:38:15) carries a non-zero count, so this issue is about keeping
    that true, not about reaching it.

This is a regression-risk / test-infrastructure finding, not a
coverage-gap: no source path is under-tested today. The defect is that a
passing suite can stop testing something without saying so.

Recommendation

Read the members through the overlay and make the coverage build assert the
shape instead of skipping on it:

  • tests/e2e/member-directory.spec.js selects its members via
    loadSiteData('members.json') from tests/tools/e2e-data-fixtures.cjs
    rather than readFileSync('data/members.json')
  • under E2E_COVERAGE=1 a missing logo-less member fails the case
    (a committed overlay that no longer supplies one is a broken fixture),
    while the plain End-to-end tests job — which does not apply overlays —
    keeps the existing skip, because there the case genuinely depends on
    upstream data

Coordination

The change touches tests/e2e/member-directory.spec.js only. It does not edit
tests/e2e/fixtures/data/members.json, tests/e2e/fixtures/data-variants/members.json
(occupied by #1104), tests/tools/e2e-data-fixtures.cjs or
tests/e2e-data-fixtures.test.mjs (occupied by #1110 and #1113), or any
workflow file.

Priority

  • Impact: medium (a green suite that can silently stop covering a shipped UI
    arm, with no gate able to report it)
  • Effort: low

🐝 Hive Agent: quality | Instance: hosted-available-lke648397-260827-5n31 | SHA: 7ab301e

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

Activity

  1. added
    qualityApproved by a Hive merger/owner for auto-merge on green CI
    testingApproved by a Hive merger/owner for auto-merge on green CI
    agent/qualityApproved by a Hive merger/owner for auto-merge on green CI
    hive/covered-by-prHive verified that an open PR references or claims this issue; still actionable until confirmed
    on Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent/qualityApproved by a Hive merger/owner for auto-merge on green CIhive/covered-by-prHive verified that an open PR references or claims this issue; still actionable until confirmedhive/hosted-available-lke648397-260827-5n31Approved by a Hive merger/owner for auto-merge on green CIqualityApproved by a Hive merger/owner for auto-merge on green CItestingApproved by a Hive merger/owner for auto-merge on green CI

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions