# Test code for the package module.
# (c) 2017, James Tanner <tanner.jc@gmail.com>

# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.

# Verify correct default package manager for Fedora
# Validates: https://github.com/ansible/ansible/issues/34014
- block:
    - name: install apt
      dnf:
        name: apt
        state: present
    - name: gather facts again
      setup:
    - name: validate output
      assert:
        that:
          - 'ansible_pkg_mgr in ("dnf", "dnf5")'
  always:
    - name: remove apt
      dnf:
        name: apt
        state: absent
    - name: gather facts again
      setup:
  when: ansible_distribution == "Fedora"

# Verify correct default package manager for Debian/Ubuntu when Zypper installed
- block:
    # Just make an executable file called "zypper" - installing zypper itself
    # consistently is hard - and we're not going to use it
    - name: install fake zypper
      file:
        state: touch
        mode: 0755
        path: /usr/bin/zypper
    - name: gather facts again
      setup:
    - name: validate output
      assert:
        that:
          - 'ansible_pkg_mgr == "apt"'
  always:
    - name: remove fake zypper
      file:
        path: /usr/bin/zypper
        state: absent
    - name: gather facts again
      setup:
  when: ansible_os_family == "Debian"

##
## package
##

# Verify module_defaults for package and the underlying module are utilized
# Validates: https://github.com/ansible/ansible/issues/72918
- block:
    # 'name' is required
    - name: install apt with package defaults
      package:
      module_defaults:
        package:
          name: apt
          state: present

    - name: install apt with dnf defaults (auto)
      package:
      module_defaults:
        dnf:
          name: apt
          state: present

    - name: install apt with dnf defaults (use dnf)
      package:
        use: dnf
      module_defaults:
        dnf:
          name: apt
          state: present
  always:
    - name: remove apt
      dnf:
        name: apt
        state: absent
  when: ansible_distribution == "Fedora"

- name: define distros to attempt installing at on
  set_fact:
    package_distros:
        - RedHat
        - Fedora
        - Ubuntu

- block:
    - name: remove at package
      package:
        name: at
        state: absent
      register: at_check0

    - name: verify at command is missing
      shell: which at
      register: at_check1
      failed_when: at_check1.rc == 0

    - name: reinstall at package
      package:
          name: at
          state: present
      register: at_install0
    - debug: var=at_install0
    - name: validate results
      assert:
          that:
              - 'at_install0.changed is defined'
              - 'at_install0.changed'

    - name: verify at command is installed
      shell: which at

    - name: remove at package
      package:
        name: at
        state: absent
      register: at_install0

    - name: validate package removal
      assert:
        that:
          - "at_install0 is changed"

  when: ansible_distribution in package_distros

##
## dnf
##
#Validation for new parameter 'use' in dnf action plugin which aliases to 'use_backend'
#Issue: https://github.com/ansible/ansible/issues/70774
- block:
    - name: verify if using both the parameters 'use' and 'use_backend' throw error
      dnf:
        name: at
        state: present
        use_backend: dnf
        use: dnf
      ignore_errors: yes
      register: result

    - name: verify error
      assert:
        that:
          - "'parameters are mutually exclusive' in result.msg"
          - "not result is changed"

    - name: verify if package installation is successful using 'use' parameter
      dnf:
        name: at
        state: present
        use: dnf
      register: result

    - name: verify the result
      assert:
        that:
          - "result is changed"

    - name: remove at package
      dnf:
        name: at
        state: absent
        use: dnf
      register: result

    - name: verify package removal
      assert:
        that:
          - "result is changed"

    - name: verify if package installation is successful using 'use_backend' parameter
      dnf:
        name: at
        state: present
        use_backend: dnf
      register: result

    - name: verify the result
      assert:
        that:
          - "result is changed"

    - name: remove at package
      dnf:
        name: at
        state: absent
        use_backend: dnf
      register: result

    - name: verify package removal
      assert:
        that:
          - "result is changed"

    - name: verify if package installation is successful without using 'use_backend' and 'use' parameters
      dnf:
        name: at
        state: present
      register: result

    - name: verify the result
      assert:
        that:
          - "result is changed"

    - name: remove at package
      dnf:
        name: at
        state: absent
      register: result

    - name: verify package removal
      assert:
        that:
          - "result is changed"

  when: ansible_distribution == "Fedora"


- name: test ansible_package_use
  block:
  - name: test with var
    package:
      name: doesnotmatter
    vars:
      ansible_package_use: lola
    ignore_errors: true
    register: use_to_use

  - assert:
      that:
        - use_to_use is failed
        - "'Could not find a matching action' in use_to_use['msg']"
