version: 2
jobs:
  build:
    docker:
      - image: penpotapp/devenv:latest
      - image: cimg/postgres:14.5
        environment:
          POSTGRES_USER: penpot_test
          POSTGRES_PASSWORD: penpot_test
          POSTGRES_DB: penpot_test
      - image: cimg/redis:7.0.5

    working_directory: ~/repo
    resource_class: medium+

    environment:
      JAVA_OPTS: -Xmx4g -Xms100m -XX:+UseSerialGC
      NODE_OPTIONS: --max-old-space-size=4096

    steps:
      - checkout

      # Download and cache dependencies
      - restore_cache:
         keys:
           - v1-dependencies-{{ checksum "backend/deps.edn" }}-{{ checksum "frontend/deps.edn"}}-{{ checksum "common/deps.edn"}}
           # fallback to using the latest cache if no exact match is found
           - v1-dependencies-

      - run: cd .clj-kondo && cat config.edn
      - run: cat .cljfmt.edn
      - run: clj-kondo --version

      - run:
          name: "backend fmt check"
          working_directory: "./backend"
          command: |
            yarn install
            yarn run fmt:clj:check

      - run:
          name: "exporter fmt check"
          working_directory: "./exporter"
          command: |
            yarn install
            yarn run fmt:clj:check

      - run:
          name: "common fmt check"
          working_directory: "./common"
          command: |
            yarn install
            yarn run fmt:clj:check

      - run:
          name: "frontend fmt check"
          working_directory: "./frontend"
          command: |
            yarn install
            yarn run fmt:clj:check

      - run:
          name: "common linter check"
          working_directory: "./common"
          command: |
            yarn install
            yarn run lint:clj

      - run:
          name: "frontend linter check"
          working_directory: "./frontend"
          command: |
            yarn install
            yarn run lint:scss
            yarn run lint:clj

      - run:
          name: "backend linter check"
          working_directory: "./backend"
          command: |
            yarn install
            yarn run lint:clj

      - run:
          name: "exporter linter check"
          working_directory: "./exporter"
          command: |
            yarn install
            yarn run lint:clj

      - run:
          name: "common tests"
          working_directory: "./common"
          command: |
            yarn test
            clojure -M:dev:test

      - run:
          name: "frontend tests"
          working_directory: "./frontend"
          command: |
            yarn install
            yarn test

      - run:
          name: "frontend integration tests"
          working_directory: "./frontend"
          command: |
            yarn install
            yarn run compile
            yarn run compile:cljs
            yarn playwright install --with-deps chromium
            yarn e2e:test

      - run:
          name: "backend tests"
          working_directory: "./backend"
          command: |
            clojure -M:dev:test

          environment:
            PENPOT_TEST_DATABASE_URI: "postgresql://localhost/penpot_test"
            PENPOT_TEST_DATABASE_USERNAME: penpot_test
            PENPOT_TEST_DATABASE_PASSWORD: penpot_test
            PENPOT_TEST_REDIS_URI: "redis://localhost/1"

      - save_cache:
         paths:
           - ~/.m2
         key: v1-dependencies-{{ checksum "backend/deps.edn" }}-{{ checksum "frontend/deps.edn"}}-{{ checksum "common/deps.edn"}}

