# Only use spaces to indent your .yml configuration.
# -----
# You can specify a custom docker image from Docker Hub as your build environment.
image:
  name: iterativ/skillbox-test:python-3.11.7

clone:
  depth: full

definitions:
  services:
    postgres:
      image: postgres
      variables:
        POSTGRES_HOST_AUTH_METHOD: trust
  caches:
    npm: $HOME/.npm
    cypress: $HOME/.cache/Cypress
    clientmodules: client/node_modules
  steps:
    - &lint
      name: lint
      caches:
        - clientmodules
      script:
        - npm install --prefix client
        - npm run lint --prefix client
    - &unittest-python
      name: run python unit tests
      caches:
        - pip
      services:
        - postgres
      script: # Modify the commands below to build your repository.
        - &setup-tests source setup-for-tests.sh
        - ./server/run_unittests_coverage.sh
    - &cypress-test
      name: run cypress end-to-end tests
      caches:
        - pip
        - node
        - clientmodules
        - npm
        - cypress
      artifacts:
        - client/cypress/**/*.png
        - client/cypress/**/*.mp4
      services:
        - postgres
      script:
        - echo "This pipeline rules!"
        - *setup-tests
        - export CYPRESS_DOWNLOAD_MIRROR=https://cy-cdn.currents.dev
        - npm ci --prefix client
        - npm run "install:cypress" --prefix client
        - psql -U $DATABASE_USER -h $DATABASE_HOST -c "create database $DATABASE_NAME"
        - python server/manage.py dummy_data
        - python server/manage.py runserver 2>&1 > /dev/null &
        - npm run build --prefix client
        - curl http://localhost:8000/beta-login
        - npm run --prefix client test:cypress:e2e
    - &frontend-test
      name: run cypress frontend tests
      caches:
        - node
        - clientmodules
        - npm
        - cypress
      artifacts:
        - client/cypress/**/*.png
        - client/cypress/**/*.mp4
      script:
        - export CYPRESS_DOWNLOAD_MIRROR=https://cy-cdn.currents.dev
        - npm ci --prefix client
        - npm run "install:cypress" --prefix client
        - npm run dev --prefix client 2>&1 > /dev/null &
        - curl http://localhost:8080/beta-login
        - npm run --prefix client test:cypress:frontend
    - &frontend-test-parallel
      name: run cypress frontend tests parallel
      caches:
        - node
        - clientmodules
        - npm
        - cypress
      artifacts:
        - client/cypress/**/*.png
        - client/cypress/**/*.mp4
      script:
        - export CYPRESS_DOWNLOAD_MIRROR=https://cy-cdn.currents.dev
        - npm ci --prefix client
        - npm run "install:cypress" --prefix client
        - npm run dev --prefix client 2>&1 > /dev/null &
        - sleep 5
        - curl http://localhost:8080/beta-login
        - npm run --prefix client currents
    - &component-test
      name: run cypress component tests
      caches:
        - node
        - clientmodules
        - npm
        - cypress
      artifacts:
        - client/cypress/**/*.png
        - client/cypress/**/*.mp4
      script:
        - npm ci --prefix client
        - npm run "install:cypress" --prefix client
        - npm run dev --prefix client 2>&1 > /dev/null &
        - curl http://localhost:8080/beta-login
        - npm run --prefix client cypress:component:test
    - &jest-test
      name: run jest tests
      caches:
        - node
        - clientmodules
      script:
        - echo "This pipeline rules!"
        - *setup-tests
        - npm install --prefix client
        - cd client
        - npm run test:unit
    - &deploy-dev
      name: deploy to dev on Heroku
      deployment: dev
      trigger: manual
      script:
        - git push --force https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-dev.git HEAD:master
    - &deploy-academy
      name: deploy to iterativ-academy on Heroku
      deployment: academy-stage
      script:
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/iterativ-academy.git HEAD:master
    - &deploy-stage
      name: deploy to stage on Heroku
      deployment: stage
      script:
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-stage.git develop:master
    - &deploy-preprod-manual
      name: deploy to pre-prod environments on heroku
      trigger: manual
      deployment: preprod
      script:
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-preprod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-kv-preprod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-dha-preprod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-dhf-preprod.git HEAD:master
    - &deploy-prod-manual
      name: deploy to prod environments on heroku
      trigger: manual
      deployment: prod
      script:
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-prod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-kv-prod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-dha-prod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-dhf-prod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/skillbox-preprod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-kv-preprod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-dha-preprod.git HEAD:master
        - git push https://heroku:$HEROKU_API_KEY@git.heroku.com/my-dhf-preprod.git HEAD:master

pipelines:
  default:
    - parallel:
        - step: *lint
        - step: *unittest-python
        - step: *cypress-test
        - step: *frontend-test-parallel
        - step: *frontend-test-parallel
        - step: *frontend-test-parallel
        - step: *frontend-test-parallel
        - step: *frontend-test-parallel
        - step: *frontend-test-parallel
        - step: *jest-test
    - step: *deploy-dev

  branches:
    master:
      - parallel:
          - step: *unittest-python
          - step: *cypress-test
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *jest-test
      - step: *deploy-preprod-manual

    develop:
      - parallel:
          - step: *lint
          - step: *unittest-python
          - step: *cypress-test
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *jest-test
      - parallel:
          - step: *deploy-stage
          - step: *deploy-academy
      - step: *deploy-preprod-manual

  tags:
    v202*:
      - parallel:
          - step: *unittest-python
          - step: *cypress-test
          - step: *jest-test
      - step: *deploy-prod-manual

  custom:
    cypress-parallel:
      - parallel:
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
          - step: *frontend-test-parallel
