- name: initialize collection structure
  command: ansible-galaxy collection init {{ item }} --init-path "{{ galaxy_dir }}/dev/ansible_collections" {{ galaxy_verbosity }}
  loop:
    - 'dev.collection1'
    - 'dev.collection2'
    - 'dev.collection3'
    - 'dev.collection4'
    - 'dev.collection5'
    - 'dev.collection6'

- name: replace the default version of the collections
  lineinfile:
    path: "{{ galaxy_dir }}/dev/ansible_collections/dev/{{ item.name }}/galaxy.yml"
    line: "{{ item.version }}"
    regexp: "version: .*"
  loop:
    - name: "collection1"
      version: "version: null"
    - name: "collection2"
      version: "version: placeholder"
    - name: "collection3"
      version: "version: ''"

- name: set the namespace, name, and version keys to None
  lineinfile:
    path: "{{ galaxy_dir }}/dev/ansible_collections/dev/collection4/galaxy.yml"
    line: "{{ item.after }}"
    regexp: "{{ item.before }}"
  loop:
  - before: "^namespace: dev"
    after: "namespace:"
  - before: "^name: collection4"
    after: "name:"
  - before: "^version: 1.0.0"
    after: "version:"

- name: replace galaxy.yml content with a string
  copy:
    content: "invalid"
    dest: "{{ galaxy_dir }}/dev/ansible_collections/dev/collection5/galaxy.yml"

- name: remove galaxy.yml key required by build
  lineinfile:
    path: "{{ galaxy_dir }}/dev/ansible_collections/dev/collection6/galaxy.yml"
    line: "version: 1.0.0"
    state: absent

- name: list collections in development without semver versions
  command: ansible-galaxy collection list {{ galaxy_verbosity }}
  register: list_result
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"

- assert:
    that:
      - "'dev.collection1 *' in list_result.stdout"
      # Note the version displayed is the 'placeholder' string rather than "*" since it is not falsey
      - "'dev.collection2 placeholder' in list_result.stdout"
      - "'dev.collection3 *' in list_result.stdout"
      - "'dev.collection4 *' in list_result.stdout"
      - "'dev.collection5 *' in list_result.stdout"
      - "'dev.collection6 *' in list_result.stdout"

- name: list collections in human format
  command: ansible-galaxy collection list --format human
  register: list_result_human
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"

- assert:
    that:
      - "'dev.collection1 *' in list_result_human.stdout"
      # Note the version displayed is the 'placeholder' string rather than "*" since it is not falsey
      - "'dev.collection2 placeholder' in list_result_human.stdout"
      - "'dev.collection3 *' in list_result_human.stdout"
      - "'dev.collection5 *' in list_result.stdout"
      - "'dev.collection6 *' in list_result.stdout"

- name: list collections in yaml format
  command: ansible-galaxy collection list --format yaml
  register: list_result_yaml
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"

- assert:
    that:
      - "item.value | length == 6"
      - "item.value['dev.collection1'].version == '*'"
      - "item.value['dev.collection2'].version == 'placeholder'"
      - "item.value['dev.collection3'].version == '*'"
      - "item.value['dev.collection5'].version == '*'"
      - "item.value['dev.collection6'].version == '*'"
  with_dict: "{{ list_result_yaml.stdout | from_yaml }}"

- name: list collections in json format
  command: ansible-galaxy collection list --format json
  register: list_result_json
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"

- assert:
    that:
      - "item.value | length == 6"
      - "item.value['dev.collection1'].version == '*'"
      - "item.value['dev.collection2'].version == 'placeholder'"
      - "item.value['dev.collection3'].version == '*'"
      - "item.value['dev.collection5'].version == '*'"
      - "item.value['dev.collection6'].version == '*'"
  with_dict: "{{ list_result_json.stdout | from_json }}"

- name: list single collection in json format
  command: "ansible-galaxy collection list {{ item.key }} --format json"
  register: list_single_result_json
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"
  with_dict: "{{ { 'dev.collection1': '*', 'dev.collection2': 'placeholder', 'dev.collection3': '*' } }}"

- assert:
    that:
      - "(item.stdout | from_json)[galaxy_dir + '/dev/ansible_collections'][item.item.key].version == item.item.value"
  with_items: "{{ list_single_result_json.results }}"

- name: list single collection in yaml format
  command: "ansible-galaxy collection list {{ item.key }} --format yaml"
  register: list_single_result_yaml
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"
  with_dict: "{{ { 'dev.collection1': '*', 'dev.collection2': 'placeholder', 'dev.collection3': '*' } }}"

- assert:
    that:
      - "(item.stdout | from_yaml)[galaxy_dir + '/dev/ansible_collections'][item.item.key].version == item.item.value"
  with_items: "{{ list_single_result_json.results }}"

- name: test that no json is emitted when no collection paths are usable
  command: "ansible-galaxy collection list --format json"
  register: list_result_error
  ignore_errors: True
  environment:
    ANSIBLE_COLLECTIONS_PATH: "i_dont_exist"

- assert:
    that:
      - "'{}' not in list_result_error.stdout"

- name: install an artifact to the second collections path
  command: ansible-galaxy collection install namespace1.name1 -s galaxy_ng {{ galaxy_verbosity }} -p "{{ galaxy_dir }}/prod"
  environment:
    ANSIBLE_CONFIG: '{{ galaxy_dir }}/ansible.cfg'

- name: replace the artifact version
  lineinfile:
    path: "{{ galaxy_dir }}/prod/ansible_collections/namespace1/name1/MANIFEST.json"
    line: '  "version": null,'
    regexp: '  "version": .*'

- name: test listing collections in all paths
  command: ansible-galaxy collection list {{ galaxy_verbosity }}
  register: list_result
  ignore_errors: True
  environment:
    ANSIBLE_COLLECTIONS_PATH: "{{ galaxy_dir }}/dev:{{ galaxy_dir }}/prod"

- assert:
    that:
      - list_result is failed
      - "'is expected to have a valid SemVer version value but got None' in list_result.stderr"
