---
- name: Generate names
  set_fact:
    project_name1: "AWX-Collection-tests-tower_project-project1-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"
    project_name2: "AWX-Collection-tests-tower_project-project2-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"
    project_name3: "AWX-Collection-tests-tower_project-project3-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"
    jt1: "AWX-Collection-tests-tower_project-jt1-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"
    scm_cred_name: "AWX-Collection-tests-tower_project-scm-cred-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"
    org_name: "AWX-Collection-tests-tower_project-org-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"
    cred_name: "AWX-Collection-tests-tower_project-cred-{{ lookup('password', '/dev/null chars=ascii_letters length=16') }}"

- name: Create an SCM Credential
  tower_credential:
    name: "{{ scm_cred_name }}"
    organization: Default
    kind: scm
  register: result

- assert:
    that:
      - result is changed

- name: Create a git project without credentials without waiting
  tower_project:
    name: "{{ project_name1 }}"
    organization: Default
    scm_type: git
    scm_url: https://github.com/ansible/test-playbooks
    wait: false
  register: result

- assert:
    that:
      - result is changed

- name: Recreate the project to validate not changed
  tower_project:
    name: "{{ project_name1 }}"
    organization: Default
    scm_type: git
    scm_url: https://github.com/ansible/test-playbooks
    wait: true
  register: result

- assert:
    that:
      - result is not changed

- name: Create organizations
  tower_organization:
    name: "{{ org_name }}"
  register: result

- assert:
    that:
      - result is changed

- name: Create credential
  tower_credential:
    kind: scm
    name: "{{ cred_name }}"
    organization: "{{ org_name }}"
  register: result

- assert:
    that:
      - result is changed

- name: Create a new test project in check_mode
  tower_project:
    name: "{{ project_name2 }}"
    organization: "{{ org_name }}"
    scm_type: git
    scm_url: https://github.com/ansible/test-playbooks
    scm_credential: "{{ cred_name }}"
  check_mode: true

- name: Create a new test project
  tower_project:
    name: "{{ project_name2 }}"
    organization: "{{ org_name }}"
    scm_type: git
    scm_url: https://github.com/ansible/test-playbooks
    scm_credential: "{{ cred_name }}"
  register: result

# If this fails it may be because the check_mode task actually already created
# the project, or it could be because the module actually failed somehow
- assert:
    that:
      - "result is changed"

- name: Check module fails with correct msg when given non-existing org as param
  tower_project:
    name: "{{ project_name2 }}"
    organization: Non_Existing_Org
    scm_type: git
    scm_url: https://github.com/ansible/test-playbooks
    scm_credential: "{{ cred_name }}"
  register: result
  ignore_errors: true

- assert:
    that:
      - "result is failed"
      - "result is not changed"
      - "'Non_Existing_Org' in result.msg"
      - "result.total_results == 0"

- name: Check module fails with correct msg when given non-existing credential as param
  tower_project:
    name: "{{ project_name2 }}"
    organization: "{{ org_name }}"
    scm_type: git
    scm_url: https://github.com/ansible/test-playbooks
    scm_credential: Non_Existing_Credential
  register: result
  ignore_errors: true

- assert:
    that:
      - "result is failed"
      - "result is not changed"
      - "'Non_Existing_Credential' in result.msg"
      - "result.total_results == 0"

- name: Create a git project without credentials without waiting
  tower_project:
    name: "{{ project_name3 }}"
    organization: Default
    scm_type: git
    scm_branch: empty_branch
    scm_url: https://github.com/ansible/test-playbooks
    allow_override: true
  register: result

- assert:
    that:
      - result is changed

- name: Update a git project, update the project and wait.
  tower_project:
    name: "{{ project_name3 }}"
    organization: Default
    scm_type: git
    scm_branch: empty_branch
    scm_url: https://github.com/ansible/test-playbooks
    allow_override: true
    wait: true
    update_project: true
  register: result

- name: Update a git project, update the project without waiting.
  tower_project:
    name: "{{ project_name3 }}"
    organization: Default
    scm_type: git
    scm_branch: empty_branch
    scm_url: https://github.com/ansible/test-playbooks
    wait: false
    update_project: true
  register: result

- name: Create a job template that overrides the project scm_branch
  tower_job_template:
    name: "{{ jt1 }}"
    project: "{{ project_name3 }}"
    inventory: "Demo Inventory"
    scm_branch: master
    playbook: debug.yml

- name: Launch "{{ jt1 }}"
  tower_job_launch:
    job_template: "{{ jt1 }}"
  register: result

- assert:
    that:
      - result is changed

- name: "wait for job {{ result.id }}"
  tower_job_wait:
    job_id: "{{ result.id }}"
  register: job

- assert:
    that:
      - job is successful

- name: Delete the test job_template
  tower_job_template:
    name: "{{ jt1 }}"
    project: "{{ project_name3 }}"
    inventory: "Demo Inventory"
    state: absent

- name: Delete the test project 3
  tower_project:
    name: "{{ project_name3 }}"
    organization: Default
    state: absent

- name: Delete the test project 2
  tower_project:
    name: "{{ project_name2 }}"
    organization: "{{ org_name }}"
    state: absent

- name: Delete the SCM Credential
  tower_credential:
    name: "{{ scm_cred_name }}"
    organization: Default
    kind: scm
    state: absent
  register: result

- assert:
    that:
      - result is changed

- name: Delete the test project 1
  tower_project:
    name: "{{ project_name1 }}"
    organization: Default
    state: absent
  register: result

- assert:
    that:
      - result is changed

- name: Delete credential
  tower_credential:
    kind: scm
    name: "{{ cred_name }}"
    organization: "{{ org_name }}"
    state: absent
  register: result

- assert:
    that:
      - result is changed

- name: Delete the organization
  tower_organization:
    name: "{{ org_name }}"
    state: absent
  register: result

- assert:
    that:
      - result is changed
