# 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)
---
- 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

- 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: Create network with type wireless
  meraki_network:
    auth_key: '{{ auth_key }}'
    state: present
    org_name: '{{test_org_name}}'
    net_name: IntTestNetworkWireless
    type: wireless
    timezone: America/Chicago
  delegate_to: localhost
  register: create_net_wireless
  
- name: Create network with type combined
  meraki_network:
    auth_key: '{{ auth_key }}'
    state: present
    org_name: '{{test_org_name}}'
    net_name: IntTestNetworkCombined
    type: combined
    timezone: America/Chicago
  delegate_to: localhost
  register: create_net_combined
  
- 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

- debug:
    msg: '{{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

- debug:
    msg: '{{create_net_tags}}'

- name: Modify network
  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

- 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

- name: Present assertions
  assert:
    that:
      - create_net_no_type.status == 500
      - '"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'
      - '"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

- 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 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_all.data | length == 7
      - 'net_query_one.data.name == "IntTestNetworkSwitch"'
      
- 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

- debug:
    msg: '{{delete_all_no_org}}'
    
- 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

- debug:
    msg: '{{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
  loop:
    - IntTestNetworkSwitch
    - IntTestNetworkWireless
    - IntTestNetworkAppliance
    - IntTestNetworkCombined
    - IntTestNetworkTag
    - IntTestNetworkTags
    
- name: Query after delete all
  meraki_network:
    auth_key: '{{ auth_key }}'
    state: query
    org_name: '{{test_org_name}}'
  delegate_to: localhost
  register: query_deleted
    
- name: Delete assertions
  assert:
    that:
      - '"org_name or org_id parameters are required" in delete_all_no_org.msg'
      # - query_deleted_org_id.data | length == 6     
      - query_deleted.data | length == 0