#!/usr/bin/env groovy

/*
 * Copyright (C) 2019 - present Instructure, Inc.
 *
 * This file is part of Canvas.
 *
 * Canvas is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License as published by the Free
 * Software Foundation, version 3 of the License.
 *
 * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Affero General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

library "canvas-builds-library@${env.CANVAS_BUILDS_REFSPEC}"
loadLocalLibrary('local-lib', 'build/new-jenkins/library')

pipeline {
  agent none
  options {
    ansiColor('xterm')
    timeout(15)
    timestamps()
  }

  environment {
    BUILD_REGISTRY_FQDN = configuration.buildRegistryFQDN()
    COMPOSE_FILE = 'docker-compose.new-jenkins.yml:docker-compose.new-jenkins-contract-tests.yml'
    POSTGRES_PASSWORD = 'sekret'
    PACT_BROKER = credentials('PACT_BROKER')
    PACT_BROKER_USERNAME = "${env.PACT_BROKER_USR}"
    PACT_BROKER_PASSWORD = "${env.PACT_BROKER_PSW}"
    RSPEC_PROCESSES = '7'
  }

  stages {
    stage('Environment') {
      steps {
        script {
          extendedStage('Runner').nodeRequirements(label: 'canvas-docker', podTemplate: contractTestsStage.nodeRequirementsTemplate()).obeysAllowStages(false).execute {
            def stages = [:]

            def consumerEnvVars = [
              'DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL=true',
              'RUN_API_CONTRACT_TESTS=1',
            ]

            callableWithDelegate(contractTestsStage.queueTestStage('Android'))(stages,
              databaseName: 'pact_test1',
              consumerName: 'android',
              envVars: consumerEnvVars,
              command: 'cd /usr/src/app && bundle exec rake pact:verify'
            )

            callableWithDelegate(contractTestsStage.queueTestStage('Canvas iOS'))(stages,
              databaseName: 'pact_test2',
              consumerName: 'canvas-ios',
              envVars: consumerEnvVars,
              command: 'cd /usr/src/app && bundle exec rake pact:verify'
            )

            callableWithDelegate(contractTestsStage.queueTestStage('Quiz LTI'))(stages,
              databaseName: 'pact_test3',
              consumerName: 'Quiz LTI',
              envVars: consumerEnvVars,
              command: 'cd /usr/src/app && bundle exec rake pact:verify'
            )

            callableWithDelegate(contractTestsStage.queueTestStage('Sistemic'))(stages,
              databaseName: 'pact_test4',
              consumerName: 'Sistemic',
              envVars: consumerEnvVars,
              command: 'cd /usr/src/app && bundle exec rake pact:verify'
            )

            callableWithDelegate(contractTestsStage.queueTestStage('Live Events'))(stages,
              databaseName: 'pact_test5',
              command: 'cd /usr/src/app && bin/rspec spec/contracts/service_consumers/live_events --tag pact_live_events --format doc'
            )

            callableWithDelegate(contractTestsStage.queueTestStage('Outcomes'))(stages,
              databaseName: 'pact_test6',
              envVars: [
                "PUBLISH_API=${configuration.isChangeMerged() ? '1' : '0'}",
                "SHA=${env.GERRIT_PATCHSET_REVISION}"
              ],
              command: 'cd /usr/src/app && build/new-jenkins/pact/contracts-generate-api.sh'
            )

            parallel(stages)
          }
        }
      }
    }
  }
}