---
test_name: change_model_version_and_get_next_task
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- id: create_project
  type: ref

- name: create_task_with_2_predictions
  request:
    files:
      json_file: tests/test_suites/samples/text_with_2_predictions.json
    headers:
      content-type: multipart/form-data
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/import'
  response:
    json:
      annotation_count: 0
      prediction_count: 2
      task_count: 1
    status_code: 201

- name: get_available_model_versions
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/model-versions'
  response:
    json:
      model_version_B: 1
      model_version_A: 1

- name: get_next_task
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        text: Test example phrase
      predictions:  # last taken model version is activated
        - result:
          - from_name: label
            to_name: text
            type: choices
            value:
              choices:
                - neg
          model_version: model_version_B

- name: change_project_model_version
  request:
    method: PATCH
    url: '{django_live_url}/api/projects/{project_pk}'
    headers:
      content-type: application/json
    json:
      model_version: model_version_A

- name: get_next_task
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        text: Test example phrase
      is_labeled: false
      predictions:
        - result:
          - from_name: label
            to_name: text
            type: choices
            value:
              choices:
                - pos
          model_version: model_version_A

- name: change_project_model_version
  request:
    method: PATCH
    url: '{django_live_url}/api/projects/{project_pk}'
    headers:
      content-type: application/json
    json:
      model_version: null

- name: get_next_task
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        text: Test example phrase


---
test_name: check_task_lock_with_data_manager_queue
# task lock shouldn't affect the sequence any way
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- id: create_project
  type: ref

- name: create_2_tasks
  request:
    files:
      json_file: tests/test_suites/samples/text_with_2_tasks.json
    headers:
      content-type: multipart/form-data
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/import'
  response:
    json:
      annotation_count: 0
      prediction_count: 0
      task_count: 2
    status_code: 201

# 1st next task api with filter/ordering payload works as data manager queue mode
- name: get_next_task
  request:
    method: POST
    url: '{django_live_url}/api/dm/actions?project={project_pk}&id=next_task'
    json:
      ordering:
        - -tasks:id
      selectedItems:
        all: true
        excluded: []
      filters:
        conjunction: and
        items: []
  response:
    json:
      data:
        text: Example 2

# 2nd api call must return the same task in data manager queue mode
- name: get_next_task
  request:
    method: POST
    url: '{django_live_url}/api/dm/actions?project={project_pk}&id=next_task'
    json:
      ordering:
        - -tasks:id
      selectedItems:
        all: true
        excluded: []
      filters:
        conjunction: and
        items: []
  response:
    json:
      data:
        text: Example 2

# 3rd - user direct ordering
- name: get_next_task
  request:
    method: POST
    url: '{django_live_url}/api/dm/actions?project={project_pk}&id=next_task'
    json:
      ordering:
        - tasks:id
      selectedItems:
        all: true
        excluded: []
      filters:
        conjunction: and
        items: []
  response:
    json:
      data:
        text: Example 1

# 4th - disable data manager queue, use label stream as is
- name: get_next_task
  request:
    method: POST
    url: '{django_live_url}/api/dm/actions?project={project_pk}&id=next_task'
  response:
    status_code: 200
    save:
      json:
        task_id: id

# 5th - label stream again must return previously locked task
- name: get_next_task
  request:
    method: POST
    url: '{django_live_url}/api/dm/actions?project={project_pk}&id=next_task'
  response:
    status_code: 200
    json:
      id: !int "{task_id}"
      
