@@ -1401,19 +1401,21 @@ describe('UserButton custom trigger badges', () => {
14011401
14021402 it ( 'hides the badge while pending and for null without changing the name' , async ( ) => {
14031403 const badge = deferred < { id : string ; label : string } | null > ( ) ;
1404- const { rerender } = await renderUserButton ( { renderTriggerBadge : ( ) => badge . promise } ) ;
1404+ const renderTriggerBadge = vi . fn ( ( { id } : { id : string } ) =>
1405+ id === 'org_1' ? badge . promise : Promise . resolve ( null ) ,
1406+ ) ;
1407+ const { clerk } = await renderUserButton ( { renderTriggerBadge } ) ;
14051408
14061409 expect ( trigger ( ) ) . toHaveTextContent ( 'Acme' ) ;
14071410 expect ( trigger ( ) ) . not . toHaveTextContent ( 'Pro plan' ) ;
14081411 await act ( ( ) => badge . resolve ( { id : 'pro' , label : 'Pro plan' } ) ) ;
14091412 await waitFor ( ( ) => expect ( within ( trigger ( ) ) . getByText ( 'Pro plan' ) ) . toBeInTheDocument ( ) ) ;
14101413 expect ( within ( trigger ( ) ) . getByText ( 'Acme' ) ) . toBeInTheDocument ( ) ;
14111414
1412- const renderTriggerBadge = vi . fn ( ( ) => Promise . resolve ( null ) ) ;
1413- rerender ( tree ( { renderTriggerBadge } ) ) ;
1414- await waitFor ( ( ) => expect ( renderTriggerBadge ) . toHaveBeenCalled ( ) ) ;
1415+ await act ( ( ) => clerk . setActive ( { organization : 'org_9' } ) ) ;
1416+ await waitFor ( ( ) => expect ( renderTriggerBadge ) . toHaveBeenCalledWith ( { kind : 'organization' , id : 'org_9' } ) ) ;
14151417 expect ( trigger ( ) ) . not . toHaveTextContent ( 'Pro plan' ) ;
1416- expect ( within ( trigger ( ) ) . getByText ( 'Acme ' ) ) . toBeInTheDocument ( ) ;
1418+ expect ( within ( trigger ( ) ) . getByText ( 'Other ' ) ) . toBeInTheDocument ( ) ;
14171419 } ) ;
14181420
14191421 it ( 'discards the previous workspace badge after switching organizations' , async ( ) => {
@@ -1432,29 +1434,51 @@ describe('UserButton custom trigger badges', () => {
14321434 expect ( trigger ( ) ) . not . toHaveTextContent ( 'Previous plan' ) ;
14331435 } ) ;
14341436
1435- it ( 'refreshes the badge when the callback changes and hides it on failure or false' , async ( ) => {
1436- const { rerender } = await renderUserButton ( {
1437- renderTriggerBadge : ( ) => Promise . resolve ( { id : 'pro' , label : 'Pro plan' } ) ,
1437+ it ( 'keeps the badge mounted when opened with an inline callback' , async ( ) => {
1438+ const calls = vi . fn ( ) ;
1439+ const inline = ( ) => {
1440+ calls ( ) ;
1441+ return Promise . resolve ( { id : 'enterprise' , label : 'Enterprise plan' } ) ;
1442+ } ;
1443+ const { rerender } = await renderUserButton ( { renderTriggerBadge : ( ) => inline ( ) } ) ;
1444+ await waitFor ( ( ) => expect ( within ( trigger ( ) ) . getByText ( 'Enterprise plan' ) ) . toBeInTheDocument ( ) ) ;
1445+
1446+ let dropped = false ;
1447+ const observer = new MutationObserver ( ( ) => {
1448+ dropped ||= ! trigger ( ) . textContent ?. includes ( 'Enterprise plan' ) ;
14381449 } ) ;
1439- await waitFor ( ( ) => expect ( within ( trigger ( ) ) . getByText ( 'Pro plan' ) ) . toBeInTheDocument ( ) ) ;
1450+ observer . observe ( trigger ( ) , { childList : true , subtree : true , characterData : true } ) ;
1451+ onTestFinished ( ( ) => observer . disconnect ( ) ) ;
14401452
1441- rerender ( tree ( { renderTriggerBadge : ( ) => Promise . resolve ( { id : 'business' , label : 'Business plan' } ) } ) ) ;
1442- await waitFor ( ( ) => expect ( within ( trigger ( ) ) . getByText ( 'Business plan' ) ) . toBeInTheDocument ( ) ) ;
1443- expect ( within ( trigger ( ) ) . getByText ( 'Business plan' ) . closest ( '.cl-badge' ) ) . toHaveAttribute (
1444- 'data-badge-id' ,
1445- 'business' ,
1446- ) ;
1447- expect ( within ( trigger ( ) ) . getByText ( 'Acme' ) ) . toBeInTheDocument ( ) ;
1453+ await open ( ) ;
1454+ rerender ( tree ( { renderTriggerBadge : ( ) => inline ( ) } ) ) ;
1455+ expect ( within ( trigger ( ) ) . getByText ( 'Enterprise plan' ) ) . toBeInTheDocument ( ) ;
1456+ await act ( ( ) => Promise . resolve ( ) ) ;
14481457
1449- const fail = vi . fn ( ) . mockRejectedValue ( new Error ( 'Plan unavailable' ) ) ;
1450- rerender ( tree ( { renderTriggerBadge : fail } ) ) ;
1451- await waitFor ( ( ) => expect ( fail ) . toHaveBeenCalled ( ) ) ;
1452- expect ( within ( trigger ( ) ) . getByText ( 'Acme' ) ) . toBeInTheDocument ( ) ;
1453- expect ( trigger ( ) ) . not . toHaveTextContent ( 'Business plan' ) ;
1458+ expect ( dropped ) . toBe ( false ) ;
1459+ expect ( calls ) . toHaveBeenCalledTimes ( 1 ) ;
1460+ } ) ;
1461+
1462+ it ( 'hides the badge for false or on failure' , async ( ) => {
1463+ const renderTriggerBadge = vi . fn ( ( { id } : { id : string } ) =>
1464+ id === 'org_1'
1465+ ? Promise . resolve ( { id : 'pro' , label : 'Pro plan' } )
1466+ : Promise . reject ( new Error ( 'Plan unavailable' ) ) ,
1467+ ) ;
1468+ const { clerk, rerender } = await renderUserButton ( { renderTriggerBadge } ) ;
1469+ await waitFor ( ( ) => expect ( within ( trigger ( ) ) . getByText ( 'Pro plan' ) ) . toBeInTheDocument ( ) ) ;
14541470
14551471 rerender ( tree ( { renderTriggerBadge : false } ) ) ;
1472+ expect ( trigger ( ) ) . not . toHaveTextContent ( 'Pro plan' ) ;
14561473 expect ( within ( trigger ( ) ) . getByText ( 'Acme' ) ) . toBeInTheDocument ( ) ;
1457- expect ( trigger ( ) ) . not . toHaveTextContent ( 'Business plan' ) ;
1474+
1475+ rerender ( tree ( { renderTriggerBadge } ) ) ;
1476+ await waitFor ( ( ) => expect ( within ( trigger ( ) ) . getByText ( 'Pro plan' ) ) . toBeInTheDocument ( ) ) ;
1477+
1478+ await act ( ( ) => clerk . setActive ( { organization : 'org_9' } ) ) ;
1479+ await waitFor ( ( ) => expect ( renderTriggerBadge ) . toHaveBeenCalledWith ( { kind : 'organization' , id : 'org_9' } ) ) ;
1480+ expect ( trigger ( ) ) . not . toHaveTextContent ( 'Pro plan' ) ;
1481+ expect ( within ( trigger ( ) ) . getByText ( 'Other' ) ) . toBeInTheDocument ( ) ;
14581482 } ) ;
14591483
14601484 it ( 'does not request a badge when the trigger label is hidden' , async ( ) => {
0 commit comments