- name: user generating ssh keys tests
  become: true
  vars:
    home: "{{ (ansible_facts['os_family'] == 'Darwin')|ternary('/Users/ansibulluser/', '/home/ansibulluser/')}}"
    ssh_key_file: .ssh/ansible_test_rsa
    pub_file: '{{ssh_key_file}}.pub'
    key_files:
      - '{{ssh_key_file}}'
      - '{{pub_file}}'
  block:
  - name: Ensure clean/non existing ansibulluser
    user: name=ansibulluser state=absent

  - name: Test creating ssh key creation
    block:
    - name: Create user with ssh key
      user:
        name: ansibulluser
        state: present
        generate_ssh_key: yes
        ssh_key_file: '{{ ssh_key_file}}'

    - name: check files exist
      stat:
        path: '{{home ~ item}}'
      register: stat_keys
      loop: '{{ key_files }}'

    - name: ensure they exist
      assert:
        that:
          - stat_keys.results[item].stat.exists
      loop: [0, 1]

    always:
    - name: Clean ssh keys
      file: path={{ home ~ item }} state=absent
      loop: '{{ key_files }}'

    - name: Ensure clean/non existing ansibulluser
      user: name=ansibulluser state=absent

  - name: Ensure we don't break on conflicts
    block:
    - name: flag file for test
      tempfile:
      register: flagfile

    - name: precreate public .ssh
      file: path={{home ~ '.ssh'}} state=directory

    - name: setup public key linked to flag file
      file: path={{home ~ pub_file}} src={{flagfile.path}} state=link

    - name: Create user with ssh key
      user:
        name: ansibulluser
        state: present
        generate_ssh_key: yes
        ssh_key_file: '{{ ssh_key_file }}'
      ignore_errors: true
      register: user_no_force

    - stat: path={{home ~ pub_file}}
      register: check_pub

    - name: ensure we didn't overwrite
      assert:
        that:
          - check_pub.stat.exists
          - check_pub.stat.islnk
          - check_pub.stat.uid == 0

    - name: Create user with ssh key
      user:
        name: ansibulluser
        state: present
        generate_ssh_key: yes
        ssh_key_file: '{{ ssh_key_file }}'
        force: true
      ignore_errors: true
      register: user_force

    - stat: path={{home ~ pub_file}}
      register: check_pub2

    - name: ensure we failed since we didn't force overwrite
      assert:
        that:
          - user_force is success
          - check_pub2.stat.exists
          - not check_pub2.stat.islnk
          - check_pub2.stat.uid != 0
    always:
    - name: Clean up files
      file: path={{ home ~ item }} state=absent
      loop: '{{ key_files + [flagfile.path] }}'

    - name: Ensure clean/non existing ansibulluser
      user: name=ansibulluser state=absent
