diff --git a/.github/workflows/yarn_test.yaml b/.github/workflows/yarn_test.yaml index eed248b56..03bd180d2 100644 --- a/.github/workflows/yarn_test.yaml +++ b/.github/workflows/yarn_test.yaml @@ -38,6 +38,7 @@ jobs: yarn test --clear-cache --coverage --coverageDirectory=../.. - name: Run cypress tests # Uses the official Cypress GitHub action https://github.com/cypress-io/github-action + id: cypress uses: cypress-io/github-action@v6 with: # Starts web server for E2E tests - replace with your own server invocation @@ -49,30 +50,48 @@ jobs: record: true # parallel: true # Runs test in parallel using settings above config: chromeWebSecurity=false - browser: chrome -env: - AUTH0_AUDIENCE: ${{ secrets.AUTH0_AUDIENCE }} - AUTH0_BASE_URL: ${{ secrets.AUTH0_BASE_URL }} - AUTH0_CLIENT_ID: ${{ secrets.AUTH0_CLIENT_ID }} - AUTH0_CLIENT_SECRET: ${{ secrets.AUTH0_CLIENT_SECRET }} - AUTH0_DOMAIN: ${{ secrets.AUTH0_DOMAIN }} - AUTH0_ISSUER_BASE_URL: ${{ secrets.AUTH0_ISSUER_BASE_URL }} - AUTH0_SCOPE: ${{ secrets.AUTH0_SCOPE }} - AUTH0_SECRET: ${{ secrets.AUTH0_SECRET }} - CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} - CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }} - GITHUB_TOKEN: ${{ secrets.CYPRESS_GITHUB_TOKEN }} - NEXT_PUBLIC_API_PREFIX: ${{ secrets.NEXT_PUBLIC_API_PREFIX }} - NEXT_PUBLIC_SITES_API_PREFIX: ${{ secrets.NEXT_PUBLIC_SITES_API_PREFIX }} - NEXT_PUBLIC_AUTH0_AUDIENCE: ${{ secrets.NEXT_PUBLIC_AUTH0_AUDIENCE }} - NEXT_PUBLIC_AUTH0_API_AUDIENCE: ${{ secrets.NEXT_PUBLIC_AUTH0_API_AUDIENCE }} - NEXT_PUBLIC_AUTH0_CLIENT_ID: ${{ secrets.NEXT_PUBLIC_AUTH0_CLIENT_ID }} - NEXT_PUBLIC_AUTH0_DOMAIN: ${{ secrets.NEXT_PUBLIC_AUTH0_DOMAIN }} - NEXT_PUBLIC_AUTH0_PASSWORD: ${{ secrets.NEXT_PUBLIC_AUTH0_PASSWORD }} - NEXT_PUBLIC_AUTH0_SCOPE: ${{ secrets.NEXT_PUBLIC_AUTH0_SCOPE }} - NEXT_PUBLIC_AUTH0_USERNAME: ${{ secrets.NEXT_PUBLIC_AUTH0_USERNAME }} - NEXT_PUBLIC_4H_VIEW: 'true' - NEXT_PUBLIC_CI: 'true' - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + browser: electron + env: + AUTH0_AUDIENCE: ${{ secrets.AUTH0_AUDIENCE }} + AUTH0_BASE_URL: ${{ secrets.AUTH0_BASE_URL }} + AUTH0_CLIENT_ID: ${{ secrets.AUTH0_CLIENT_ID }} + AUTH0_CLIENT_SECRET: ${{ secrets.AUTH0_CLIENT_SECRET }} + AUTH0_DOMAIN: ${{ secrets.AUTH0_DOMAIN }} + AUTH0_ISSUER_BASE_URL: ${{ secrets.AUTH0_ISSUER_BASE_URL }} + AUTH0_SCOPE: ${{ secrets.AUTH0_SCOPE }} + AUTH0_SECRET: ${{ secrets.AUTH0_SECRET }} + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + CYPRESS_PROJECT_ID: ${{ secrets.CYPRESS_PROJECT_ID }} + GITHUB_TOKEN: ${{ secrets.CYPRESS_GITHUB_TOKEN }} + NEXT_PUBLIC_API_PREFIX: ${{ secrets.NEXT_PUBLIC_API_PREFIX }} + NEXT_PUBLIC_SITES_API_PREFIX: ${{ secrets.NEXT_PUBLIC_SITES_API_PREFIX }} + NEXT_PUBLIC_AUTH0_AUDIENCE: ${{ secrets.NEXT_PUBLIC_AUTH0_AUDIENCE }} + NEXT_PUBLIC_AUTH0_API_AUDIENCE: ${{ secrets.NEXT_PUBLIC_AUTH0_API_AUDIENCE }} + NEXT_PUBLIC_AUTH0_CLIENT_ID: ${{ secrets.NEXT_PUBLIC_AUTH0_CLIENT_ID }} + NEXT_PUBLIC_AUTH0_DOMAIN: ${{ secrets.NEXT_PUBLIC_AUTH0_DOMAIN }} + NEXT_PUBLIC_AUTH0_PASSWORD: ${{ secrets.NEXT_PUBLIC_AUTH0_PASSWORD }} + NEXT_PUBLIC_AUTH0_SCOPE: ${{ secrets.NEXT_PUBLIC_AUTH0_SCOPE }} + NEXT_PUBLIC_AUTH0_USERNAME: ${{ secrets.NEXT_PUBLIC_AUTH0_USERNAME }} + NEXT_PUBLIC_4H_VIEW: 'true' + NEXT_PUBLIC_CI: 'false' + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Upload snapshot diffs + if: always() && steps.cypress.outcome == 'failure' + uses: actions/upload-artifact@v4 + with: + name: cypress-snapshot-diffs + path: apps/nowcasting-app/cypress/snapshots/**/__diff_output__/*.png + - name: Comment diff link on PR + if: always() && steps.cypress.outcome == 'failure' + uses: actions/github-script@v7 + with: + script: | + const runUrl = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + await github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `### ❌ Snapshot diff\nDownload **cypress-snapshot-diffs** from [this run's artifacts](${runUrl}) to view the diff images.` + }); \ No newline at end of file diff --git a/apps/nowcasting-app/.percy.yml b/apps/nowcasting-app/.percy.yml new file mode 100644 index 000000000..0e6b2832d --- /dev/null +++ b/apps/nowcasting-app/.percy.yml @@ -0,0 +1,28 @@ +version: 2 +percy: + useSystemProxy: false + skipBaseBuild: false +snapshot: + widths: + - 1280 + minHeight: 720 + percyCSS: "" + enableJavaScript: false + cliEnableJavaScript: true + disableShadowDOM: false + forceShadowAsLightDOM: false + responsiveSnapshotCapture: false + ignoreCanvasSerializationErrors: false +discovery: + allowedHostnames: [] + disallowedHostnames: [] + networkIdleTimeout: 100 + scrollToBottom: false + captureMockedServiceWorker: false + retry: false + launchOptions: + closeBrowser: true +upload: + files: "**/*.{png,jpg,jpeg}" + ignore: "" + stripExtensions: false diff --git a/apps/nowcasting-app/components/button-group.tsx b/apps/nowcasting-app/components/button-group.tsx index 9640e834f..3d1d5eaa9 100644 --- a/apps/nowcasting-app/components/button-group.tsx +++ b/apps/nowcasting-app/components/button-group.tsx @@ -4,7 +4,10 @@ interface IButtonGroup { const ButtonGroup = ({ rightString }: IButtonGroup) => { return ( - +
{rightString}
diff --git a/apps/nowcasting-app/components/charts/delta-view/delta-header-block.tsx b/apps/nowcasting-app/components/charts/delta-view/delta-header-block.tsx index 7e8c2c51f..3b73f313a 100644 --- a/apps/nowcasting-app/components/charts/delta-view/delta-header-block.tsx +++ b/apps/nowcasting-app/components/charts/delta-view/delta-header-block.tsx @@ -48,6 +48,7 @@ export const DeltaHeaderBlock: React.FC<{ >
-
+
{ return (
= ({ }) => { return (
diff --git a/apps/nowcasting-app/components/charts/gsp-pv-remix-chart/forecast-header-gsp.tsx b/apps/nowcasting-app/components/charts/gsp-pv-remix-chart/forecast-header-gsp.tsx index 832c7d0f3..56a108def 100644 --- a/apps/nowcasting-app/components/charts/gsp-pv-remix-chart/forecast-header-gsp.tsx +++ b/apps/nowcasting-app/components/charts/gsp-pv-remix-chart/forecast-header-gsp.tsx @@ -43,7 +43,10 @@ const ForecastHeaderGSP: FC = ({ ); return (
-
+
{titleTooltipText.length ? ( {title} diff --git a/apps/nowcasting-app/components/layout/header/index.tsx b/apps/nowcasting-app/components/layout/header/index.tsx index d2f8ec7a2..fb9138055 100644 --- a/apps/nowcasting-app/components/layout/header/index.tsx +++ b/apps/nowcasting-app/components/layout/header/index.tsx @@ -27,6 +27,7 @@ const HeaderLink: React.FC = ({ view, setViewFunc }) => { + const dataCy = view ? `${view.toLowerCase().replace(/\s+/g, "-")}-tab` : undefined; const computedClasses = classNames( className || "", disabled ? "text-gray-500 cursor-not-allowed" : "cursor-pointer hover:text-ocf-yellow-400", @@ -52,6 +53,7 @@ const HeaderLink: React.FC = ({ return ( { if (!disabled) setViewFunc(view); diff --git a/apps/nowcasting-app/components/layout/header/settingsModal.tsx b/apps/nowcasting-app/components/layout/header/settingsModal.tsx index 2d0a2ed5e..5a8bff0d3 100644 --- a/apps/nowcasting-app/components/layout/header/settingsModal.tsx +++ b/apps/nowcasting-app/components/layout/header/settingsModal.tsx @@ -25,10 +25,17 @@ export const SettingsModal: React.FC = ({ isOpen, onClose }) => { return ( <> -
+
-
+
{/* Header */}

Settings

@@ -45,7 +52,11 @@ export const SettingsModal: React.FC = ({ isOpen, onClose }) => {

P-levels

{P_LEVEL_OPTIONS.map(([lower, upper]) => ( -
+
toggle([lower, upper])} diff --git a/apps/nowcasting-app/components/map/color-guide-bar.tsx b/apps/nowcasting-app/components/map/color-guide-bar.tsx index 81da69e73..4553d491f 100644 --- a/apps/nowcasting-app/components/map/color-guide-bar.tsx +++ b/apps/nowcasting-app/components/map/color-guide-bar.tsx @@ -66,7 +66,10 @@ const ColorGuideBar: React.FC = ({ unit }) => { unitText = "MW"; } return ( -
+
{values?.map((value, index) => (
= ({ > {showCloudLayer && (