Skip to content

Conversation

@francinelucca
Copy link
Member

@francinelucca francinelucca commented Nov 22, 2025

Relatos to https://github.com/github/primer/issues/5255

This pull request adds a reusable test utility to verify that components correctly handle className props and applies it to the AnchoredOverlay component tests. The main focus is on improving test coverage and consistency for CSS class name behavior.

Changelog

New

  • Added the implementsClassNameBehavior function to utils/testing.tsx, which provides a standardized way to test that components render both their default and custom className props.
  • Integrated implementsClassNameBehavior into the AnchoredOverlay test suite, ensuring that the component correctly applies both its base and custom class names.

Rollout strategy

  • Patch release
  • Minor release
  • Major release; if selected, include a written rollout or migration plan
  • None; if selected, include a brief description as to why
    Test-only update

Testing & Reviewing

Merge checklist

@changeset-bot
Copy link

changeset-bot bot commented Nov 22, 2025

⚠️ No Changeset found

Latest commit: a61c41c

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@github-actions github-actions bot added the staff Author is a staff member label Nov 22, 2025
@github-actions
Copy link
Contributor

👋 Hi, this pull request contains changes to the source code that github/github-ui depends on. If you are GitHub staff, test these changes with github/github-ui using the integration workflow. Or, apply the integration-tests: skipped manually label to skip these checks.

@github-actions github-actions bot added the integration-tests: recommended This change needs to be tested for breaking changes. See https://arc.net/l/quote/tdmpakpm label Nov 22, 2025
@github-actions github-actions bot temporarily deployed to storybook-preview-7231 November 22, 2025 05:12 Inactive
implementsClassNameBehavior(
AnchoredOverlay,
'prc-Overlay-Overlay-ViJgm',
component => component.container.firstChild!.childNodes[1].firstChild?.firstChild as HTMLElement,
Copy link
Member Author

Choose a reason for hiding this comment

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

🫠

Copy link
Member

@siddharthkp siddharthkp Nov 26, 2025

Choose a reason for hiding this comment

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

what's going on here? 😅 I don't understand

Is this the way to get the baseHtmlElement? + Is this so weird because every component puts the className in a different spot and not just the first child?

Copy link
Member Author

Choose a reason for hiding this comment

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

Is this the way to get the baseHtmlElement?

Yeah, I'm trying to tell the helper how to find the element with the className

Is this so weird because every component puts the className in a different spot and not just the first child?

Correct! a lot of them will be the first child, which I've made the default, but for some of them I expect some "I need to tell you what the styled element is" which is what this is

@francinelucca francinelucca added the skip changeset This change does not need a changelog label Nov 25, 2025
@github-actions github-actions bot temporarily deployed to storybook-preview-7231 November 25, 2025 03:27 Inactive
@github-actions github-actions bot added integration-tests: passing Changes in this PR do NOT cause breaking changes in gh/gh integration-tests: failing Changes in this PR cause breaking changes in gh/gh and removed integration-tests: recommended This change needs to be tested for breaking changes. See https://arc.net/l/quote/tdmpakpm integration-tests: passing Changes in this PR do NOT cause breaking changes in gh/gh integration-tests: failing Changes in this PR cause breaking changes in gh/gh labels Nov 25, 2025
describe('AnchoredOverlay', () => {
implementsClassNameBehavior(
AnchoredOverlay,
'prc-Overlay-Overlay-ViJgm',
Copy link
Member

@siddharthkp siddharthkp Nov 26, 2025

Choose a reason for hiding this comment

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

Hmm, feels off putting the hashed className here, can we import this from .module.css file instead, does that work?

'prc-Overlay-Overlay-ViJgm',
component => component.container.firstChild!.childNodes[1].firstChild?.firstChild as HTMLElement,
props => <AnchoredOverlayTestComponent initiallyOpen={true} {...props} />,
)
Copy link
Member

@siddharthkp siddharthkp Nov 26, 2025

Choose a reason for hiding this comment

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

my dream test function call looks like this:

implementsClassName(ActionList)

// or if we need to,

implementsClassName(props => <AnchoredOverlayFixture {...props} />)

implementsClassName should

  1. render without custom className to figure out the base class and base element
  2. render with custom className, make sure it has both classes on the base element

Copy link
Member Author

Choose a reason for hiding this comment

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

render without custom className to figure out the base class and base element

can you elaborate on this one? I'm confused on how it would do that 🤔

Copy link
Member

Choose a reason for hiding this comment

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

(i'm literally making this up so it might not work, i should invest some time doing a proof of concept) Is there a pattern we follow for base classes? Does it always have the component name like in prc-Overlay-Overlay-ViJgm, is it safe to find the first prc-* class we find, that's probably the base class?

Copy link
Member Author

Choose a reason for hiding this comment

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

yeah we could, the main problem I see is we don't have (as far as I can tell) "getByClassName" or something of the sorts util, so even knowing the full className, I don't know how to find the element is my main problem.

Another potential roadblock I see is some components are composed of others so will definitely have multiple "prc-*" classes

component.container.firstChild as HTMLElement,
renderComponent: (props: {className?: string}) => React.JSX.Element = props => <Component {...(props as TProps)} />,
) {
it('renders with the base className', () => {
Copy link
Member

Choose a reason for hiding this comment

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

idk why but this feels like a strange test to test for. The custom className test is 10/10

import {type RenderResult, render as HTMLRender} from '@testing-library/react'
import {it, expect} from 'vitest'

export function implementsClassNameBehavior<TProps extends {className?: string}>(
Copy link
Member

Choose a reason for hiding this comment

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

nit:

Suggested change
export function implementsClassNameBehavior<TProps extends {className?: string}>(
export function implementsClassName<TProps extends {className?: string}>(

Copy link
Member

@siddharthkp siddharthkp left a comment

Choose a reason for hiding this comment

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

Left a few direction comments

@primer-integration
Copy link

👋 Hi from github/github-ui! Your integration PR is ready: https://github.com/github/github-ui/pull/7852

@github-actions github-actions bot temporarily deployed to storybook-preview-7231 December 2, 2025 03:49 Inactive
@github-actions github-actions bot added integration-tests: passing Changes in this PR do NOT cause breaking changes in gh/gh and removed integration-tests: failing Changes in this PR cause breaking changes in gh/gh labels Dec 2, 2025
@github-actions github-actions bot added integration-tests: failing Changes in this PR cause breaking changes in gh/gh integration-tests: passing Changes in this PR do NOT cause breaking changes in gh/gh and removed integration-tests: passing Changes in this PR do NOT cause breaking changes in gh/gh integration-tests: failing Changes in this PR cause breaking changes in gh/gh labels Dec 2, 2025
@primer-integration
Copy link

🔴 ci completed with status failure.

@github-actions github-actions bot added integration-tests: failing Changes in this PR cause breaking changes in gh/gh and removed integration-tests: passing Changes in this PR do NOT cause breaking changes in gh/gh labels Dec 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

integration-tests: failing Changes in this PR cause breaking changes in gh/gh skip changeset This change does not need a changelog staff Author is a staff member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants