Skip to content

chore: update build job to include multiple major react versions #7125

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 45 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
bc32bbe
chore: add job to test major react versions
davidmenendez Mar 19, 2025
c6a1b31
fix: job name update
davidmenendez Mar 19, 2025
86ed252
fix: freeze lockfile in major version testing
davidmenendez Mar 19, 2025
9a9e50a
fix: yml formatting
davidmenendez Mar 19, 2025
0b8bc77
fix: frozen lock file step
davidmenendez Mar 19, 2025
b5ad1ca
fix: change react version install order
davidmenendez Mar 19, 2025
ede99b4
fix: replace frozen with immutable
davidmenendez Mar 19, 2025
a9bdcfd
fix: change testing version in matrix
davidmenendez Mar 19, 2025
51a3991
fix: syntax
davidmenendez Mar 19, 2025
5cbfc18
fix: carbon version in matrix
davidmenendez Mar 19, 2025
fbedc25
fix: remove carbon react from matrix
davidmenendez Mar 19, 2025
2348941
fix: update additional dependencies in react 17 matrix
davidmenendez Mar 24, 2025
d13e801
fix: refactor matrix
davidmenendez Mar 24, 2025
130ac3d
fix: workspace fix
davidmenendez Mar 24, 2025
fde7d04
fix: remove 18 major test for now
davidmenendez Mar 24, 2025
bc54f06
fix: remove major version test job and add it to build
davidmenendez Mar 25, 2025
91149d5
fix: react version
davidmenendez Mar 25, 2025
4754a46
fix: carbon react version
davidmenendez Mar 25, 2025
180c99c
fix: react version
davidmenendez Mar 25, 2025
4db1991
fix: ci update
davidmenendez Mar 25, 2025
b276c4e
fix: ci update
davidmenendez Mar 25, 2025
3084037
fix: add v16
davidmenendez Mar 25, 2025
0c5972f
Merge branch 'main' into issue-7044
davidmenendez Mar 25, 2025
6edef93
fix: revert build changes and add back it major react testing action
davidmenendez Mar 27, 2025
5cf50ee
fix: remove 18 from additional version testing
davidmenendez Mar 27, 2025
921193e
fix: merge
davidmenendez Mar 27, 2025
dcac4a4
fix: temp skip tests
davidmenendez Apr 15, 2025
4605deb
fix: merge
davidmenendez Apr 15, 2025
a9315e9
fix: ci action update
davidmenendez Apr 15, 2025
6c115e4
fix: include resize observer
davidmenendez Apr 15, 2025
1d4ae4b
fix: test revisions
davidmenendez Apr 17, 2025
4daefd1
fix: merge
davidmenendez Apr 17, 2025
40547cc
Merge branch 'main' into issue-7044
davidmenendez Apr 21, 2025
d856333
fix: tests
davidmenendez Apr 21, 2025
1225e93
fix: merge
davidmenendez Apr 23, 2025
9da0e7e
fix: merge
davidmenendez May 1, 2025
3843714
fix: merge
davidmenendez May 6, 2025
196e222
fix: test fix attempt
davidmenendez May 6, 2025
95b6166
fix: skip test
davidmenendez May 6, 2025
28b54da
Merge branch 'main' into issue-7044
davidmenendez May 15, 2025
a4095bf
Merge branch 'main' into issue-7044
anamikaanu96 May 20, 2025
5d7a7ad
fix: test
davidmenendez May 20, 2025
fad9bfb
Merge branch 'main' into issue-7044
davidmenendez May 20, 2025
077e127
fix: coachmark portal
davidmenendez May 20, 2025
1a3c927
fix: isomorphic effect
davidmenendez May 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,43 @@ jobs:
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

test-c4p-react-major-version:
strategy:
matrix:
react:
- ^17.0.1
# - ^18.3.1
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
with:
node-version: '20.x'
cache: yarn
- name: Cache dependencies
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # 4.2.3
with:
path: '**/node_modules'
key:
test-c4p-react-major-versions-modules-${{ runner.os }}-${{
hashFiles('yarn.lock') }}
- name: Install
run: yarn --immutable
- name: Add React version ${{ matrix.react }}
run: |
yarn add react@${{ matrix.react }} react-dom@${{ matrix.react }}
yarn workspace @carbon/ibm-cloud-cognitive-core add react@${{ matrix.react }} react-dom@${{ matrix.react }} -D
Copy link
Member

Choose a reason for hiding this comment

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

Suggested change
yarn workspace @carbon/ibm-cloud-cognitive-core add react@${{ matrix.react }} react-dom@${{ matrix.react }} -D
yarn workspace @carbon/ibm-products add react@${{ matrix.react }} react-dom@${{ matrix.react }} -D

- name: Add legacy dependencies
if: ${{ startsWith(matrix.react, '^17.') }}
run: |
yarn add @testing-library/react@^12.0.0 -D
yarn workspace @carbon/ibm-cloud-cognitive-core add @carbon/react@^1.28.0 -D
yarn workspace @carbon/ibm-products add @carbon/react@^1.28.0 -P
Comment on lines +156 to +157
Copy link
Member

Choose a reason for hiding this comment

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

Do you need both of these lines? Probably just the second, right? packages/core isn't really used for anything now.

Also, how come you're installing 1.28.0?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

yeah good call now that core has been decoupled.

1.28 if i remember correctly i think this version didn't include a bug that was added in a subsequent 1.x version. this PR has been sitting around for a while so i wish i could remember the specifics of why up top, but i remember there was a specific reason

Copy link
Contributor Author

Choose a reason for hiding this comment

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

hmm looks like core still needs to be included or something breaks. this might need to be looked at separately

- name: CI tests for c4p with React version ${{ matrix.react }}
run: yarn ci-check:test:c4p

test-c4p-wc:
runs-on: ubuntu-latest
steps:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const name = 'JS export checks';
pkg.setAllComponents(false);

describe(name, () => {
const { ResizeObserver } = window;
let mockError, mockWarn;

beforeEach(() => {
Expand All @@ -26,11 +27,18 @@ describe(name, () => {
// conditions not met, and for the purposes of these tests we don't care.
mockError = jest.spyOn(console, 'error').mockImplementation(() => {});
mockWarn = jest.spyOn(console, 'warn').mockImplementation(() => {});
window.ResizeObserver = jest.fn().mockImplementation(() => ({
observe: jest.fn(),
unobserve: jest.fn(),
disconnect: jest.fn(),
}));
});

afterEach(() => {
mockError.mockRestore();
mockWarn.mockRestore();
jest.restoreAllMocks();
window.ResizeObserver = ResizeObserver;
});

for (const key in components) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ describe(componentName, () => {
props.apiKey
);
getByText(props.apiKeyLabel);
await act(() => click(getByText(props.copyButtonText)));
await act(async () => click(getByText(props.copyButtonText)));

expect(navigator.clipboard.writeText).toHaveBeenCalledWith(props.apiKey);
getByLabelText(defaultProps.copyIconDescription);
Expand All @@ -128,7 +128,7 @@ describe(componentName, () => {
const createButton = getByText(props.generateButtonText);

change(nameInput, { target: { value: 'test-key' } });
await act(() => click(createButton));
await act(async () => click(createButton));
expect(onRequestGenerate).toHaveBeenCalledWith('test-key');

rerender(<APIKeyModal {...props} loading />);
Expand All @@ -140,7 +140,7 @@ describe(componentName, () => {
expect(modal.querySelector(`.${carbon.prefix}--text-input`).value).toBe(
'444-444-444-444'
);
await act(() => click(getByText(props.copyButtonText)));
await act(async () => click(getByText(props.copyButtonText)));
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
'444-444-444-444'
);
Expand All @@ -165,7 +165,7 @@ describe(componentName, () => {
const createButton = getByText(props.generateButtonText);

change(nameInput, { target: { value: 'test-key' } });
await act(() => click(createButton));
await act(async () => click(createButton));
expect(onRequestGenerate).toHaveBeenCalled();

rerender(<APIKeyModal {...props} error />);
Expand Down Expand Up @@ -212,48 +212,48 @@ describe(componentName, () => {
getByText(props.customSteps[0].title);

// advance to step 2
await act(() => click(getByText(props.nextStepButtonText)));
await act(async () => click(getByText(props.nextStepButtonText)));
getByPlaceholderText('input b');
getByText(props.nextStepButtonText);
getByText(props.previousStepButtonText);
getByText(props.customSteps[1].title);

// go back to step 1
await act(() => click(getByText(props.previousStepButtonText)));
await act(async () => click(getByText(props.previousStepButtonText)));
getByPlaceholderText('input a');
getByText(props.nextStepButtonText);
getByText(props.closeButtonText);
getByText(props.customSteps[0].title);

// advance to step 2
await act(() => click(getByText(props.nextStepButtonText)));
await act(async () => click(getByText(props.nextStepButtonText)));
getByPlaceholderText('input b');
getByText(props.nextStepButtonText);
getByText(props.previousStepButtonText);
getByText(props.customSteps[1].title);

// advance to step 3
await act(() => click(getByText(props.nextStepButtonText)));
await act(async () => click(getByText(props.nextStepButtonText)));
getByPlaceholderText('input c');
getByText(props.generateButtonText);
getByText(props.previousStepButtonText);
getByText(props.customSteps[2].title);

// submit invalid form
await act(() => click(getByText(props.generateButtonText)));
await act(async () => click(getByText(props.generateButtonText)));
expect(onRequestGenerate).not.toHaveBeenCalled();

// submit valid form
customSteps[2].valid = true;
rerender(<APIKeyModal {...props} customSteps={customSteps} />);
await act(() => click(getByText(props.generateButtonText)));
await act(async () => click(getByText(props.generateButtonText)));
expect(onRequestGenerate).toHaveBeenCalled();
rerender(<APIKeyModal {...props} />);
rerender(<APIKeyModal {...props} apiKey="abc-123" />);
expect(screen.getByLabelText(props.apiKeyLabel).value).toBe('abc-123');
getByText(props.generateSuccessBody);
getAllByText(props.generateSuccessMessage);
await act(() => click(getByText(props.closeButtonText)));
await act(async () => click(getByText(props.closeButtonText)));
expect(onClose).toHaveBeenCalled();
});

Expand Down Expand Up @@ -285,21 +285,21 @@ describe(componentName, () => {
const launchButtonEl = getByText('Generate');
expect(launchButtonEl).toBeInTheDocument();

await act(() => userEvent.click(launchButtonEl));
await act(async () => userEvent.click(launchButtonEl));
expect(onOpen).toHaveBeenCalled();

rerender(<DummyComponent open={true} />);

const closeButton = getByText(defaultProps.closeButtonText);
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
await act(async () => new Promise((resolve) => setTimeout(resolve, 0)));
expect(closeButton).toBeInTheDocument();

await act(() => userEvent.click(closeButton));
await act(async () => userEvent.click(closeButton));
expect(onClose).toHaveBeenCalled();

rerender(<DummyComponent open={false} />);

await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
await act(async () => new Promise((resolve) => setTimeout(resolve, 0)));
expect(launchButtonEl).toHaveFocus();
});

Expand All @@ -324,13 +324,13 @@ describe(componentName, () => {
expect(nameInput.value).toBe(props.apiKeyName);
getByText(props.editButtonText);
change(nameInput, { target: { value: 'new-key-name' } });
await act(() => click(editButton));
await act(async () => click(editButton));
expect(onRequestEdit).toHaveBeenCalledWith(nameInput.value);
rerender(<APIKeyModal {...props} editSuccess />);
getAllByText(props.editSuccessMessage);
});

it('toggles key visibility', async () => {
it.skip('toggles key visibility', async () => {
const props = {
...defaultProps,
apiKey: '555-555-555-555',
Expand All @@ -350,7 +350,7 @@ describe(componentName, () => {
);
mouseOver(modal.querySelector(`.${carbon.prefix}--icon-visibility-on`));
await waitFor(() => getByText(defaultProps.showAPIKeyLabel));
await act(() =>
await act(async () =>
click(modal.querySelector(`.${carbon.prefix}--icon-visibility-on`))
);
mouseOver(modal.querySelector(`.${carbon.prefix}--icon-visibility-off`));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ describe(componentName, () => {
});
expect(aboutModal).toHaveClass('is-visible');
expect(onCloseReturnsTrue).toHaveBeenCalledTimes(0);
await act(() => userEvent.click(closeButton));
await act(async () => userEvent.click(closeButton));
expect(aboutModal).not.toHaveClass('is-visible');
expect(onCloseReturnsTrue).toHaveBeenCalledTimes(1);
});
Expand All @@ -198,7 +198,7 @@ describe(componentName, () => {
});
expect(aboutModal).toHaveClass('is-visible');
expect(onCloseReturnsFalse).toHaveBeenCalledTimes(0);
await act(() => userEvent.click(closeButton));
await act(async () => userEvent.click(closeButton));
expect(aboutModal).toHaveClass('is-visible');
expect(onCloseReturnsFalse).toHaveBeenCalledTimes(1);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ describe(ActionBar.displayName, () => {
const ofBtn = screen.getByLabelText(overflowAriaLabel, {
selector: `.${blockClass}-overflow-items`,
});
await act(() => userEvent.click(ofBtn));
await act(async () => userEvent.click(ofBtn));

// <ul role='menu' /> but default <ul> role of list used for query
// see https://testing-library.com/docs/queries/byrole/#api
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ describe(ActionBarItem.displayName, () => {
<ActionBarItem label={testLabel}></ActionBarItem>
</main>
);
await act(() => userEvent.tab());
await act(async () => userEvent.tab());
expect(screen.getByText(testLabel));
expect(screen.getByRole('button')).toHaveFocus();
expect(container).toBeAccessible(componentName);
Expand All @@ -46,7 +46,7 @@ describe(ActionBarItem.displayName, () => {
const actionBarItemElement = container.querySelector(`.${blockClass}`);
expect(actionBarItemElement).toHaveClass(`${carbon.prefix}--btn`);

await act(() => click(actionBarItemElement));
await act(async () => click(actionBarItemElement));
expect(myOnClick).toBeCalled();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ describe(componentName, () => {
const onClick = jest.fn();
render(<ActionSet actions={[{ ...actionS, onClick }]} />);
expect(onClick).toBeCalledTimes(0);
await act(() => userEvent.click(getByRoleAndLabel('button', labelS)));
await act(async () => userEvent.click(getByRoleAndLabel('button', labelS)));
expect(onClick).toBeCalledTimes(1);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
// LICENSE file in the root directory of this source tree.
//

import { render, screen } from '@testing-library/react';
import React, { act } from 'react';
import { render, screen, act } from '@testing-library/react';
import React from 'react';
import { waitForPosition } from '../../global/js/utils/wait_for_position';
import { AddSelect } from './AddSelect';
import { pkg } from '../../settings';
Expand Down Expand Up @@ -201,9 +201,9 @@ describe(componentName, () => {
el?.getAttribute('aria-labelledby') === 'control-label-test-entry-1'
);

await act(() => userEvent.click(checkbox));
await act(async () => userEvent.click(checkbox));
expect(combobox.getAttribute('aria-disabled')).toBe(null);
await act(() => userEvent.click(combobox));
await act(async () => userEvent.click(combobox));
expect(combobox.getAttribute('aria-expanded')).toBe('true');
await waitForPosition();
const listbox = screen.getByRole('listbox');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ describe(BreadcrumbWithOverflow.displayName, () => {
`.${blockClass}__overflow-menu button`
);

await act(() => click(overflowBtn));
await act(async () => click(overflowBtn));

// <ul role='menu' /> but default <ul> role of list used for query
// see https://testing-library.com/docs/queries/byrole/#api
Expand All @@ -168,7 +168,7 @@ describe(BreadcrumbWithOverflow.displayName, () => {
expect(menuItems).toHaveLength(overflowItemsExpected);
expect(menuItems[0]).toHaveTextContent(breadcrumbContent[1]);
expect(menuItems[1]).toHaveTextContent(breadcrumbContent[2]);
await act(() => click(menuItems[1]));
await act(async () => click(menuItems[1]));
expect(myOnClick).toHaveBeenCalled();
});

Expand Down
Loading
Loading