variables:
  WPDESK_CI_VERSION: "1.2"
  MYSQL_ROOT_PASSWORD: "mysql"
  MYSQL_DATABASE: "wptest"
  MYSQL_USER: "mysql"
  MYSQL_PASSWORD: "mysql"
  MYSQL_INNODB_LOG_BUFFER_SIZE: "32M"
  PHP_ERROR_REPORTING: "E_ALL"
  COMPOSER_ALLOW_SUPERUSER: "1"
  GIT_STRATEGY: "fetch"
  CONTRIBUTORS: "wpdesk,dyszczo,grola,potreb"
  MINIMAL_WP_TESTED_UP: "5.3"
  MINIMAL_WC_TESTED_UP: "3.9"

stages:
  - prepare
  - tools
  - tests
  - pre-deploy
  - deploy

.template: &job-test-template
  cache:
    key: ${CI_PROJECT_NAME}-vendor
    paths:
      - vendor/
  stage: tests
  coverage: '/^\s*Lines:\s*\d+.\d+\%/'
  artifacts:
    reports:
      junit: tmp_artifacts/report.xml

.template: &job-test-integration-template
  <<: *job-test-template
  dependencies:
    - prepare prefixed vendor
  services:
    - mysql:5.6
  before_script:
    - export DEPENDENT_PLUGINS_DIR=${CI_PROJECT_DIR}/tests/dependent_plugins
    - echo ${WPDESK_CI_VERSION}
    - ls -l
    - php --version
    - cat /tmp/wordpress-develop/src/wp-includes/version.php
    - cat /tmp/woocommerce/woocommerce.php
    - COMPOSER_MEMORY_LIMIT=-1 composer install --no-progress --prefer-dist
    - ln -s $CI_PROJECT_DIR /tmp/wordpress-develop/src/wp-content/plugins/$CI_PROJECT_NAME
  script:
    - vendor/bin/phpunit -d memory_limit=-1 --configuration phpunit-integration.xml --coverage-text --colors=never --log-junit tmp_artifacts/report.xml
  only:
    - master
  except:
    variables:
      - $DISABLE_COVERAGE

.template: &job-test-integration-template-fast
  <<: *job-test-integration-template
  script:
    - vendor/bin/phpunit  -d memory_limit=-1 --configuration phpunit-integration.xml --no-coverage --log-junit tmp_artifacts/report.xml
  except:
    - tags
  only:

.template: &job-test-unit-template
  <<: *job-test-template
  script:
    - echo ${WPDESK_CI_VERSION}
    - ls -l
    - php --version
    - cat /tmp/wordpress-develop/src/wp-includes/version.php
    - cat /tmp/woocommerce/woocommerce.php
    - COMPOSER_MEMORY_LIMIT=-1 composer install --no-progress --prefer-dist
    - vendor/bin/phpunit  -d memory_limit=-1 --configuration phpunit-unit.xml --coverage-text --colors=never --log-junit tmp_artifacts/report.xml
  only:
    - master
  except:
    variables:
      - $DISABLE_COVERAGE

.template: &job-test-unit-template-fast
  <<: *job-test-template
  script:
    - echo ${WPDESK_CI_VERSION}
    - ls -l
    - php --version
    - cat /tmp/wordpress-develop/src/wp-includes/version.php
    - cat /tmp/woocommerce/woocommerce.php
    - COMPOSER_MEMORY_LIMIT=-1 composer install --no-progress --prefer-dist
    - vendor/bin/phpunit  -d memory_limit=-1 --configuration phpunit-unit.xml --no-coverage --log-junit tmp_artifacts/report.xml

.template: &job-deploy-template
  image: wpdesknet/amazon-svn-deploy
  stage: deploy
  dependencies:
    - build to deploy
    - unit test lastest coverage
    - integration test lastest coverage
  retry: 2
  when: manual
  only:
    - tags

.template: &docs-generation
  image:
    name: wpdesknet/apigen
  stage: pre-deploy
  artifacts:
    expire_in: 1 day
    name: "docs"
    paths:
      - docs/
  script:
    - echo ${WPDESK_CI_VERSION}
    - ls -l
    - /app/vendor/bin/apigen generate
    - php /app/hooks-docs.php ${CI_PROJECT_DIR}

before_script:
  - cd ${CI_PROJECT_DIR}

prepare prefixed vendor:
  image: wpdesknet/phpunit-woocommerce:0-0
  stage: prepare
  artifacts:
    name: "vendor_prefixed"
    paths:
      - vendor_prefixed
      - lang
      - assets
      - tests/dependent_plugins
  script:
    - export DEPENDENT_PLUGINS_DIR=${CI_PROJECT_DIR}/tests/dependent_plugins
    - echo ${DEPENDENT_PLUGINS_DIR}
    - echo ${WPDESK_CI_VERSION}
    - php --version
    - ls -l
    - COMPOSER_MEMORY_LIMIT=-1 && php -d memory_limit=-1 /usr/local/bin/composer install
    - mkdir -p ${DEPENDENT_PLUGINS_DIR}
    - if [[ -f tests/integration/prepare.sh ]]; then sh tests/integration/prepare.sh; fi
    - if [[ -f tests/codeception/prepare.sh ]]; then sh tests/codeception/prepare.sh; fi

phpmetric metrics:
  stage: tools
  image: wpdesknet/phpunit-woocommerce:0-0
  allow_failure: true
  when: manual
  artifacts:
    when: always
    expire_in: 1 month
    name: "metrics"
    paths:
      - ${CI_PROJECT_DIR}/phpmetric
  script:
    - echo ${WPDESK_CI_VERSION}
    - composer require phpmetrics/phpmetrics
    - composer install --no-progress --prefer-dist
    - php ./vendor/bin/phpmetrics --report-html=phpmetric .

churn metrics:
  stage: tools
  image: wpdesknet/phpunit-woocommerce:0-0
  allow_failure: true
  when: manual
  script:
    - echo ${WPDESK_CI_VERSION}
    - composer require bmitch/churn-php
    - composer install --no-progress --prefer-dist
    - vendor/bin/churn run classes inc

#code style test:
# stage: tests
#  image: wpdesknet/phpunit-woocommerce:0-0
#  allow_failure: true
#  script:
#    - echo ${WPDESK_CI_VERSION}
#    - composer install --no-progress --prefer-dist
#    - vendor/bin/phpcs

unit test lastest:
  <<: *job-test-unit-template-fast
  image: wpdesknet/phpunit-woocommerce:0-0

integration test lastest:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:0-0
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS

unit test lastest coverage:
  <<: *job-test-unit-template
  image: wpdesknet/phpunit-woocommerce:0-0

integration test lastest coverage:
  <<: *job-test-integration-template
  image: wpdesknet/phpunit-woocommerce:0-0
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS
      - $DISABLE_COVERAGE

integration test php7-1 wc-1:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:1-1
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS

integration test php7 wc-2:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:2-2
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS

integration test php-7 wc-3:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:2-3
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS

integration test php5-6:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:3-0
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS

integration test php5-5:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:4-0
  except:
    variables:
      - $DISABLE_PHP_5_5
      - $DISABLE_INTEGRATION_TESTS

integration test current woocommerce:
  <<: *job-test-integration-template-fast
  image: wpdesknet/phpunit-woocommerce:0-0
  allow_failure: true
  before_script:
    - export DEPENDENT_PLUGINS_DIR=${CI_PROJECT_DIR}/tests/dependent_plugins
    - cd ${CI_PROJECT_DIR}
    - mkdir -p .tmp
    - cd .tmp
    - if [[ ! -d woocommerce ]]; then git clone https://github.com/woocommerce/woocommerce.git; fi
    - cd woocommerce
    - git pull
    - ln -s ${CI_PROJECT_DIR}/.tmp/woocommerce /tmp/woocommerce
    - cat /tmp/wordpress-develop/src/wp-includes/version.php
    - cat /tmp/woocommerce/woocommerce.php
    - cd ${CI_PROJECT_DIR}
    - COMPOSER_MEMORY_LIMIT=-1 composer install --no-progress --prefer-dist
    - ln -s $CI_PROJECT_DIR /tmp/wordpress-develop/src/wp-content/plugins/$CI_PROJECT_NAME
  except:
    variables:
      - $DISABLE_INTEGRATION_TESTS

apigen docs:
  <<: *docs-generation
  allow_failure: true
  only:
    - tags

apigen docs refresh:
  <<: *docs-generation
  when: manual

pages:
  stage: deploy
  dependencies:
    - apigen docs
  script:
    - rm -rf public
    - mv docs/ public/
    - 'curl -X POST --data-urlencode "payload={\"text\": \"Dokumentacja projektu ${CI_PROJECT_NAME} w wersji ${CI_COMMIT_REF_NAME} umieszczona w <https://gitlab.com/wpdesk/${CI_PROJECT_NAME}/pages|pages> \", }" https://hooks.slack.com/services/${SLACK_AUTH}'
  artifacts:
    expire_in: 1 day
    paths:
      - public
  only:
    - tags

build to deploy:
  image: wpdesknet/phpunit-woocommerce:3-0
  stage: pre-deploy
  dependencies:
    - prepare prefixed vendor
  artifacts:
    name: "production release"
    paths:
      - release
      - release.zip
  script:
    - echo ${WPDESK_CI_VERSION}
    - php --version
    - ls -l
    - /tmp/set_version.sh ${CI_COMMIT_REF_NAME}
    - rm -rf ${CI_PROJECT_DIR}/release ${CI_PROJECT_DIR}/release.zip /tmp/release
    - mkdir /tmp/release
    - mkdir -p ${CI_PROJECT_DIR}/release/${CI_PROJECT_NAME}
    - cp -rf ${CI_PROJECT_DIR}/* /tmp/release
    - cp -rf /tmp/release/* ${CI_PROJECT_DIR}/release/${CI_PROJECT_NAME}
    - cd ${CI_PROJECT_DIR}/release/${CI_PROJECT_NAME}
    - COMPOSER_MEMORY_LIMIT=-1 && php -d memory_limit=-1 /usr/local/bin/composer install --no-dev --no-progress --optimize-autoloader --prefer-dist
    - rm -rf build-coverage release tests docs .git .editorconfig .gitignore .gitlab-ci.yml apigen.neon phpunit.xml acceptance test_soap.php .gitlab
    - rm -rf composer.json phpcs.xml.dist phpunit-integration.xml phpunit-unit.xml composer.phar wp-cli.phar functional tmp_artifacts .tmp tools codeception.dist.yml .env.testing wp-install.sh
    - rm -rf phpcs.xml.dist phpunit-integration.xml phpunit-unit.xml composer.phar wp-cli.phar functional tmp_artifacts scoper.inc.php phpstan.dist

    - find ./vendor -type d -name "tests" -exec rm -rf {} \; 2>/dev/null || (exit 0)
    - find ./vendor -name "LICENSE" -delete
    - find ./vendor -name "README.md" -delete
    - find ./vendor -name ".gitlab-ci.yml" -delete
    - cd ../
    - zip -r -q ../release.zip ./
  only:
    - tags
  except:
    variables:
      - $IS_LIBRARY

deploy to shop:
  <<: *job-deploy-template
  script:
    - echo ${WPDESK_CI_VERSION}
    - /tmp/deploy_shop.sh ${CI_PROJECT_NAME} release.zip ${CI_PROJECT_NAME}.zip
    - 'curl -X POST --data-urlencode "payload={\"text\": \"Projekt <https://gitlab.com/wpdesk/${CI_PROJECT_NAME}|${CI_PROJECT_NAME}> zdeployowany do sklepu w wersji ${CI_COMMIT_REF_NAME}\", }" https://hooks.slack.com/services/${SLACK_AUTH}'
  environment:
    name: wpdesk shop
    url: https://wpdeskplugin.s3.amazonaws.com/${CI_PROJECT_NAME}.zip
  except:
    variables:
      - $IS_LIBRARY

deploy to demo:
  <<: *job-deploy-template
  script:
    - echo ${WPDESK_CI_VERSION}
    - /tmp/deploy_demo.sh release/${CI_PROJECT_NAME} ${CI_PROJECT_NAME}
    - 'curl -X POST --data-urlencode "payload={\"text\": \"Projekt <https://gitlab.com/wpdesk/${CI_PROJECT_NAME}|${CI_PROJECT_NAME}> zdeployowany do demo w wersji ${CI_COMMIT_REF_NAME}\", }" https://hooks.slack.com/services/${SLACK_AUTH}'
  environment:
    name: wpdesk demo
    url: https://demo.wpdesk.org
  except:
    variables:
      - $IS_LIBRARY

deploy to repository:
  <<: *job-deploy-template
  cache:
    key: ${CI_PROJECT_NAME}-svn
    paths:
      - svn-repository
  script:
    - echo ${WPDESK_CI_VERSION}
    - mkdir -p ${CI_PROJECT_DIR}/svn-repository
    - rm -f ${CI_PROJECT_DIR}/release/${CI_PROJECT_NAME}/lang/*.po ${CI_PROJECT_DIR}/release/${CI_PROJECT_NAME}/lang/*.mo
    - /tmp/deploy_repository.sh ${CI_PROJECT_NAME} ${CI_PROJECT_DIR}/release/${CI_PROJECT_NAME} ${CI_PROJECT_DIR}/svn-repository/${CI_PROJECT_NAME}
    - 'curl -X POST --data-urlencode "payload={\"text\": \"Projekt <https://gitlab.com/wpdesk/${CI_PROJECT_NAME}|${CI_PROJECT_NAME}> zdeployowany do repozytorium WP w wersji ${CI_COMMIT_REF_NAME}\", }" https://hooks.slack.com/services/${SLACK_AUTH}'
  environment:
    name: wordpress repository
    url: https://downloads.wordpress.org/plugin/${CI_PROJECT_NAME}.${CI_COMMIT_REF_NAME}.zip
  except:
    variables:
      - $IS_LIBRARY


library:
  image: wpdesknet/phpunit-woocommerce:3-0
  stage: deploy
  artifacts:
    expire_in: 1 year
    name: "${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}"
    paths:
      - wp-desk
  script:
    - rm -rf ${CI_PROJECT_DIR}/wp-desk
    - mkdir -p /tmp/wp-desk
    - mkdir -p ${CI_PROJECT_DIR}/wp-desk/${CI_PROJECT_NAME}
    - cp -rf ${CI_PROJECT_DIR}/* /tmp/wp-desk
    - cp -rf /tmp/wp-desk/* ${CI_PROJECT_DIR}/wp-desk/${CI_PROJECT_NAME}
    - cd ${CI_PROJECT_DIR}/wp-desk/${CI_PROJECT_NAME}
    - COMPOSER_MEMORY_LIMIT=-1 && php -d memory_limit=-1 /usr/local/bin/composer install --no-dev --no-progress --optimize-autoloader --prefer-dist
    - rm -rf build-coverage wp-desk release tests docs .git .editorconfig .gitignore .gitlab-ci.yml apigen.neon phpunit.xml acceptance test_soap.php .gitlab
    - rm -rf composer.json composer.lock phpcs.xml.dist phpunit-integration.xml phpunit-unit.xml composer.phar wp-cli.phar functional tmp_artifacts .tmp tools
  only:
    variables:
      - $IS_LIBRARY

.template: &job-codeception-test
  image: wpdesknet/wordpresscli:22
  cache:
    key: ${CI_PROJECT_NAME}-vendor
    paths:
      - vendor/
  variables:
    WP_CLI_CACHE_DIR: /cache/wp-cli
    APACHE_DOCUMENT_ROOT: ${CI_PROJECT_DIR}/tests/wordpress
    CI_DEBUG_SERVICES: trace
    SCREEN_WIDTH: 1200
    SCREEN_HEIGHT: 1600
    JAVA_OPTS: -Xmx1024m
  services:
    - name: mysql:5.6
      alias: mysqltests
    - name: wpdesknet/wordpress:49
      alias: wootests
    - name: selenium/standalone-chrome:latest
      alias: chrome
  artifacts:
    when: always
    expire_in: 1 month
    name: "acceptance logs"
    paths:
      - tests/codeception/tests/_output
      - ${APACHE_DOCUMENT_ROOT}
    reports:
      junit: tests/codeception/tests/_output/report.xml
  stage: tests
  except:
    variables:
      - $DISABLE_CODECEPTION
  allow_failure: false
  before_script:
    - export DEPENDENT_PLUGINS_DIR=${CI_PROJECT_DIR}/tests/dependent_plugins
    - mkdir -p /cache/wp-cli
    - export MYSQL_IP=$(awk '/^[[:space:]]*($|#)/{next} /mysqltests/{print $1; exit}' /etc/hosts)
    - export WOOTESTS_IP=$(awk '/^[[:space:]]*($|#)/{next} /wootests/{print $1; exit}' /etc/hosts)
    - cd ${CI_PROJECT_DIR}
    - pwd
    - composer install --prefer-dist --no-progress --no-dev
    - mkdir -p /tmp/project
    - cp -r ${CI_PROJECT_DIR}/. /tmp/project
    - composer install --prefer-dist --no-progress
    - mkdir -p ${APACHE_DOCUMENT_ROOT}
    - cd ${APACHE_DOCUMENT_ROOT}
    - wp core download ${WORDPRESS_CLI_PARAMETERS} --allow-root
    - wp config create --dbhost=${MYSQL_IP} --dbname=wptest --dbuser=mysql --dbpass=mysql --allow-root
    - wp config set WP_DEBUG true --raw --type=constant --allow-root
    - cp -r /tmp/project/. ${APACHE_DOCUMENT_ROOT}/wp-content/plugins/${CI_PROJECT_NAME}
    - chmod a+x ${CI_PROJECT_DIR}/tests/codeception/bootstrap.sh
    - cd ${CI_PROJECT_DIR}
    - . ./tests/codeception/bootstrap.sh
    - rm ${APACHE_DOCUMENT_ROOT}/wp-content/debug.log
    - chmod o+w ${APACHE_DOCUMENT_ROOT}/wp-content
    - chmod g+w ${APACHE_DOCUMENT_ROOT}/wp-content
    - mkdir -p ${CI_PROJECT_DIR}/tests/codeception/tests/_output
    - mkdir -p ${CI_PROJECT_DIR}/tests/codeception/tests/acceptance
    - mkdir -p ${CI_PROJECT_DIR}/tests/codeception/tests/functional
    - mkdir -p ${CI_PROJECT_DIR}/tests/codeception/tests/unit
    - chmod -R a+w ${APACHE_DOCUMENT_ROOT}/wp-content/uploads
    - echo "End before"
  script:
    - vendor/bin/codecept run --steps --xml --html --debug

codeception test:
  <<: *job-codeception-test
  script:
    - vendor/bin/codecept run --steps --xml --html --debug

codeception test latest woocommerce:
  <<: *job-codeception-test
  variables:
    WP_CLI_CACHE_DIR: /cache/wp-cli
    APACHE_DOCUMENT_ROOT: ${CI_PROJECT_DIR}/tests/wordpress
    CI_DEBUG_SERVICES: trace
    SCREEN_WIDTH: 1200
    SCREEN_HEIGHT: 1600
    WOOCOMMERCE_VERSION: github
  allow_failure: true
  script:
    - vendor/bin/codecept run --steps --xml --html --debug