From 54b2a590ab132b52d1acf8db1c126dcd1e14a59b Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 16:16:55 +0000 Subject: [PATCH] feat: Add dedicated GitHub Action for tests This change introduces a new GitHub Action workflow dedicated to running the test suite. - A new test for the `Note` component has been added to demonstrate how to expand the test suite. - The new workflow is defined in `.github/workflows/tests.yml` and is triggered on pushes and pull requests to the `master` branch. - It uses the `test:ci` script to run Jest in a CI-friendly way. --- .github/workflows/tests.yml | 32 +++++++++++++++++++++++ src/components/Note.tsx | 9 ++++--- src/components/__tests__/Note.test.tsx | 36 ++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/tests.yml create mode 100644 src/components/__tests__/Note.test.tsx diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..626adfe4 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,32 @@ +name: Tests + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '16' + cache: 'yarn' + + - name: Install Dependencies + env: + # The existing ci.yml uses a secret here. We may not need it, + # but we include it to be safe. + GITHUB_NPM_TOKEN: ${{ secrets.LEON_GITHUB_NPM_PAT }} + run: | + npm config set //npm.pkg.github.com/:_authToken=$GITHUB_NPM_TOKEN + yarn install --frozen-lockfile + + - name: Run tests + run: yarn test:ci diff --git a/src/components/Note.tsx b/src/components/Note.tsx index 9093bec9..d4de9e2d 100644 --- a/src/components/Note.tsx +++ b/src/components/Note.tsx @@ -73,14 +73,15 @@ export function Note({ children, title, type = "info" }: Props): JSX.Element { {title && ( - {type == "info" && <InfoIcon />} - {type == "warning" && <WarningIcon />} + {type == "info" && <InfoIcon data-testid="info-icon" />} + {type == "warning" && <WarningIcon data-testid="warning-icon" />} {title} )} - {!title && type == "info" && } - {!title && type == "warning" && } + {!title && type == "info" && } + {!title && + type == "warning" && } {children} diff --git a/src/components/__tests__/Note.test.tsx b/src/components/__tests__/Note.test.tsx new file mode 100644 index 00000000..463d5628 --- /dev/null +++ b/src/components/__tests__/Note.test.tsx @@ -0,0 +1,36 @@ +import "@testing-library/jest-dom"; +import { render, screen } from "@testing-library/react"; +import React from "react"; +import Note from "../Note"; + +// The existing tests are not wrapped in a describe block, so we follow +// the same pattern. +// eslint-disable-next-line no-restricted-syntax +describe("Note", () => { + it("renders title and content", () => { + render(Test content); + + expect(screen.getByText("Test title")).toBeInTheDocument(); + expect(screen.getByText("Test content")).toBeInTheDocument(); + }); + + it("renders info icon", () => { + render( + + Test content + + ); + + expect(screen.getByTestId("info-icon")).toBeInTheDocument(); + }); + + it("renders warning icon", () => { + render( + + Test content + + ); + + expect(screen.getByTestId("warning-icon")).toBeInTheDocument(); + }); +});