From 758a445d97b99af8a09fa603600f641c011ae93e Mon Sep 17 00:00:00 2001 From: Alexei Znamensky <103110+russoz@users.noreply.github.com> Date: Sun, 22 Mar 2026 18:32:59 +1300 Subject: [PATCH] npm: use uthelper for tests (#11639) --- tests/unit/plugins/modules/test_npm.py | 341 +---------------------- tests/unit/plugins/modules/test_npm.yaml | 240 ++++++++++++++++ 2 files changed, 244 insertions(+), 337 deletions(-) create mode 100644 tests/unit/plugins/modules/test_npm.yaml diff --git a/tests/unit/plugins/modules/test_npm.py b/tests/unit/plugins/modules/test_npm.py index 4d1a8f24d1..4eaf6c2e0a 100644 --- a/tests/unit/plugins/modules/test_npm.py +++ b/tests/unit/plugins/modules/test_npm.py @@ -1,345 +1,12 @@ -# -# Copyright (c) 2021, Abhijeet Kasurde +# Copyright (c) 2026 Alexei Znamensky (russoz@gmail.com) +# Copyright (c) 2021 Abhijeet Kasurde # GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) # SPDX-License-Identifier: GPL-3.0-or-later from __future__ import annotations -from unittest.mock import call, patch - -from ansible_collections.community.internal_test_tools.tests.unit.plugins.modules.utils import ( - AnsibleExitJson, - ModuleTestCase, - set_module_args, -) - from ansible_collections.community.general.plugins.modules import npm +from .uthelper import RunCommandMock, UTHelper -class NPMModuleTestCase(ModuleTestCase): - module = npm - - def setUp(self): - super().setUp() - ansible_module_path = "ansible_collections.community.general.plugins.modules.npm.AnsibleModule" - self.mock_run_command = patch(f"{ansible_module_path}.run_command") - self.module_main_command = self.mock_run_command.start() - self.mock_get_bin_path = patch(f"{ansible_module_path}.get_bin_path") - self.get_bin_path = self.mock_get_bin_path.start() - self.get_bin_path.return_value = "/testbin/npm" - - def tearDown(self): - self.mock_run_command.stop() - self.mock_get_bin_path.stop() - super().tearDown() - - def module_main(self, exit_exc): - with self.assertRaises(exit_exc) as exc: - self.module.main() - return exc.exception.args[0] - - def test_present(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "present"}): - self.module_main_command.side_effect = [ - (0, "{}", ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "install", "--global", "coffee-script"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_missing(self): - with set_module_args( - { - "name": "coffee-script", - "global": "true", - "state": "present", - } - ): - self.module_main_command.side_effect = [ - (0, '{"dependencies": {"coffee-script": {"missing" : true}}}', ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "install", "--global", "coffee-script"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_version(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "present", "version": "2.5.1"}): - self.module_main_command.side_effect = [ - (0, "{}", ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "install", "--global", "coffee-script@2.5.1"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_version_update(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "present", "version": "2.5.1"}): - self.module_main_command.side_effect = [ - (0, '{"dependencies": {"coffee-script": {"version" : "2.5.0"}}}', ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "install", "--global", "coffee-script@2.5.1"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_version_exists(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "present", "version": "2.5.1"}): - self.module_main_command.side_effect = [ - (0, '{"dependencies": {"coffee-script": {"version" : "2.5.1"}}}', ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertFalse(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_absent(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "absent"}): - self.module_main_command.side_effect = [ - (0, '{"dependencies": {"coffee-script": {"version" : "2.5.1"}}}', ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "uninstall", "--global", "coffee-script"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_absent_version(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "absent", "version": "2.5.1"}): - self.module_main_command.side_effect = [ - (0, '{"dependencies": {"coffee-script": {"version" : "2.5.1"}}}', ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "uninstall", "--global", "coffee-script"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_absent_version_different(self): - with set_module_args({"name": "coffee-script", "global": "true", "state": "absent", "version": "2.5.1"}): - self.module_main_command.side_effect = [ - (0, '{"dependencies": {"coffee-script": {"version" : "2.5.0"}}}', ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "list", "--json", "--long", "--global"], - check_rc=False, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - call( - ["/testbin/npm", "uninstall", "--global", "coffee-script"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_package_json(self): - with set_module_args({"global": "true", "state": "present"}): - self.module_main_command.side_effect = [ - (0, "{}", ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "install", "--global"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_package_json_production(self): - with set_module_args( - { - "production": "true", - "global": "true", - "state": "present", - } - ): - self.module_main_command.side_effect = [ - (0, "{}", ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "install", "--global", "--production"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_package_json_ci(self): - with set_module_args({"ci": "true", "global": "true", "state": "present"}): - self.module_main_command.side_effect = [ - (0, "{}", ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "ci", "--global"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) - - def test_present_package_json_ci_production(self): - with set_module_args({"ci": "true", "production": "true", "global": "true", "state": "present"}): - self.module_main_command.side_effect = [ - (0, "{}", ""), - (0, "{}", ""), - ] - - result = self.module_main(AnsibleExitJson) - - self.assertTrue(result["changed"]) - self.module_main_command.assert_has_calls( - [ - call( - ["/testbin/npm", "ci", "--global", "--production"], - check_rc=True, - cwd=None, - environ_update={"LANGUAGE": "C", "LC_ALL": "C"}, - ), - ] - ) +UTHelper.from_module(npm, __name__, mocks=[RunCommandMock]) diff --git a/tests/unit/plugins/modules/test_npm.yaml b/tests/unit/plugins/modules/test_npm.yaml new file mode 100644 index 0000000000..6494417e28 --- /dev/null +++ b/tests/unit/plugins/modules/test_npm.yaml @@ -0,0 +1,240 @@ +# Copyright (c) 2026 Alexei Znamensky (russoz@gmail.com) +# Copyright (c) 2021 Abhijeet Kasurde +# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt) +# SPDX-License-Identifier: GPL-3.0-or-later + +--- +anchors: + env_list: &env-list {check_rc: false, cwd: null, environ_update: {LANGUAGE: C, LC_ALL: C}} + env_exec: &env-exec {check_rc: true, cwd: null, environ_update: {LANGUAGE: C, LC_ALL: C}} + +test_cases: + - id: present + input: + name: coffee-script + global: true + state: present + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{}' + err: '' + - command: [/testbin/npm, install, --global, coffee-script] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_missing + input: + name: coffee-script + global: true + state: present + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{"dependencies": {"coffee-script": {"missing": true}}}' + err: '' + - command: [/testbin/npm, install, --global, coffee-script] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_version + input: + name: coffee-script + global: true + state: present + version: '2.5.1' + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{}' + err: '' + - command: [/testbin/npm, install, --global, 'coffee-script@2.5.1'] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_version_update + input: + name: coffee-script + global: true + state: present + version: '2.5.1' + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{"dependencies": {"coffee-script": {"version": "2.5.0"}}}' + err: '' + - command: [/testbin/npm, install, --global, 'coffee-script@2.5.1'] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_version_exists + input: + name: coffee-script + global: true + state: present + version: '2.5.1' + output: + changed: false + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{"dependencies": {"coffee-script": {"version": "2.5.1"}}}' + err: '' + + - id: absent + input: + name: coffee-script + global: true + state: absent + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{"dependencies": {"coffee-script": {"version": "2.5.1"}}}' + err: '' + - command: [/testbin/npm, uninstall, --global, coffee-script] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: absent_version + input: + name: coffee-script + global: true + state: absent + version: '2.5.1' + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{"dependencies": {"coffee-script": {"version": "2.5.1"}}}' + err: '' + - command: [/testbin/npm, uninstall, --global, coffee-script] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: absent_version_different + input: + name: coffee-script + global: true + state: absent + version: '2.5.1' + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{"dependencies": {"coffee-script": {"version": "2.5.0"}}}' + err: '' + - command: [/testbin/npm, uninstall, --global, coffee-script] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_package_json + input: + global: true + state: present + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{}' + err: '' + - command: [/testbin/npm, install, --global] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_package_json_production + input: + production: true + global: true + state: present + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, list, --json, --long, --global] + environ: *env-list + rc: 0 + out: '{}' + err: '' + - command: [/testbin/npm, install, --global, --production] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_package_json_ci + input: + ci: true + global: true + state: present + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, ci, --global] + environ: *env-exec + rc: 0 + out: '{}' + err: '' + + - id: present_package_json_ci_production + input: + ci: true + production: true + global: true + state: present + output: + changed: true + mocks: + run_command: + - command: [/testbin/npm, ci, --global, --production] + environ: *env-exec + rc: 0 + out: '{}' + err: ''