# Test code for mysql_info module
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

###################
# Prepare for tests
#

# Create role for tests
- name: mysql_info -  create mysql user {{ user_name }}
  mysql_user:
    name: '{{ user_name }}'
    password: '{{ user_pass }}'
    state: present
    priv: '*.*:ALL'
    login_unix_socket: '{{ mysql_socket }}'

# Create default MySQL config file with credentials
- name: mysql_info - create default config file
  template:
    src: my.cnf.j2
    dest: /root/.my.cnf
    mode: '0400'

# Create non-default MySQL config file with credentials
- name: mysql_info - create non-default config file
  template:
    src: my.cnf.j2
    dest: /root/non-default_my.cnf
    mode: '0400'

###############
# Do tests

# Access by default cred file
- name: mysql_info - collect default cred file
  mysql_info:
    login_user: '{{ user_name }}'
  register: result

- assert:
    that:
    - result.changed == false
    - result.version != {}
    - result.settings != {}
    - result.global_status != {}
    - result.databases != {}
    - result.engines != {}
    - result.users != {}

# Access by non-default cred file
- name: mysql_info - check non-default cred file
  mysql_info:
    login_user: '{{ user_name }}'
    config_file: /root/non-default_my.cnf
  register: result

- assert:
    that:
    - result.changed == false
    - result.version != {}

# Remove cred files
- name: mysql_info - remove cred files
  file:
    path: '{{ item }}'
    state: absent
  with_items:
  - /root/.my.cnf
  - /root/non-default_my.cnf

# Access with password
- name: mysql_info - check access with password
  mysql_info:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
  register: result

- assert:
    that:
    - result.changed == false
    - result.version != {}

# Test excluding
- name: Collect all info except settings and users
  mysql_info:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    filter: '!settings,!users'
  register: result

- assert:
    that:
    - result.changed == false
    - result.version != {}
    - result.global_status != {}
    - result.databases != {}
    - result.engines != {}
    - result.settings is not defined
    - result.users is not defined

# Test including
- name: Collect info only about version and databases
  mysql_info:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    filter:
    - version
    - databases
  register: result

- assert:
    that:
    - result.changed == false
    - result.version != {}
    - result.databases != {}
    - result.engines is not defined
    - result.settings is not defined
    - result.global_status is not defined
    - result.users is not defined

# Test exclude_fields: db_size
# 'unsupported' element is passed to check that an unsupported value
# won't break anything (will be ignored regarding to the module's documentation).
- name: Collect info about databases excluding their sizes
  mysql_info:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    filter:
    - databases
    exclude_fields:
    - db_size
    - unsupported
  register: result

- assert:
    that:
    - result.changed == false
    - result.databases != {}
    - result.databases.mysql == {}

########################################################
# Issue #65727, empty databases must be in returned dict
#
- name: Create empty database acme
  mysql_db:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    name: acme

- name: Collect info about databases
  mysql_info:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    filter:
    - databases
    return_empty_dbs: true
  register: result

# Check acme is in returned dict
- assert:
    that:
    - result.changed == false
    - result.databases.acme.size == 0
    - result.databases.mysql != {}

- name: Collect info about databases excluding their sizes
  mysql_info:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    filter:
    - databases
    exclude_fields:
    - db_size
    return_empty_dbs: true
  register: result

# Check acme is in returned dict
- assert:
    that:
    - result.changed == false
    - result.databases.acme == {}
    - result.databases.mysql == {}

- name: Remove acme database
  mysql_db:
    login_user: '{{ user_name }}'
    login_password: '{{ user_pass }}'
    name: acme
    state: absent