# SPDX-License-Identifier: BSD-3-Clause
---
- hosts: all
  name: Setup for test running
  tasks:
    - include_tasks: tasks/el_repo_setup.yml

    - name: Install dependencies
      package:
        name: "{{ item }}"
        state: present
    # Ignore error because some package names might not be available
      ignore_errors: true
      loop:
        - NetworkManager-libnm
        - python2-gobject-base
        - python3-gobject-base
        - python-gobject-base
        - python2-mock

- hosts: all
  name: execute python unit tests
  tasks:
    - block:
        - name: create tempdir for code to test
          tempfile:
            state: directory
            prefix: lsrtest_
          register: _rundir

        - name: get tempfile for tar
          tempfile:
            prefix: lsrtest_
            suffix: ".tar"
          register: temptar
          delegate_to: localhost

        - include_tasks: tasks/get_modules_and_utils_paths.yml

      # TODO: using tar and copying the file is a workaround for the
      # synchronize module that does not work in test-harness. Related issue:
      # https://github.com/linux-system-roles/test-harness/issues/102
      #
        - name: Create Tar file
          command: >
            tar -cvf {{ temptar.path }} --exclude "*.pyc"
                --exclude "__pycache__"
                -C {{ modules_parent_and_dir.stdout_lines[0] }}
                {{ modules_parent_and_dir.stdout_lines[1] }}
                -C {{ module_utils_parent_and_dir.stdout_lines[0] }}
                {{ module_utils_parent_and_dir.stdout_lines[1] }}
          delegate_to: localhost

        - name: Copy testrepo.tar to the remote system
          copy:
            src: "{{ temptar.path }}"
            dest: "{{ _rundir.path }}"
            mode: preserve

        - name: Untar testrepo.tar
          command: tar -xvf {{ temptar.path | basename }}
          args:
            chdir: "{{ _rundir.path }}"

        - name: Create {{ _rundir.path }}/ansible/module_utils
          file:
            state: directory
            path: "{{ item }}"
            mode: "0755"
          loop:
            - "{{ _rundir.path }}/ansible"
            - "{{ _rundir.path }}/ansible/module_utils"

        - name: Move module_utils to ansible directory
          shell: |
            if [ -d {{ _rundir.path }}/module_utils ]; then
              mv {{ _rundir.path }}/module_utils {{ _rundir.path }}/ansible
            fi

        - name: Fake out python module directories, primarily for python2
          shell: |
            for dir in $(find {{ _rundir.path }} -type d -print); do
              if [ ! -f "$dir/__init__.py" ]; then
                touch "$dir/__init__.py"
              fi
            done

        - name: Copy unit test to remote system
          copy:
            src: unit/test_network_connections.py
            dest: "{{ _rundir.path }}"
            mode: preserve

        - name: Set _lsr_python_path
          set_fact:
            _lsr_python_path: "{{ _rundir.path ~ '/' ~ modules_parent_and_dir.stdout_lines[1] ~ ':' ~ _rundir.path ~ '/' ~ 'ansible' ~ '/' ~ module_utils_parent_and_dir.stdout_lines[1] ~ ':' ~ _rundir.path ~ '/' ~ module_utils_parent_and_dir.stdout_lines[1] ~ ':' ~ _rundir.path }}"

        - name: "ls -alrtFR {{ _rundir.path }}"
          command: ls -alrtFR {{ _rundir.path }}
        - debug:
            msg: path {{ _lsr_python_path }}

        - name: Check if python2 is available
          command: python2 --version
          ignore_errors: true
          register: python2_available
          when: true

        - name: Run python2 unit tests
          command: >
            python2 {{ _rundir.path }}/test_network_connections.py --verbose
          environment:
            PYTHONPATH: "{{ _lsr_python_path }}"
          when: >
            python2_available is succeeded and ansible_distribution != 'Fedora'
          register: python2_result

        - name: Check if python3 is available
          command: python3 --version
          ignore_errors: true
          register: python3_available
          when: true

        - name: Run python3 unit tests
          command: >
            python3 {{ _rundir.path }}/test_network_connections.py --verbose
          environment:
            PYTHONPATH: "{{ _lsr_python_path }}"
          when: python3_available is succeeded
          register: python3_result

        - name: Show python2 unit test results
          debug:
            var: python2_result.stderr_lines
          when: python2_result is succeeded

        - name: Show python3 unit test results
          debug:
            var: python3_result.stderr_lines
          when: python3_result is succeeded

      always:
        - name: remove local tar file
          file:
            state: absent
            path: "{{ temptar.path }}"
          delegate_to: localhost

        - name: remove tempdir
          file:
            state: absent
            path: "{{ _rundir.path }}"

    - name: Ensure that at least one python unit test ran
      fail:
        msg: Tests did not run with python2 or python3
      when: not python2_available is succeeded and not python3_available is succeeded
