diff --git a/.github/BOTMETA.yml b/.github/BOTMETA.yml index 8fc8bb32e80..746cb006190 100644 --- a/.github/BOTMETA.yml +++ b/.github/BOTMETA.yml @@ -536,7 +536,7 @@ files: $modules/packaging/language/maven_artifact.py: chrisisbeef tumbl3w33d $modules/packaging/language/npm.py: ignored: chrishoffman - maintainers: shane-walker + maintainers: shane-walker xcambar $modules/packaging/language/pear.py: $modules/packaging/language/pip.py: lujeni robinro $modules/packaging/os/apk.py: diff --git a/lib/ansible/modules/packaging/language/npm.py b/lib/ansible/modules/packaging/language/npm.py index 25621870243..331265dde1b 100644 --- a/lib/ansible/modules/packaging/language/npm.py +++ b/lib/ansible/modules/packaging/language/npm.py @@ -185,7 +185,7 @@ class Npm(object): return '' def list(self): - cmd = ['list', '--json'] + cmd = ['list', '--json', '--long'] installed = list() missing = list() diff --git a/test/integration/targets/npm/aliases b/test/integration/targets/npm/aliases new file mode 100644 index 00000000000..d893e18e8af --- /dev/null +++ b/test/integration/targets/npm/aliases @@ -0,0 +1,3 @@ +posix/ci/group2 +destructive +skip/freebsd diff --git a/test/integration/targets/npm/tasks/main.yml b/test/integration/targets/npm/tasks/main.yml new file mode 100644 index 00000000000..52c65ccbec0 --- /dev/null +++ b/test/integration/targets/npm/tasks/main.yml @@ -0,0 +1,35 @@ +# test code for the npm module + +# 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 . + + +# ------------------------------------------------------------- +# Setup steps + +# expand remote path +- command: 'echo {{ output_dir }}' + register: echo +- set_fact: + remote_dir: '{{ echo.stdout }}' + +- include_tasks: run.yml + vars: + nodejs_version: '{{ item }}' + nodejs_path: 'node-v{{ nodejs_version }}-{{ ansible_system|lower }}-x{{ ansible_userspace_bits }}' + with_items: + - 7.10.1 # provides npm 4.2.0 (last npm < 5 released) + - 8.0.0 # provides npm 5.0.0 + - 8.2.0 # provides npm 5.3.0 (output change with this version) diff --git a/test/integration/targets/npm/tasks/run.yml b/test/integration/targets/npm/tasks/run.yml new file mode 100644 index 00000000000..53b374fa63f --- /dev/null +++ b/test/integration/targets/npm/tasks/run.yml @@ -0,0 +1,2 @@ +- include_tasks: setup.yml +- include_tasks: test.yml diff --git a/test/integration/targets/npm/tasks/setup.yml b/test/integration/targets/npm/tasks/setup.yml new file mode 100644 index 00000000000..0ab66fcdc01 --- /dev/null +++ b/test/integration/targets/npm/tasks/setup.yml @@ -0,0 +1,6 @@ +- name: 'Download NPM' + unarchive: + src: 'https://nodejs.org/dist/v{{ nodejs_version }}/{{ nodejs_path }}.tar.gz' + dest: '{{ output_dir }}' + remote_src: yes + creates: '{{ output_dir }}/{{ nodejs_path }}.tar.gz' diff --git a/test/integration/targets/npm/tasks/test.yml b/test/integration/targets/npm/tasks/test.yml new file mode 100644 index 00000000000..ea2dd5b9f9b --- /dev/null +++ b/test/integration/targets/npm/tasks/test.yml @@ -0,0 +1,69 @@ +- name: 'Remove any node modules' + file: + path: '{{ remote_dir }}/node_modules' + state: absent + +- vars: + # sample: node-v8.2.0-linux-x64.tar.xz + node_path: '{{ remote_dir }}/{{ nodejs_path }}/bin' + package: 'iconv-lite' + block: + - shell: npm --version + environment: + PATH: '{{ node_path }}:{{ ansible_env.PATH }}' + register: npm_version + + - debug: + var: npm_version.stdout + + - name: 'Install simple package without dependency' + npm: + path: '{{ remote_dir }}' + executable: '{{ node_path }}/npm' + state: present + name: '{{ package }}' + environment: + PATH: '{{ node_path }}:{{ ansible_env.PATH }}' + register: npm_install + + - assert: + that: + - npm_install is success + - npm_install is changed + + - name: 'Reinstall simple package without dependency' + npm: + path: '{{ remote_dir }}' + executable: '{{ node_path }}/npm' + state: present + name: '{{ package }}' + environment: + PATH: '{{ node_path }}:{{ ansible_env.PATH }}' + register: npm_reinstall + + - name: Check there is no change + assert: + that: + - npm_reinstall is success + - not (npm_reinstall is changed) + + - name: 'Manually delete package' + file: + path: '{{ remote_dir }}/node_modules/{{ package }}' + state: absent + + - name: 'reinstall simple package' + npm: + path: '{{ remote_dir }}' + executable: '{{ node_path }}/npm' + state: present + name: '{{ package }}' + environment: + PATH: '{{ node_path }}:{{ ansible_env.PATH }}' + register: npm_fix_install + + - name: Check result is changed and successful + assert: + that: + - npm_fix_install is success + - npm_fix_install is changed