---
- name: create test staging folder
  win_file:
    path: '{{test_win_hotfix_path}}'
    state: directory

- name: download hotfix
  win_get_url:
    url: '{{test_win_hotfix_good_url}}'
    dest: '{{test_win_hotfix_path}}\good.msu'

- name: download reboot hotfix
  win_get_url:
    url: '{{test_win_hotfix_reboot_url}}'
    dest: '{{test_win_hotfix_path}}\reboot.msu'

- name: download bad hotfix
  win_get_url:
    url: '{{test_win_hotfix_bad_url}}'
    dest: '{{test_win_hotfix_path}}\bad.msu'

- name: fail install install hotfix where kb doesn't match
  win_hotfix:
    hotfix_kb: KB0000000
    source: '{{test_win_hotfix_path}}\good.msu'
    state: present
  register: fail_install_invalid_kb
  failed_when: fail_install_invalid_kb.msg != 'the hotfix KB KB0000000 does not match with the source msu KB ' + test_win_hotfix_kb + ', please omit or specify the correct KB to continue'

- name: fail install install hotfix where identifier doesn't match
  win_hotfix:
    hotfix_identifier: invalid
    source: '{{test_win_hotfix_path}}\good.msu'
    state: present
  register: fail_install_invalid_identifier
  failed_when: fail_install_invalid_identifier.msg != 'the hotfix identifier invalid does not match with the source msu identifier ' + test_win_hotfix_identifier + ', please omit or specify the correct identifier to continue'

- name: fail install not applicable hotfix
  win_hotfix:
    source: '{{test_win_hotfix_path}}\bad.msu'
    state: present
  register: fail_install_not_applicable
  failed_when: fail_install_not_applicable.msg != 'hotfix package is not applicable for this server'

- name: install hotfix check
  win_hotfix:
    source: '{{test_win_hotfix_path}}\good.msu'
    state: present
  register: install_hotfix_check
  check_mode: yes

- name: get result of install hotfix check
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_kb}}
  register: install_hotfix_actual_check
  ignore_errors: True

- name: assert install hotfix check
  assert:
    that:
    - install_hotfix_check|changed
    - install_hotfix_check.kb == test_win_hotfix_kb
    - install_hotfix_check.identifier == test_win_hotfix_identifier
    - install_hotfix_actual_check.rc != 0

- name: install hotfix
  win_hotfix:
    source: '{{test_win_hotfix_path}}\good.msu'
    state: present
  register: install_hotfix

- name: get result of install hotfix
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_kb}}
  register: install_hotfix_actual

- name: assert install hotfix
  assert:
    that:
    - install_hotfix|changed
    - install_hotfix.kb == test_win_hotfix_kb
    - install_hotfix.identifier == test_win_hotfix_identifier
    - install_hotfix.reboot_required == False
    - install_hotfix_actual.rc == 0

- name: install hotfix again
  win_hotfix:
    source: '{{test_win_hotfix_path}}\good.msu'
    state: present
  register: install_hotfix_again

- name: assert install hotfix again
  assert:
    that:
    - not install_hotfix_again|changed
    - install_hotfix_again.kb == test_win_hotfix_kb
    - install_hotfix_again.identifier == test_win_hotfix_identifier
    - install_hotfix_again.reboot_required == False

- name: uninstall hotfix check
  win_hotfix:
    hotfix_identifier: '{{test_win_hotfix_identifier}}'
    state: absent
  register: uninstall_hotfix_check
  check_mode: yes

- name: get result of uninstall hotfix check
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_kb}}
  register: uninstall_hotfix_actual_check

- name: assert uninstall hotfix check
  assert:
    that:
    - uninstall_hotfix_check|changed
    - uninstall_hotfix_check.kb == test_win_hotfix_kb
    - uninstall_hotfix_check.identifier == test_win_hotfix_identifier
    - uninstall_hotfix_actual_check.rc == 0

- name: uninstall hotfix
  win_hotfix:
    hotfix_identifier: '{{test_win_hotfix_identifier}}'
    state: absent
  register: uninstall_hotfix

- name: get result of uninstall hotfix
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_kb}}
  register: uninstall_hotfix_actual
  ignore_errors: True

- name: assert uninstall hotfix
  assert:
    that:
    - uninstall_hotfix|changed
    - uninstall_hotfix.kb == test_win_hotfix_kb
    - uninstall_hotfix.identifier == test_win_hotfix_identifier
    - uninstall_hotfix.reboot_required == False
    - uninstall_hotfix_actual.rc != 0

- name: uninstall hotfix again
  win_hotfix:
    hotfix_identifier: '{{test_win_hotfix_identifier}}'
    state: absent
  register: uninstall_hotfix_again

- name: assert uninstall hotfix again
  assert:
    that:
    - not uninstall_hotfix_again|changed
    - uninstall_hotfix_again.reboot_required == False

- name: install reboot hotfix
  win_hotfix:
    hotfix_kb: '{{test_win_hotfix_reboot_kb}}'
    source: '{{test_win_hotfix_path}}\reboot.msu'
    state: present
  register: install_reboot_hotfix

- name: get result of install reboot hotfix
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_reboot_kb}}
  register: install_hotfix_reboot_actual

- name: assert install reboot hotfix
  assert:
    that:
    - install_reboot_hotfix|changed
    - install_reboot_hotfix.kb == test_win_hotfix_reboot_kb
    - install_reboot_hotfix.identifier == test_win_hotfix_reboot_identifier
    - install_reboot_hotfix.reboot_required == True
    - install_hotfix_reboot_actual.rc == 0

- name: run install reboot again before rebooting
  win_hotfix:
    source: '{{test_win_hotfix_path}}\reboot.msu'
    state: present
  register: install_before_rebooting

- name: assert install reboot again before rebooting
  assert:
    that:
    - not install_before_rebooting|changed
    - install_before_rebooting.reboot_required == True

- win_reboot:

- name: install reboot hotfix again
  win_hotfix:
    hotfix_identifier: '{{test_win_hotfix_reboot_identifier}}'
    source: '{{test_win_hotfix_path}}\reboot.msu'
    state: present
  register: install_reboot_hotfix_again

- name: assert install reboot hotfix again
  assert:
    that:
    - not install_reboot_hotfix_again|changed
    - install_reboot_hotfix_again.reboot_required == False

- name: uninstall hotfix with kb check
  win_hotfix:
    hotfix_kb: '{{test_win_hotfix_reboot_kb}}'
    state: absent
  register: uninstall_hotfix_kb_check
  check_mode: yes

- name: get result of uninstall hotfix with kb check
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_reboot_kb}}
  register: uninstall_hotfix_kb_actual_check

- name: assert uninstall hotfix with kb check
  assert:
    that:
    - uninstall_hotfix_kb_check|changed
    - uninstall_hotfix_kb_check.kb == test_win_hotfix_reboot_kb
    - uninstall_hotfix_kb_check.identifier == test_win_hotfix_reboot_identifier
    - uninstall_hotfix_kb_check.reboot_required == False
    - uninstall_hotfix_kb_actual_check.rc == 0

- name: uninstall hotfix with kb
  win_hotfix:
    hotfix_kb: '{{test_win_hotfix_reboot_kb}}'
    state: absent
  register: uninstall_hotfix_kb

- name: get result of uninstall hotfix with kb
  win_command: powershell.exe Get-Hotfix -Id {{test_win_hotfix_kb}}
  register: uninstall_hotfix_kb_actual
  ignore_errors: True

- name: assert uninstall hotfix with kb
  assert:
    that:
    - uninstall_hotfix_kb|changed
    - uninstall_hotfix_kb.kb == test_win_hotfix_reboot_kb
    - uninstall_hotfix_kb.identifier == test_win_hotfix_reboot_identifier
    - uninstall_hotfix_kb.reboot_required == True
    - uninstall_hotfix_kb_actual.rc != 0

- win_reboot:

- name: uninstall hotfix with kb again
  win_hotfix:
    hotfix_kb: '{{test_win_hotfix_reboot_kb}}'
    state: absent
  register: uninstall_hotfix_kb_again

- name: assert uninstall hotfix with kb again
  assert:
    that:
    - not uninstall_hotfix_kb_again|changed
    - uninstall_hotfix_kb_again.reboot_required == False

- name: remove test staging folder
  win_file:
    path: '{{test_win_hotfix_path}}'
    state: absent
