# Test code for the Meraki modules
# Copyright: (c) 2018, Kevin Breit (@kbreit)

# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
---
- block:
  - name: Create network without type
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetwork
      timezone: America/Chicago
    delegate_to: localhost
    register: create_net_no_type
    ignore_errors: yes

  - assert:
      that:
      - create_net_no_type.msg == 'type parameter is required when creating a network.'

  - name: Create network without organization
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      net_name: IntTestNetwork
      timezone: America/Chicago
    delegate_to: localhost
    register: create_net_no_org
    ignore_errors: yes

  - name: Create network with type switch
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkSwitch
      type: switch
      timezone: America/Chicago
    delegate_to: localhost
    register: create_net_switch
    
  - name: Create network with type switch by org ID
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_id: '{{test_org_id}}'
      net_name: IntTestNetworkSwitchOrgID
      type: switch
      timezone: America/Chicago
    delegate_to: localhost
    register: create_net_switch_org_id  
    
  - name: Create network with type appliance and no timezone
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkAppliance
      type: appliance
    delegate_to: localhost
    register: create_net_appliance_no_tz

  - name: Enable VLAN support on appliance network
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{ test_org_name }}'
      net_name: IntTestNetworkAppliance
      enable_vlans: yes
    delegate_to: localhost
    register: enable_vlan

  - assert:
      that:
        - enable_vlan.data.enabled == True

  - name: Enable VLAN support on appliance network with idempotency
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{ test_org_name }}'
      net_name: IntTestNetworkAppliance
      enable_vlans: yes
    delegate_to: localhost
    register: enable_vlan_idempotent

  - debug:
      var: enable_vlan_idempotent

  - assert:
      that:
        - enable_vlan_idempotent is not changed
        - enable_vlan_idempotent.data is defined
  
  - name: Disable VLAN support on appliance network
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{ test_org_name }}'
      net_name: IntTestNetworkAppliance
      enable_vlans: no
    delegate_to: localhost
    register: disable_vlan

  - assert:
      that:
        - disable_vlan.data.enabled == False

  - name: Disable VLAN support on appliance network with idempotency
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{ test_org_name }}'
      net_name: IntTestNetworkAppliance
      enable_vlans: no
    delegate_to: localhost
    register: disable_vlan_idempotent

  - assert:
      that:
        - disable_vlan_idempotent is not changed
        - disable_vlan_idempotent.data is defined

  - name: Create network with type wireless and disable my.meraki.com
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkWireless
      type: wireless
      timezone: America/Chicago
      disable_my_meraki: yes
    delegate_to: localhost
    register: create_net_wireless

  - name: Create network with type wireless, disable my.meraki.com, and check for idempotency
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkWireless
      type: wireless
      timezone: America/Chicago
      disable_my_meraki: yes
    delegate_to: localhost
    register: create_net_wireless_idempotent

  - assert:
      that:
        - create_net_wireless_idempotent.data is defined

  - name: Create network with type combined and disable my.meraki.com
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{ test_org_name }}'
      net_name: IntTestNetworkCombined
      type:
        - appliance
        - switch
      timezone: America/Chicago
      enable_my_meraki: no
    delegate_to: localhost
    register: create_net_combined

  - name: Reenable my.meraki.com
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkCombined
      enable_my_meraki: yes
    delegate_to: localhost
    register: enable_meraki_com

  - name: Disable my.meraki.com for next test
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkCombined
      enable_my_meraki: no
    delegate_to: localhost

  - name: Enable remote status page
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkCombined
      enable_remote_status_page: yes
    delegate_to: localhost
    register: disable_remote_status

  - debug:
      msg: '{{disable_remote_status}}'

  - assert:
      that:
        - disable_remote_status.data.disable_remote_status_page == False

  - name: Disable remote status page
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkCombined
      enable_remote_status_page: no
    delegate_to: localhost
    register: enable_remote_status

  - debug:
      msg: '{{enable_remote_status}}'

  - assert:
      that:
        - enable_remote_status.data.disable_remote_status_page == True

  - name: Test status pages are mutually exclusive when on
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkCombined
      enable_my_meraki: yes
      enable_remote_status_page: no
    delegate_to: localhost
    register: status_exclusivity
    ignore_errors: yes

  - assert:
      that:
        - '"must be true when setting" in status_exclusivity.msg'

  - name: Create network with one tag
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkTag
      type: switch
      timezone: America/Chicago
      tags: first_tag
    delegate_to: localhost
    register: create_net_tag
    
  - name: Create network with two tags
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkTags
      type: switch
      timezone: America/Chicago
      tags: 
        - first_tag
        - second_tag
    delegate_to: localhost
    register: create_net_tags

  - set_fact:
      tag_net_id: '{{create_net_tags.data.id}}'

  - name: Modify network by net_id
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_id: '{{tag_net_id}}'
      type: switch
      timezone: America/Chicago
      tags: 
        - first_tag
        - second_tag
        - third_tag
    delegate_to: localhost
    register: create_net_modified

  - name: Modify network with idempotency
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: present
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkTags
      type: switch
      timezone: America/Chicago
      tags: 
        - first_tag
        - second_tag
        - third_tag
    delegate_to: localhost
    register: create_net_modified_idempotent

  - assert:
      that:
        - create_net_modified_idempotent.data is defined

  - name: Present assertions
    assert:
      that:
        - create_net_combined.data.type == 'combined'
        - create_net_combined.data.disable_my_meraki_com == True
        - enable_meraki_com.data.disable_my_meraki_com == False
        - '"org_name or org_id parameters are required" in create_net_no_org.msg'
        - '"IntTestNetworkAppliance" in create_net_appliance_no_tz.data.name'
        - create_net_appliance_no_tz.changed == True
        - '"IntTestNetworkSwitch" in create_net_switch.data.name'
        - '"IntTestNetworkSwitchOrgID" in create_net_switch_org_id.data.name'
        - '"IntTestNetworkWireless" in create_net_wireless.data.name'
        - create_net_wireless.data.disable_my_meraki_com == True
        - create_net_wireless_idempotent.changed == False
        - create_net_wireless_idempotent.data is defined
        - '"first_tag" in create_net_tag.data.tags'
        - '"second_tag" in create_net_tags.data.tags'
        - '"third_tag" in create_net_modified.data.tags'
        - create_net_modified.changed == True
        - create_net_modified_idempotent.changed == False
        - create_net_modified_idempotent.data is defined

  - name: Query all networks
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: query
      org_name: '{{test_org_name}}'
    delegate_to: localhost
    register: net_query_all
      
  - name: Query a configuration template
    meraki_network:
      auth_key: '{{auth_key}}'
      state: query
      org_name: '{{test_org_name}}'
      net_name: '{{test_template_name}}'
    delegate_to: localhost
    register: query_config_template

  - name: Query one network
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: query
      org_name: '{{test_org_name}}'
      net_name: IntTestNetworkSwitch
    delegate_to: localhost
    register: net_query_one

  - name: Query assertions
    assert:
      that:
        - 'net_query_one.data.name == "IntTestNetworkSwitch"'
        - 'query_config_template.data.name == "{{ test_template_name }}"'

#############################################################################
# Tear down starts here
#############################################################################
  always:
  - name: Delete network without org
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: absent
      net_name: IntTestNetworkSwitch
    delegate_to: localhost
    register: delete_all_no_org
    ignore_errors: yes
      
  - name: Delete network by org ID
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: absent
      org_id: '{{test_org_id}}'
      net_name: IntTestNetworkSwitchOrgID
    delegate_to: localhost
    register: delete_net_org_id

  - name: Query after delete with org ID
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: query
      org_name: '{{test_org_name}}'
    delegate_to: localhost
    register: query_deleted_org_id

  - name: Delete all networks
    meraki_network:
      auth_key: '{{ auth_key }}'
      state: absent
      org_name: '{{test_org_name}}'
      net_name: '{{ item }}'
    delegate_to: localhost
    register: delete_all
    ignore_errors: yes
    loop:
      - IntTestNetworkSwitch
      - IntTestNetworkWireless
      - IntTestNetworkAppliance
      - IntTestNetworkCombined
      - IntTestNetworkTag
      - IntTestNetworkTags

  - assert:
      that:
        - 'delete_all_no_org.msg == "org_name or org_id parameters are required"'
