---
# this test just makes sure the task doesn't fail when we set out expected rc
- name: install broken msi override expected rc
  win_package:
    path: '{{test_win_package_path}}\bad.msi'
    state: present
    expected_return_code: 0,1603

- name: install local msi (check mode)
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: present
  register: install_local_msi_check
  check_mode: yes

- name: get result of install local msi (check mode)
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: install_local_msi_actual_check

- name: assert install local msi (check mode)
  assert:
    that:
    - install_local_msi_check is changed
    - install_local_msi_check.reboot_required == False
    - install_local_msi_actual_check.exists == False

- name: install local msi
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: present
    expected_return_code: "" # historical, an empty string means 0, 3010
  register: install_local_msi

- name: get result of install local msi
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: install_local_msi_actual

- name: assert install local msi
  assert:
    that:
    - install_local_msi is changed
    - install_local_msi.reboot_required == False
    - install_local_msi.rc == 0
    - install_local_msi_actual.exists == True

- name: install local msi (idempotent)
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: present
  register: install_local_msi_idempotent

- name: assert install local msi (idempotent)
  assert:
    that:
    - install_local_msi_idempotent is not changed

- name: uninstall local msi with path (check mode)
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: absent
  register: uninstall_path_local_msi_check
  check_mode: yes

- name: get result of uninstall local msi with path (check mode)
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: uninstall_path_local_msi_actual_check

- name: assert uninstall local msi with path (check mode)
  assert:
    that:
    - uninstall_path_local_msi_check is changed
    - uninstall_path_local_msi_check.reboot_required == False
    - uninstall_path_local_msi_actual_check.exists == True

- name: uninstall local msi with path
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: absent
  register: uninstall_path_local_msi

- name: get result of uninstall local msi with path
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: uninstall_path_local_msi_actual

- name: assert uninstall local msi with path
  assert:
    that:
    - uninstall_path_local_msi is changed
    - uninstall_path_local_msi.reboot_required == False
    - uninstall_path_local_msi.rc == 0
    - uninstall_path_local_msi_actual.exists == False

- name: uninstall local msi with path (idempotent)
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: absent
  register: uninstall_path_local_msi_idempotent

- name: assert uninstall local msi with path (idempotent)
  assert:
    that:
    - uninstall_path_local_msi_idempotent is not changed

- name: install url msi (check mode)
  win_package:
    path: '{{test_win_package_good_url}}'
    product_id: '{{test_win_package_good_id}}'
    state: present
  register: install_url_msi_check
  check_mode: yes

- name: get result of install url msi (check mode)
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: install_url_msi_actual_check

- name: assert install url msi (check mode)
  assert:
    that:
    - install_url_msi_check is changed
    - install_url_msi_check.reboot_required == False
    - install_url_msi_actual_check.exists == False

- name: install url msi
  win_package:
    path: '{{test_win_package_good_url}}'
    product_id: '{{test_win_package_good_id}}'
    state: present
  register: install_url_msi

- name: get result of install url msi
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: install_url_msi_actual

- name: assert install url msi
  assert:
    that:
    - install_url_msi is changed
    - install_url_msi.reboot_required == False
    - install_url_msi.rc == 0
    - install_url_msi_actual.exists == True

- name: install url msi (idempotent)
  win_package:
    path: '{{test_win_package_good_url}}'
    product_id: '{{test_win_package_good_id}}'
    state: present
  register: install_url_msi_again

- name: assert install url msi (idempotent)
  assert:
    that:
    - install_url_msi_again is not changed

- name: uninstall local msi with product_id (check mode)
  win_package:
    product_id: '{{test_win_package_good_id}}'
    state: absent
  register: uninstall_id_local_msi_check
  check_mode: yes

- name: get result of uninstall local msi with product_id (check mode)
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: uninstall_id_local_msi_actual_check

- name: assert uninstall local msi with product_id (check mode)
  assert:
    that:
    - uninstall_id_local_msi_check is changed
    - uninstall_id_local_msi_check.reboot_required == False
    - uninstall_id_local_msi_actual_check.exists == True

- name: uninstall local msi with product_id
  win_package:
    product_id: '{{test_win_package_good_id}}'
    state: absent
  register: uninstall_id_local_msi

- name: get result of uninstall local msi with product_id
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_good_id}}
  register: uninstall_id_local_msi_actual

- name: assert uninstall local msi with product_id
  assert:
    that:
    - uninstall_id_local_msi is changed
    - uninstall_id_local_msi.reboot_required == False
    - uninstall_id_local_msi.rc == 0
    - uninstall_id_local_msi_actual.exists == False

- name: uninstall local msi with product_id (idempotent)
  win_package:
    product_id: '{{test_win_package_good_id}}'
    state: absent
  register: uninstall_id_local_msi_idempotent

- name: assert uninstall local msi with product_id (idempotent)
  assert:
    that:
    - uninstall_id_local_msi_idempotent is not changed

- name: install local reboot msi (check mode)
  win_package:
    path: '{{test_win_package_path}}\reboot.msi'
    state: present
  register: install_local_reboot_msi_check
  check_mode: yes

- name: get result of install local reboot msi (check mode)
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_reboot_id}}
  register: install_local_reboot_msi_actual_check

- name: assert install local reboot msi (check mode)
  assert:
    that:
    - install_local_reboot_msi_check is changed
    - install_local_reboot_msi_check.reboot_required == False
    - install_local_reboot_msi_actual_check.exists == False

- name: install local reboot msi
  win_package:
    path: '{{test_win_package_path}}\reboot.msi'
    state: present
  register: install_local_reboot_msi

- name: get result of install local reboot msi
  win_reg_stat:
    path: HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{{test_win_package_reboot_id}}
  register: install_local_reboot_msi_actual

- name: assert install local reboot msi
  assert:
    that:
    - install_local_reboot_msi is changed
    - install_local_reboot_msi.reboot_required == True
    - install_local_reboot_msi.rc == 3010
    - install_local_reboot_msi_actual.exists == True

- name: install local reboot msi (idempotent)
  win_package:
    path: '{{test_win_package_path}}\reboot.msi'
    state: present
  register: install_local_reboot_msi_idempotent

- name: assert install local reboot msi (idempotent)
  assert:
    that:
    - install_local_reboot_msi_idempotent is not changed

- name: uninstall reboot msi after test
  win_package:
    path: '{{test_win_package_path}}\reboot.msi'
    state: absent

- name: ensure the install folder is cleaned in case uninstall didn't work
  win_file:
    path: '%ProgramFiles(x86)%\Bovine University'
    state: absent

- name: install local msi with arguments (check mode)
  win_package:
    path: '{{test_win_package_path}}\good.MSI'
    state: present
    arguments: ADDLOCAL=Cow
  register: install_msi_argument_check
  check_mode: yes

- name: get result of moo file after install local msi with arguments (check mode)
  win_stat:
    path: '%ProgramFiles(x86)%\Bovine University\moo.exe'
  register: install_msi_argument_moo_check

- name: get result of cow file after install local msi with arguments (check mode)
  win_stat:
    path: '%ProgramFiles(x86)%\Bovine University\cow.exe'
  register: install_msi_argument_cow_check

- name: assert install local msi with arguments (check mode)
  assert:
    that:
    - install_msi_argument_check is changed
    - install_msi_argument_check.reboot_required == False
    - install_msi_argument_moo_check.stat.exists == False
    - install_msi_argument_cow_check.stat.exists == False

- name: install local msi with arguments
  win_package:
    path: '{{test_win_package_path}}\good.MSI'
    state: present
    arguments: ADDLOCAL=Cow
  register: install_msi_argument

- name: get result of moo file after install local msi with arguments
  win_stat:
    path: '%ProgramFiles(x86)%\Bovine University\moo.exe'
  register: install_msi_argument_moo

- name: get result of cow file after install local msi with arguments
  win_stat:
    path: '%ProgramFiles(x86)%\Bovine University\cow.exe'
  register: install_msi_argument_cow

- name: assert install local msi with arguments
  assert:
    that:
    - install_msi_argument is changed
    - install_msi_argument.reboot_required == False
    - install_msi_argument.rc == 0
    - install_msi_argument_moo.stat.exists == False
    - install_msi_argument_cow.stat.exists == True

- name: install local msi with arguments (idempotent)
  win_package:
    path: '{{test_win_package_path}}\good.MSI'
    state: present
    arguments: ADDLOCAL=Cow
  register: install_msi_argument_again

- name: assert install local msi with arguments (idempotent)
  assert:
    that:
    - install_msi_argument_again is not changed

- name: uninstall good msi after test
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: absent

- name: create custom install directory for msi install
  win_file:
    path: '{{test_win_package_path_safe}}\good'
    state: directory

- name: install msi to custom path using string arguments
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: present
    arguments: ADDLOCAL=Cow INSTALLDIR={{test_win_package_path_safe}}\install
  register: install_msi_string_arguments

- name: get result of moo file after install local msi with string arguments
  win_stat:
    path: '{{test_win_package_path_safe}}\install\moo.exe'
  register: install_msi_string_arguments_moo

- name: get result of cow file after install local msi with string arguments
  win_stat:
    path: '{{test_win_package_path_safe}}\install\cow.exe'
  register: install_msi_string_arguments_cow

- name: assert results of install msi to custom path using string arguments
  assert:
    that:
    - install_msi_string_arguments is changed
    - install_msi_string_arguments.reboot_required == False
    - install_msi_string_arguments.rc == 0
    - install_msi_string_arguments_moo.stat.exists == False
    - install_msi_string_arguments_cow.stat.exists == True

- name: uninstall good msi after string argument test
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: absent

- name: install msi to custom path using list arguments
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: present
    arguments:
    - ADDLOCAL=Moo
    - INSTALLDIR={{test_win_package_path_safe}}\install
  register: install_msi_list_arguments

- name: get result of moo file after install local msi with list arguments
  win_stat:
    path: '{{test_win_package_path_safe}}\install\moo.exe'
  register: install_msi_list_arguments_moo

- name: get result of cow file after install local msi with list arguments
  win_stat:
    path: '{{test_win_package_path_safe}}\install\cow.exe'
  register: install_msi_list_arguments_cow

- name: assert results of install msi to custom path using list arguments
  assert:
    that:
    - install_msi_list_arguments is changed
    - install_msi_list_arguments.reboot_required == False
    - install_msi_list_arguments.rc == 0
    - install_msi_list_arguments_moo.stat.exists == True
    - install_msi_list_arguments_cow.stat.exists == False

- name: uninstall good msi after list argument test
  win_package:
    path: '{{test_win_package_path}}\good.msi'
    state: absent