---

- name: set Tox command line fact
  set_fact:
    tox_command_line: >
        {{ tox_command }}
            {% if tox_envlist %} -e {{ tox_envlist | quote }} {% endif %}
            {{ tox_extra_args }}


- name: normalize white spaces from Tox command line
  set_fact:
    tox_command_line: '{{ tox_command_line.split() | join(" ") }}'


- name: initialize tox_env to empty dict for each test suite execution
  set_fact:
    tox_env: {}

- name: combine and normalize environment variable values
  set_fact:
    tox_env: >
      {{ tox_env |
         combine({ item.key: (item.value | string).strip() }) }}
  loop: >
    {{ ((tox_environment | from_yaml | dict2items) +
        (tox_constrain_env | dict2items)) }}
  when:
    - (item.value | string).strip()  # skip empty strings

- name: show tox variables
  debug: var="{{ item }}"
  loop:
    - tox_command_line
    - tox_description
    - tox_dir
    - tox_env
    - tox_expected_rcs

- name: "{{ tox_description }}"
  command:
    chdir: '{{ tox_dir }}'
    cmd: '{{ tox_command_line }}'
  register:
    run_tox
  environment: '{{ tox_env }}'
  failed_when: run_tox.rc != tox_succeeded_rc
  ignore_errors: yes


- name: reset values used to generate tox_constrain_env after executing a test suite
  set_fact:
    pytest_addopts: '{{ pytest_addopts_global }}'
    test_flaky: false
    pytest_markers: "{% if not test_flaky%}not flaky{% endif %}"
    pytest_maxfail: ''
    tox_constraints: ''
    tox_run_tests_timeout: 18000

- name: "show test cases errors"
  debug: var=run_tox.stderr_lines
  when:
    - run_tox is failed
    - (run_tox.stderr_lines | length) > 0


- name: 'raise test cases failure'
  debug:
    msg: 'test cases have failed'
  when: run_tox is failed
  failed_when:
    - not (ignore_test_failures | bool)
    - run_tox.rc not in tox_expected_rcs


- name: 'raise error in case of timeout'
  debug:
    msg: 'timeout during the execution of the tests'
  when: run_tox is failed
  failed_when:
    - (run_tox.stdout_lines | length) > 0
    - run_tox.stdout | regex_search('ERROR.*run_tests.py timeout out after')
