From 40ccd1501b25a7b36c9fd1700af2bb38f1f0fd04 Mon Sep 17 00:00:00 2001
From: Alexei Znamensky <103110+russoz@users.noreply.github.com>
Date: Sat, 30 Oct 2021 19:11:57 +1300
Subject: [PATCH] pipx - fixed bug in state=inject (#3611)

* pipx - fixed bug in state=inject

* added changelog fragment

* copy/paste error in the integration test

* replaced injected package with simpler one

* testing force_lang = None

* disable UTF-8 emojis in pipx output

* better way to achieve the same outcome

* Adjsuted the changelog fragment
---
 changelogs/fragments/3611-pipx-fix-inject.yml |  3 ++
 plugins/modules/packaging/language/pipx.py    |  5 ++-
 tests/integration/targets/pipx/tasks/main.yml | 34 +++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 changelogs/fragments/3611-pipx-fix-inject.yml

diff --git a/changelogs/fragments/3611-pipx-fix-inject.yml b/changelogs/fragments/3611-pipx-fix-inject.yml
new file mode 100644
index 0000000000..19433b2cb8
--- /dev/null
+++ b/changelogs/fragments/3611-pipx-fix-inject.yml
@@ -0,0 +1,3 @@
+bugfixes:
+    - pipx - ``state=inject`` was failing to parse the list of injected packages (https://github.com/ansible-collections/community.general/pull/3611).
+    - pipx - set environment variable ``USE_EMOJI=0`` to prevent errors in platforms that do not support ``UTF-8`` (https://github.com/ansible-collections/community.general/pull/3611).
diff --git a/plugins/modules/packaging/language/pipx.py b/plugins/modules/packaging/language/pipx.py
index 5dd7ffacb1..53c085ed61 100644
--- a/plugins/modules/packaging/language/pipx.py
+++ b/plugins/modules/packaging/language/pipx.py
@@ -176,6 +176,9 @@ class PipX(CmdStateModuleHelper):
         _list=dict(fmt=('list', '--include-injected', '--json'), style=ArgFormat.BOOLEAN),
     )
     check_rc = True
+    run_command_fixed_options = dict(
+        environ_update={'USE_EMOJI': '0'}
+    )
 
     def _retrieve_installed(self):
         def process_list(rc, out, err):
@@ -188,7 +191,7 @@ class PipX(CmdStateModuleHelper):
                 results[venv_name] = {
                     'version': venv['metadata']['main_package']['package_version'],
                     'injected': dict(
-                        (k, v['package_version']) for k, v in venv['metadata']['injected_packages']
+                        (k, v['package_version']) for k, v in venv['metadata']['injected_packages'].items()
                     ),
                 }
             return results
diff --git a/tests/integration/targets/pipx/tasks/main.yml b/tests/integration/targets/pipx/tasks/main.yml
index b48b83fc71..67f65b9a48 100644
--- a/tests/integration/targets/pipx/tasks/main.yml
+++ b/tests/integration/targets/pipx/tasks/main.yml
@@ -90,3 +90,37 @@
         - downgrade_tox_324.application.tox.version == '3.24.0'
         - uninstall_tox_324 is changed
         - "'tox' not in uninstall_tox_324.application"
+
+##############################################################################
+- name: ensure application ansible-lint is uninstalled
+  community.general.pipx:
+    name: ansible-lint
+    state: absent
+
+- name: install application ansible-lint
+  community.general.pipx:
+    name: ansible-lint
+  register: install_ansible_lint
+
+- name: inject packages
+  community.general.pipx:
+    state: inject
+    name: ansible-lint
+    inject_packages:
+      - licenses
+  register: inject_pkgs_ansible_lint
+
+- name: cleanup ansible-lint
+  community.general.pipx:
+    state: absent
+    name: ansible-lint
+  register: uninstall_ansible_lint
+
+- name: check assertions inject_packages
+  assert:
+    that:
+        - install_ansible_lint is changed
+        - inject_pkgs_ansible_lint is changed
+        - '"ansible-lint" in inject_pkgs_ansible_lint.application'
+        - '"licenses" in inject_pkgs_ansible_lint.application["ansible-lint"]["injected"]'
+        - uninstall_ansible_lint is changed