- name: postgresql_tablespace - drop dir for test tablespace
  become: true
  file:
    path: '{{ test_tablespace_path }}'
    state: absent
  ignore_errors: true

- name: postgresql_tablespace - disable selinux
  become: true
  shell: setenforce 0
  ignore_errors: true

- name: postgresql_tablespace - create dir for test tablespace
  become: true
  file:
    path: '{{ test_tablespace_path }}'
    state: directory
    owner: '{{ pg_user }}'
    group: '{{ pg_user }}'
    mode: '0700'
  ignore_errors: true

- name: postgresql_tablespace - create test role to test change ownership
  become_user: '{{ pg_user }}'
  become: true
  postgresql_user:
    db: postgres
    login_user: '{{ pg_user }}'
    name: bob
    state: present
  ignore_errors: true

- name: postgresql_tablespace - create test role to test change ownership
  become_user: '{{ pg_user }}'
  become: true
  postgresql_user:
    db: postgres
    login_user: '{{ pg_user }}'
    name: alice
    state: present
  ignore_errors: true

- name: postgresql_tablespace - create a new tablespace called acme and set bob as an its owner
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    owner: bob
    location: /ssd
  register: result
  ignore_errors: true

- assert:
    that:
    - result is changed
    - result.owner == 'bob'
    - result.queries == ["CREATE TABLESPACE \"acme\" LOCATION '/ssd'", "ALTER TABLESPACE \"acme\" OWNER TO \"bob\""]
    - result.state == 'present'
    - result.tablespace == 'acme'
    - result.options == {}
    - result.location == '/ssd'

- name: postgresql_tablespace - try to create the same tablespace with different location
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    location: /another-ssd
  register: result
  ignore_errors: true

- assert:
    that:
    - result is not changed
    - result.msg == "Tablespace 'acme' exists with different location '/ssd'"

- name: postgresql_tablespace - change tablespace owner to alice
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    owner: alice
  register: result
  ignore_errors: true

- assert:
    that:
    - result is changed
    - result.owner == 'alice'
    - result.queries == ["ALTER TABLESPACE \"acme\" OWNER TO \"alice\""]
    - result.state == 'present'
    - result.tablespace == 'acme'
    - result.options == {}

- name: postgresql_tablespace - try to change tablespace owner to alice again to be sure that nothing changes
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    owner: alice
  register: result
  ignore_errors: true

- assert:
    that:
    - result is not changed
    - result.owner == 'alice'
    - result.queries == []
    - result.state == 'present'
    - result.tablespace == 'acme'
    - result.options == {}

- name: postgresql_tablespace - change tablespace options
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    set:
      seq_page_cost: 4
  register: result
  ignore_errors: true

- assert:
    that:
    - result is changed
    - result.owner == 'alice'
    - result.queries == ["ALTER TABLESPACE \"acme\" SET (seq_page_cost = '4')"]
    - result.state == 'present'
    - result.tablespace == 'acme'
    - result.options.seq_page_cost == '4'
  when: postgres_version_resp.stdout is version('9.0', '>=')

- name: postgresql_tablespace - reset seq_page_cost option
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    login_db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    set:
      seq_page_cost: reset
  register: result
  ignore_errors: true

- assert:
    that:
    - result is changed
    - result.queries == ["ALTER TABLESPACE \"acme\" RESET (seq_page_cost)"]
  when: postgres_version_resp.stdout is version('9.0', '>=')

- name: postgresql_tablespace - reset seq_page_cost option again
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    set:
      seq_page_cost: reset
  register: result
  ignore_errors: true

- assert:
    that:
    - result is not changed
    - result.queries == []
  when: postgres_version_resp.stdout is version('9.0', '>=')

- name: postgresql_tablespace - rename tablespace
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: acme
    rename_to: foo
  register: result
  ignore_errors: true

- assert:
    that:
    - result is changed
    - result.newname == 'foo'
    - result.queries == ["ALTER TABLESPACE \"acme\" RENAME TO \"foo\""]

- name: postgresql_tablespace - rename tablespace to potentially dangerous name
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: foo
    rename_to: '{{ dangerous_name }}'
    trust_input: no
  register: result
  ignore_errors: true

- assert:
    that:
    - result is failed
    - result.msg == 'Passed input \'{{ dangerous_name }}\' is potentially dangerous'

- name: postgresql_tablespace - drop tablespace
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: foo
    state: absent
    trust_input: yes
  register: result
  ignore_errors: true

- assert:
    that:
    - result is changed
    - result.state == 'absent'
    - result.queries == ["DROP TABLESPACE \"foo\""]

- name: postgresql_tablespace - try to drop nonexistent tablespace
  become_user: '{{ pg_user }}'
  become: true
  postgresql_tablespace:
    db: postgres
    login_user: '{{ pg_user }}'
    name: foo
    state: absent
  register: result
  ignore_errors: true

- assert:
    that:
    - result is not changed
    - result.msg == "Tries to drop nonexistent tablespace 'foo'"