# Test code for the ACI modules
# Copyright: (c) 2018, Dag Wieers (dagwieers) <dag@wieers.com>

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)


# CLEAN ENVIRONMENT
- name: Remove taboo contract
  aci_taboo_contract: &taboo_contract_absent
    host: '{{ aci_hostname }}'
    username: '{{ aci_username }}'
    password: '{{ aci_password }}'
    validate_certs: '{{ aci_validate_certs | default(false) }}'
    use_ssl: '{{ aci_use_ssl | default(true) }}'
    use_proxy: '{{ aci_use_proxy | default(true) }}'
    output_level: '{{ aci_output_level | default("info") }}'
    tenant: ansible_test
    taboo_contract: taboo_contract_test
    state: absent

- name: Add tenant
  aci_tenant:
    host: '{{ aci_hostname }}'
    username: '{{ aci_username }}'
    password: '{{ aci_password }}'
    validate_certs: '{{ aci_validate_certs | default(false) }}'
    use_ssl: '{{ aci_use_ssl | default(true) }}'
    use_proxy: '{{ aci_use_proxy | default(true) }}'
    output_level: '{{ aci_output_level | default("info") }}'
    tenant: ansible_test
    state: present


# ADD TABOO CONTRACT
- name: Add taboo contract (check_mode)
  aci_taboo_contract: &taboo_contract_present
    host: '{{ aci_hostname }}'
    username: '{{ aci_username }}'
    password: '{{ aci_password }}'
    validate_certs: '{{ aci_validate_certs | default(false) }}'
    use_ssl: '{{ aci_use_ssl | default(true) }}'
    use_proxy: '{{ aci_use_proxy | default(true) }}'
    output_level: '{{ aci_output_level | default("info") }}'
    tenant: ansible_test
    taboo_contract: taboo_contract_test
    state: present
  check_mode: yes
  register: cm_add_taboo_contract

- name: Add taboo contract (normal mode)
  aci_taboo_contract: *taboo_contract_present
  register: nm_add_taboo_contract

- name: Verify add_taboo_contract
  assert:
    that:
    - cm_add_taboo_contract is changed
    - nm_add_taboo_contract is changed
    - 'cm_add_taboo_contract.sent == nm_add_taboo_contract.sent == {"vzTaboo": {"attributes": {"name": "taboo_contract_test"}}}'
    - 'cm_add_taboo_contract.proposed == nm_add_taboo_contract.proposed == {"vzTaboo": {"attributes": {"name": "taboo_contract_test"}}}'
    - cm_add_taboo_contract.previous == nm_add_taboo_contract.previous == []
    # NOTE: We cannot fix this easily
    - cm_add_taboo_contract.current == []
    - nm_add_taboo_contract.current.0.vzTaboo.attributes.descr == ''
    - nm_add_taboo_contract.current.0.vzTaboo.attributes.dn == 'uni/tn-ansible_test/taboo-taboo_contract_test'
    - nm_add_taboo_contract.current.0.vzTaboo.attributes.name == 'taboo_contract_test'

- name: Add taboo_contract again (check_mode)
  aci_taboo_contract: *taboo_contract_present
  check_mode: yes
  register: cm_add_taboo_contract_again

- name: Add taboo contract again (normal mode)
  aci_taboo_contract: *taboo_contract_present
  register: nm_add_taboo_contract_again

- name: Verify add_taboo_contract_again
  assert:
    that:
    - cm_add_taboo_contract_again is not changed
    - nm_add_taboo_contract_again is not changed
    - cm_add_taboo_contract_again.current == nm_add_taboo_contract_again.current == nm_add_taboo_contract.current


# CHANGE TABOO CONTRACT
- name: Change description of taboo contract (check_mode)
  aci_taboo_contract:
    <<: *taboo_contract_present
    description: Ansible test taboo contract
  check_mode: yes
  register: cm_add_taboo_contract_descr

- name: Change description of taboo contract (normal mode)
  aci_taboo_contract:
    <<: *taboo_contract_present
    description: Ansible test taboo contract
  register: nm_add_taboo_contract_descr

- name: Verify add_taboo_contract_descr
  assert:
    that:
    - cm_add_taboo_contract_descr is changed
    - nm_add_taboo_contract_descr is changed
    - 'cm_add_taboo_contract_descr.sent == nm_add_taboo_contract_descr.sent == {"vzTaboo": {"attributes": {"descr": "Ansible test taboo contract"}}}'
    - 'cm_add_taboo_contract_descr.proposed == nm_add_taboo_contract_descr.proposed == {"vzTaboo": {"attributes": {"descr": "Ansible test taboo contract", "name": "taboo_contract_test"}}}'
    - cm_add_taboo_contract_descr.previous == nm_add_taboo_contract_descr.previous == cm_add_taboo_contract_descr.current == nm_add_taboo_contract.current
    - nm_add_taboo_contract_descr.current.0.vzTaboo.attributes.descr == 'Ansible test taboo contract'
    - nm_add_taboo_contract_descr.current.0.vzTaboo.attributes.dn == 'uni/tn-ansible_test/taboo-taboo_contract_test'
    - nm_add_taboo_contract_descr.current.0.vzTaboo.attributes.name == 'taboo_contract_test'

- name: Change description of taboo contract again (check_mode)
  aci_taboo_contract:
    <<: *taboo_contract_present
    description: Ansible test taboo contract
  check_mode: yes
  register: cm_add_taboo_contract_descr_again

- name: Change description of taboo contract again (normal mode)
  aci_taboo_contract:
    <<: *taboo_contract_present
    description: Ansible test taboo contract
  register: nm_add_taboo_contract_descr_again

- name: Verify add_taboo_contract_descr_again
  assert:
    that:
    - cm_add_taboo_contract_descr_again is not changed
    - nm_add_taboo_contract_descr_again is not changed
    - cm_add_taboo_contract_descr_again.current == nm_add_taboo_contract_descr_again.current == nm_add_taboo_contract_descr.current


# ADD TABOO CONTRACT AGAIN
- name: Add taboo contract again with no description (check_mode)
  aci_taboo_contract: *taboo_contract_present
  check_mode: yes
  register: cm_add_taboo_contract_again_no_descr

- name: Add taboo contract again with no description (normal mode)
  aci_taboo_contract: *taboo_contract_present
  register: nm_add_taboo_contract_again_no_descr

- name: Verify add_taboo_contract_again_no_descr
  assert:
    that:
    - cm_add_taboo_contract_again_no_descr is not changed
    - nm_add_taboo_contract_again_no_descr is not changed
    - cm_add_taboo_contract_again_no_descr.current == nm_add_taboo_contract_again_no_descr.current == nm_add_taboo_contract_descr.current


# QUERY ALL TABOO CONTRACTS
- name: Query all taboo contracts (check_mode)
  aci_taboo_contract: &taboo_contract_query
    host: '{{ aci_hostname }}'
    username: '{{ aci_username }}'
    password: '{{ aci_password }}'
    validate_certs: '{{ aci_validate_certs | default(false) }}'
    use_ssl: '{{ aci_use_ssl | default(true) }}'
    use_proxy: '{{ aci_use_proxy | default(true) }}'
    output_level: '{{ aci_output_level | default("info") }}'
    state: query
  check_mode: yes
  register: cm_query_all_taboo_contracts

- name: Query all taboo contracts (normal mode)
  aci_taboo_contract: *taboo_contract_query
  register: nm_query_all_taboo_contracts

- name: Verify query_all_taboo_contracts
  assert:
    that:
    - cm_query_all_taboo_contracts is not changed
    - nm_query_all_taboo_contracts is not changed
    - cm_query_all_taboo_contracts == nm_query_all_taboo_contracts
    - cm_query_all_taboo_contracts.current|length >= 1


# QUERY A TABOO CONTRACT
- name: Query our taboo contract
  aci_taboo_contract:
    <<: *taboo_contract_query
    tenant: ansible_test
    taboo_contract: taboo_contract_test
  check_mode: yes
  register: cm_query_taboo_contract

- name: Query our taboo contract
  aci_taboo_contract:
    <<: *taboo_contract_query
    tenant: ansible_test
    taboo_contract: taboo_contract_test
  register: nm_query_taboo_contract

- name: Verify query_taboo_contract
  assert:
    that:
    - cm_query_taboo_contract is not changed
    - nm_query_taboo_contract is not changed
    - cm_query_taboo_contract == nm_query_taboo_contract
    - nm_query_taboo_contract.current.0.vzTaboo.attributes.descr == 'Ansible test taboo contract'
    - nm_query_taboo_contract.current.0.vzTaboo.attributes.dn == 'uni/tn-ansible_test/taboo-taboo_contract_test'
    - nm_query_taboo_contract.current.0.vzTaboo.attributes.name == 'taboo_contract_test'


# REMOVE TABOO CONTRACT
- name: Remove taboo contract (check_mode)
  aci_taboo_contract: *taboo_contract_absent
  check_mode: yes
  register: cm_remove_taboo_contract

- name: Remove taboo contract (normal mode)
  aci_taboo_contract: *taboo_contract_absent
  register: nm_remove_taboo_contract

- name: Verify remove_taboo_contract
  assert:
    that:
    - cm_remove_taboo_contract is changed
    - nm_remove_taboo_contract is changed
    - 'cm_remove_taboo_contract.current == cm_remove_taboo_contract.previous == nm_remove_taboo_contract.previous == [{"vzTaboo": {"attributes": {"descr": "Ansible test taboo contract", "dn": "uni/tn-ansible_test/taboo-taboo_contract_test", "name": "taboo_contract_test", "nameAlias": "", "ownerKey": "", "ownerTag": ""}}}]'
    - nm_remove_taboo_contract.current == []

- name: Remove taboo contract again (check_mode)
  aci_taboo_contract: *taboo_contract_absent
  check_mode: yes
  register: cm_remove_taboo_contract_again

- name: Remove taboo contract again (normal mode)
  aci_taboo_contract: *taboo_contract_absent
  register: nm_remove_taboo_contract_again

- name: Verify remove_taboo_contract_again
  assert:
    that:
    - cm_remove_taboo_contract_again is not changed
    - nm_remove_taboo_contract_again is not changed
    - cm_remove_taboo_contract_again.proposed == nm_remove_taboo_contract_again.proposed == {}
    - cm_remove_taboo_contract_again.sent == nm_remove_taboo_contract_again.sent == {}
    - cm_remove_taboo_contract_again.previous == nm_remove_taboo_contract_again.previous == []
    - cm_remove_taboo_contract_again.current == nm_remove_taboo_contract_again.current == []


# QUERY NON-EXISTING TABOO CONTRACT
- name: Query non-existing taboo contract (check_mode)
  aci_taboo_contract:
    <<: *taboo_contract_query
    tenant: ansible_test
    taboo_contract: taboo_contract_test
  check_mode: yes
  register: cm_query_non_taboo_contract

- name: Query non-existing taboo contract (normal mode)
  aci_taboo_contract:
    <<: *taboo_contract_query
    tenant: ansible_test
    taboo_contract: taboo_contract_test
  register: nm_query_non_taboo_contract

# TODO: Implement more tests
- name: Verify query_non_taboo_contract
  assert:
    that:
    - cm_query_non_taboo_contract is not changed
    - nm_query_non_taboo_contract is not changed
    - cm_remove_taboo_contract_again.previous == nm_remove_taboo_contract_again.previous == []
    - cm_remove_taboo_contract_again.current == nm_remove_taboo_contract_again.current == []


# PROVOKE ERRORS
- name: Error when required parameter is missing
  aci_taboo_contract:
    host: '{{ aci_hostname }}'
    username: '{{ aci_username }}'
    password: '{{ aci_password }}'
    validate_certs: '{{ aci_validate_certs | default(false) }}'
    use_ssl: '{{ aci_use_ssl | default(true) }}'
    use_proxy: '{{ aci_use_proxy | default(true) }}'
    output_level: '{{ aci_output_level | default("info") }}'
    state: present
  ignore_errors: yes
  register: error_on_missing_required_param

- name: Verify error_on_missing_required_param
  assert:
    that:
    - error_on_missing_required_param is failed
    - 'error_on_missing_required_param.msg == "state is present but all of the following are missing: tenant, taboo_contract"'
