---
- hosts: testhost
  gather_facts: false
  tasks:
    - name: test simple data with defaults
      set_stats:
          data:
              my_int: 42
              my_string: "foo"
      register: result

    - name: assert simple data return
      assert:
          that:
              - result is succeeded
              - not result.changed
              - '"ansible_stats" in result'
              - '"data" in result.ansible_stats'
              - result.ansible_stats.data.my_int == 42
              - result.ansible_stats.data.my_string == "foo"
              - '"per_host" in result.ansible_stats'
              - not result.ansible_stats.per_host
              - '"aggregate" in result.ansible_stats'
              - result.ansible_stats.aggregate

    - name: test per_host and aggregate settings
      set_stats:
          data:
              my_int: 42
          per_host: yes
          aggregate: no
      register: result

    - name: assert per_host and aggregate changes
      assert:
          that:
              - result is succeeded
              - not result.changed
              - '"ansible_stats" in result'
              - '"per_host" in result.ansible_stats'
              - result.ansible_stats.per_host
              - '"aggregate" in result.ansible_stats'
              - not result.ansible_stats.aggregate

    - name: Test bad call
      block:
        - name: "EXPECTED FAILURE - test invalid data type"
          set_stats:
              data:
                  - 1
                  - 2

        - fail:
            msg: "should not get here"
      rescue:
          - assert:
              that:
                  - ansible_failed_task.name == "EXPECTED FAILURE - test invalid data type"
                  - ansible_failed_result.msg == "The 'data' option needs to be a dictionary/hash"

    - name: Test options from template
      set_stats:
          data:
              my_string: "foo"
          aggregate: "x"

    - name: Test bad data
      block:
          - name: "EXPECTED FAILURE - bad data"
            set_stats:
                data:
                    .bad: 1
          - fail:
              msg: "should not get here"
      rescue:
          - assert:
              that:
                  - ansible_failed_task.name == "EXPECTED FAILURE - bad data"
                  - ansible_failed_result.msg is contains "Invalid variable name '.bad'"
