---
- name: fail with invalid path
  win_mapped_drive:
    letter: invalid
    state: absent
  register: fail_invalid_letter
  failed_when: "fail_invalid_letter.msg != 'letter must be a single letter from A-Z, was: invalid'"

- name: fail without specify path when creating drive
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    state: present
  register: fail_path_missing
  failed_when: "fail_path_missing.msg != 'state is present but all of the following are missing: path'"

- name: fail when specifying letter with existing physical path
  win_mapped_drive:
    letter: c
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  register: fail_local_letter
  failed_when: fail_local_letter.msg != 'failed to create mapped drive c, this letter is in use and is pointing to a non UNC path'

- name: create mapped drive check
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  register: create_drive_check
  check_mode: yes

- name: get actual of create mapped drive check
  win_command: 'net use {{test_win_mapped_drive_letter}}:' # Get-PSDrive/Get-WmiObject/Get-CimInstance doesn't work over WinRM
  register: create_drive_actual_check
  failed_when: False

- name: assert create mapped drive check
  assert:
    that:
    - create_drive_check is changed
    - create_drive_actual_check.rc == 2 # should fail with this error code when it isn't found

- name: create mapped drive
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  register: create_drive

- name: get actual of create mapped drive
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: create_drive_actual

- name: assert create mapped drive
  assert:
    that:
    - create_drive is changed
    - create_drive_actual.rc == 0
    - create_drive_actual.stdout_lines[1] == "Remote name       \\\\{{ansible_hostname}}\\{{test_win_mapped_drive_path}}"

- name: create mapped drive again
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  register: create_drive_again

- name: assert create mapped drive again
  assert:
    that:
    - create_drive_again is not changed

- name: change mapped drive target check
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path2}}
    state: present
  register: change_drive_target_check
  check_mode: yes

- name: get actual of change mapped drive target check
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: change_drive_target_actual_check

- name: assert change mapped drive target check
  assert:
    that:
    - change_drive_target_check is changed
    - change_drive_target_actual_check.rc == 0
    - change_drive_target_actual_check.stdout_lines[1] == "Remote name       \\\\{{ansible_hostname}}\\{{test_win_mapped_drive_path}}"

- name: change mapped drive target
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path2}}
    state: present
  register: change_drive_target

- name: get actual of change mapped drive target
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: change_drive_target_actual

- name: assert change mapped drive target
  assert:
    that:
    - change_drive_target is changed
    - change_drive_target_actual.rc == 0
    - change_drive_target_actual.stdout_lines[1] == "Remote name       \\\\{{ansible_hostname}}\\{{test_win_mapped_drive_path2}}"

- name: fail to delete mapped drive if target doesn't match
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: absent
  register: fail_delete_incorrect_target
  failed_when: fail_delete_incorrect_target.msg != 'did not delete mapped drive ' + test_win_mapped_drive_letter + ', the target path is pointing to a different location at \\\\' + ansible_hostname + '\\' + test_win_mapped_drive_path2

- name: delete mapped drive check
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path2}}
    state: absent
  register: delete_drive_check
  check_mode: yes

- name: get actual of delete mapped drive check
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: delete_drive_actual_check

- name: assert delete mapped drive check
  assert:
    that:
    - delete_drive_check is changed
    - delete_drive_actual_check.rc == 0
    - delete_drive_actual_check.stdout_lines[1] == "Remote name       \\\\{{ansible_hostname}}\\{{test_win_mapped_drive_path2}}"

- name: delete mapped drive
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path2}}
    state: absent
  register: delete_drive

- name: get actual of delete mapped drive
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: delete_drive_actual
  failed_when: False

- name: assert delete mapped drive
  assert:
    that:
    - delete_drive is changed
    - delete_drive_actual.rc == 2

- name: delete mapped drive again
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path2}}
    state: absent
  register: delete_drive_again

- name: assert delete mapped drive again
  assert:
    that:
    - delete_drive_again is not changed

# not much we can do to test out the credentials except that it sets it, winrm
# makes it hard to actually test out we can still access the mapped drive
- name: map drive with current credentials check
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
    username: '{{ansible_hostname}}\{{test_win_mapped_drive_temp_user}}'
    password: '{{test_win_mapped_drive_temp_password}}'
  register: map_with_credentials_check
  check_mode: yes

- name: get actual of map drive with current credentials check
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: map_with_credentials_actual_check
  failed_when: False

- name: assert map drive with current credentials check
  assert:
    that:
    - map_with_credentials_check is changed
    - map_with_credentials_actual_check.rc == 2

- name: map drive with current credentials
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
    username: '{{ansible_hostname}}\{{test_win_mapped_drive_temp_user}}'
    password: '{{test_win_mapped_drive_temp_password}}'
  register: map_with_credentials

- name: get actual of map drive with current credentials
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: map_with_credentials_actual

- name: get username of mapped network drive with credentials
  win_reg_stat:
    path: HKCU:\Network\{{test_win_mapped_drive_letter}}
    name: UserName
  register: map_with_credential_actual_username

- name: assert map drive with current credentials
  assert:
    that:
    - map_with_credentials is changed
    - map_with_credentials_actual.rc == 0
    - map_with_credential_actual_username.value == ''  # we explicitly remove the username part in the module

- name: map drive with current credentials again
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
    username: '{{ansible_hostname}}\{{test_win_mapped_drive_temp_user}}'
    password: '{{test_win_mapped_drive_temp_password}}'
  register: map_with_credentials_again

- name: assert map drive with current credentials again
  assert:
    that:
    - not map_with_credentials_again is changed

- name: delete mapped drive without path check
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    state: absent
  register: delete_without_path_check
  check_mode: yes

- name: get actual delete mapped drive without path check
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: delete_without_path_actual_check

- name: assert delete mapped drive without path check
  assert:
    that:
    - delete_without_path_check is changed
    - delete_without_path_actual_check.rc == 0

- name: delete mapped drive without path
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    state: absent
  register: delete_without_path

- name: get actual delete mapped drive without path
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: delete_without_path_actual
  failed_when: False

- name: assert delete mapped drive without path check
  assert:
    that:
    - delete_without_path is changed
    - delete_without_path_actual.rc == 2

- name: delete mapped drive without path again
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    state: absent
  register: delete_without_path_again

- name: assert delete mapped drive without path check again
  assert:
    that:
    - delete_without_path_again is not changed

- name: store credential for test network account
  win_credential:
    name: '{{ ansible_hostname }}'
    type: domain_password
    username: '{{ test_win_mapped_drive_temp_user }}'
    secret: '{{ test_win_mapped_drive_temp_password }}'
    state: present
  vars: &become_vars
    ansible_become: yes
    ansible_become_method: runas
    ansible_become_user: '{{ ansible_user }}'
    ansible_become_pass: '{{ ansible_password }}'

- name: map drive with stored cred (check mode)
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  check_mode: yes
  vars: *become_vars
  register: map_with_stored_cred_check

- name: get actual of map drive with stored cred (check mode)
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: map_with_stored_cred_actual_check
  failed_when: False

- name: assert map drive with stored cred (check mode)
  assert:
    that:
    - map_with_stored_cred_check is changed
    - map_with_stored_cred_actual_check.rc == 2

- name: map drive with stored cred
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  vars: *become_vars
  register: map_with_stored_cred

- name: get actual of map drive with stored cred
  win_command: 'net use {{test_win_mapped_drive_letter}}:'
  register: map_with_stored_cred_actual

- name: get username of mapped network drive with stored cred
  win_reg_stat:
    path: HKCU:\Network\{{test_win_mapped_drive_letter}}
    name: UserName
  register: map_with_stored_cred_actual_username

- name: assert map drive with stored cred
  assert:
    that:
    - map_with_stored_cred is changed
    - map_with_stored_cred_actual.rc == 0
    - map_with_stored_cred_actual_username.value == ''

- name: map drive with stored cred again
  win_mapped_drive:
    letter: '{{test_win_mapped_drive_letter}}'
    path: \\{{ansible_hostname}}\{{test_win_mapped_drive_path}}
    state: present
  vars: *become_vars
  register: map_with_stored_cred_again

- name: assert map drive with stored cred again
  assert:
    that:
    - not map_with_stored_cred_again is changed
