name: CI - Node.js Test Current
env:
  NODE_OPTIONS: '--max_old_space_size=6144'

on:
  # Run on push events, but only for the below branches
  push:
    branches:
      - 'main'
      - 'prod-**'
  # Run on pull requests, but only for the below targets
  pull_request:
    branches:
      - 'main'
      - 'next-**'
  # Run on Merge Queue
  merge_group:
    types: [checks_requested]

permissions:
  contents: read

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        node-version: [18.x]
      fail-fast: false

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3

      - name: Check number of lockfiles
        run: |
          if [ $(find . -name 'package-lock.json' | grep -vc -e 'node_modules') -gt 0 ]
          then
            echo -e 'Error: found package-lock files in the repository.\nWe use pnpm workspaces to manage packages so all dependencies should be added via pnpm add'
            exit 1
          fi

      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          echo 'SHOW_NEW_CURRICULUM=true' >> .env
          cat .env

      # The two prefixed installs are for the client update which are not,
      # currently, built as workspaces.
      - name: Lint Source Files
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:config
          npm i --prefix=curriculum-server
          npm i --prefix=web
          pnpm run build:curriculum
          pnpm run lint

  test:
    name: Test
    needs: lint
    runs-on: ubuntu-20.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [18.x]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3

      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@d26215f71b2ce60420a2a3776a25893d11a65f85 # 1.9.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:config
          pnpm run build:curriculum

      - name: Run Tests
        run: pnpm test

  test-upcoming:
    name: Test Upcoming Changes
    needs: lint
    runs-on: ubuntu-20.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [18.x]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3

      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          echo 'SHOW_UPCOMING_CHANGES=true' >> .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@d26215f71b2ce60420a2a3776a25893d11a65f85 # 1.9.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:config
          pnpm run build:curriculum

      - name: Run Tests
        run: pnpm test

  test-new:
    name: Test New Curriculum
    needs: lint
    runs-on: ubuntu-20.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [18.x]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3

      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          echo 'SHOW_UPCOMING_CHANGES=true' >> .env
          echo 'SHOW_NEW_CURRICULUM=true' >> .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@d26215f71b2ce60420a2a3776a25893d11a65f85 # 1.9.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:config
          pnpm run build:curriculum

      - name: Run Tests
        run: pnpm test

  test-localization:
    name: Localize
    needs: lint
    runs-on: ubuntu-20.04

    strategy:
      fail-fast: false
      matrix:
        node-version: [18.x]
        locale: [chinese, espanol]

    steps:
      - name: Checkout Source Files
        uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3

      - name: Setup pnpm
        uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: pnpm

      - name: Set Environment variables
        run: |
          cp sample.env .env
          cat .env

      - name: Start MongoDB
        uses: supercharge/mongodb-github-action@d26215f71b2ce60420a2a3776a25893d11a65f85 # 1.9.0
        with:
          mongodb-version: 6.0
          mongodb-replica-set: test-rs
          mongodb-port: 27017

      - name: Install Dependencies
        env:
          CURRICULUM_LOCALE: ${{ matrix.locale }}
          CLIENT_LOCALE: ${{ matrix.locale }}
        run: |
          echo pnpm version $(pnpm -v)
          pnpm install
          pnpm run create:config
          pnpm run build:curriculum

      - name: Run Tests
        env:
          CURRICULUM_LOCALE: ${{ matrix.locale }}
          CLIENT_LOCALE: ${{ matrix.locale }}
        run: pnpm test

  failure-comment:
    name: Comment on i18n Failure
    needs: ['test', 'test-localization']
    runs-on: ubuntu-20.04
    if: ${{ always() && needs.test.result == 'success' && needs.test-localization.result == 'failure' }}
    steps:
      - uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6
        with:
          github-token: ${{ secrets.CAMPERBOT_NO_TRANSLATE }}
          script: |
            const isDev = await github.rest.teams.getMembershipForUserInOrg({
              org: "freeCodeCamp",
              team_slug: "dev-team",
              username: context.payload.pull_request.user.login
            }).catch(() => ({status: 404}));
            if (context.payload.pull_request.user.login !== "camperbot" && isDev.status !== 200) {
              github.rest.issues.createComment({
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                body: "Hi,\n\nIt looks like the localization tests have failed. This is expected when there are significant curriculum changes in the English version.\n\nThis could mean a Crowdin sync is required to address the scenario. Please check with our staff developer team, either on [Discord](https://discord.gg/KVUmVXA) or our [forums](https://forum.freecodecamp.org). They will confirm and take over helping you through the PR.\n\nThanks for your understanding and contribution."
              })
            } else if (isDev.status === 200) {
              core.setFailed('This PR appears to touch translated curriculum files, but since you are on the dev team there is no message.');
            }
