# Test code for mysql_query module
# Copyright: (c) 2020, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
- vars:
    mysql_parameters: &mysql_params
      login_unix_socket: '{{ mysql_socket }}'
      login_user: '{{ root_user }}'
      login_password: '{{ root_pass }}'

  block:

  - name: Create db {{ test_db }}
    mysql_query:
      <<: *mysql_params
      query: 'CREATE DATABASE {{ test_db }}'
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['CREATE DATABASE {{ test_db }}']

  - name: Create {{ test_table1 }}
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'CREATE TABLE {{ test_table1 }} (id int)'
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['CREATE TABLE {{ test_table1 }} (id int)']

  - name: Insert test data
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query:
      - 'INSERT INTO {{ test_table1 }} VALUES (1), (2)'
      - 'INSERT INTO {{ test_table1 }} VALUES (3)'
      single_transaction: yes
    register: result

  - assert:
      that:
      - result is changed
      - result.rowcount == [2, 1]
      - result.executed_queries == ['INSERT INTO {{ test_table1 }} VALUES (1), (2)', 'INSERT INTO {{ test_table1 }} VALUES (3)']

  - name: Check data in {{ test_table1 }}
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table1 }}'
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ['SELECT * FROM {{ test_table1 }}']
      - result.rowcount == [3]
      - result.query_result[0][0].id == 1
      - result.query_result[0][1].id == 2
      - result.query_result[0][2].id == 3

  - name: Check data in {{ test_table1 }} using positional args
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table1 }} WHERE id = %s'
      positional_args:
      - 1
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ["SELECT * FROM {{ test_table1 }} WHERE id = 1"]
      - result.rowcount == [1]
      - result.query_result[0][0].id == 1

  - name: Check data in {{ test_table1 }} using named args
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table1 }} WHERE id = %(some_id)s'
      named_args:
        some_id: 1
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ["SELECT * FROM {{ test_table1 }} WHERE id = 1"]
      - result.rowcount == [1]
      - result.query_result[0][0].id == 1

  - name: Update data in {{ test_table1 }}
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'UPDATE {{ test_table1 }} SET id = %(new_id)s WHERE id = %(current_id)s'
      named_args:
        current_id: 1
        new_id: 0
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['UPDATE {{ test_table1 }} SET id = 0 WHERE id = 1']
      - result.rowcount == [1]

  - name: Check the prev update - row with value 1 does not exist anymore
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table1 }} WHERE id = %(some_id)s'
      named_args:
        some_id: 1
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ['SELECT * FROM {{ test_table1 }} WHERE id = 1']
      - result.rowcount == [0]

  - name: Check the prev update - row with value - exist
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table1 }} WHERE id = %(some_id)s'
      named_args:
        some_id: 0
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ['SELECT * FROM {{ test_table1 }} WHERE id = 0']
      - result.rowcount == [1]

  - name: Update data in {{ test_table1 }} again
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'UPDATE {{ test_table1 }} SET id = %(new_id)s WHERE id = %(current_id)s'
      named_args:
        current_id: 1
        new_id: 0
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ['UPDATE {{ test_table1 }} SET id = 0 WHERE id = 1']
      - result.rowcount == [0]

  - name: Delete data from {{ test_table1 }}
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query:
      - 'DELETE FROM {{ test_table1 }} WHERE id = 0'
      - 'SELECT * FROM {{ test_table1 }} WHERE id = 0'
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['DELETE FROM {{ test_table1 }} WHERE id = 0', 'SELECT * FROM {{ test_table1 }} WHERE id = 0']
      - result.rowcount == [1, 0]

  - name: Delete data from {{ test_table1 }} again
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'DELETE FROM {{ test_table1 }} WHERE id = 0'
    register: result

  - assert:
      that:
      - result is not changed
      - result.executed_queries == ['DELETE FROM {{ test_table1 }} WHERE id = 0']
      - result.rowcount == [0]

  - name: Truncate {{ test_table1 }}
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query:
      - 'TRUNCATE {{ test_table1 }}'
      - 'SELECT * FROM {{ test_table1 }}'
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['TRUNCATE {{ test_table1 }}', 'SELECT * FROM {{ test_table1 }}']
      - result.rowcount == [0, 0]

  - name: Rename {{ test_table1 }}
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'RENAME TABLE {{ test_table1 }} TO {{ test_table2 }}'
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['RENAME TABLE {{ test_table1 }} TO {{ test_table2 }}']
      - result.rowcount == [0]

  - name: Check the prev rename
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table1 }}'
    register: result
    ignore_errors: yes

  - assert:
      that:
      - result.failed == true

  - name: Check the prev rename
    mysql_query:
      <<: *mysql_params
      login_db: '{{ test_db }}'
      query: 'SELECT * FROM {{ test_table2 }}'
    register: result

  - assert:
      that:
      - result.rowcount == [0]

  - name: Drop db {{ test_db }}
    mysql_query:
      <<: *mysql_params
      query: 'DROP DATABASE {{ test_db }}'
    register: result

  - assert:
      that:
      - result is changed
      - result.executed_queries == ['DROP DATABASE {{ test_db }}']