#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.9'

pipeline {

  agent { label 'linux' }

  parameters {
    string(
      name: 'APK_BUILD_NUMBER',
      description: 'platform/e2e build number for apk artifact',
    )
    string(
      name: 'KEYWORD_EXPRESSION',
      description: 'This will run tests which contain names that match the given string expression  (Optional)',
      defaultValue: '',
    )
    string(
      name: 'BRANCH',
      description: 'Name of the branch to checkout and build.',
      defaultValue: 'develop',
    )
    string(
      name: 'TR_CASE_IDS',
      description: 'IDs of the TestRail case, separated by a comma (Optional)',
      defaultValue: '',
    )
  }

  options {
    disableConcurrentBuilds()
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '30',
      artifactNumToKeepStr: '1',
    ))
  }

  environment {
    /* Avoid race conditions with other builds using virtualenv. */
    VIRTUAL_ENV = "${WORKSPACE_TMP}/venv"
    PATH = "${VIRTUAL_ENV}/bin:${PATH}"
  }

  stages {
    stage('Fetch') {
      steps { script {
        copyArtifacts(
          projectName: "status-mobile/platforms/android-e2e",
          filter: 'result/*-x86_64.apk',
          selector: specific(env.APK_BUILD_NUMBER),
        )
        apk_path = "${env.WORKSPACE}/${utils.findFile('result/*-x86_64.apk')}"

      } }
    }

    stage('Setup') {
      steps { script {
        dir('test/appium') {
          sh "python3 -m venv ${VIRTUAL_ENV}"
          sh 'pip3 install -r requirements.txt'
        }
      } }
    }

    stage('Test') {
      steps {
        withCredentials([
          usernamePassword(
            credentialsId:  'test-rail-api',
            usernameVariable: 'TESTRAIL_USER',
            passwordVariable: 'TESTRAIL_PASS'
          ),
          usernamePassword(
            credentialsId:  'sauce-labs-api',
            usernameVariable: 'SAUCE_USERNAME',
            passwordVariable: 'SAUCE_ACCESS_KEY'
          ),
          string(
            credentialsId: 'etherscan-api-key',
            variable: 'ETHERSCAN_API_KEY'
          ),
          string(
            credentialsId: 'infura-e2e-token',
            variable: 'WEB3_INFURA_PROJECT_ID'
          ),
          file(
            credentialsId: "mobile-tests-eth-accounts",
            variable: 'TEST_ETH_ACCOUNTS_FILE'
          ),
        ]) {
          dir('test/appium/tests') {
            /* Provide Eth test accounts secrets. */
            sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
            sh """
              python3 -m pytest \
                --numprocesses 8 \
                --rerun_count=2 \
                --testrail_report=True \
                -m testrail_id \
                -m \"nightly\" \
                -k \"${params.KEYWORD_EXPRESSION}\" \
                --apk=${params.APK_URL ?: apk_path}
            """
          }
        }
      }
    }
  }

  post {
    always {
      script {
        sauce('sauce-labs-cred') {
          saucePublisher()
        }
      }
    }
    success {
      script {
        junit(
          testDataPublishers: [[$class: 'SauceOnDemandReportPublisher', jobVisibility: 'public']],
          testResults: 'test/appium/tests/*.xml'
        )
      }
    }
    cleanup {
      sh 'make purge'
    }
  }
}