---
test_name: test_import_from_s3_storage
strict: false
marks:
  - usefixtures:
      - django_live_url
stages:
  - id: signup
    type: ref
  - name: stage
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image_url"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_s3_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        bucket: pytest-s3-images
        project: "{project_pk}"
        title: Testing S3 storage (bucket from conftest.py)
        use_blob_urls: true
        presign_ttl: 3600
        recursive_scan: true
      method: POST
      url: "{django_live_url}/api/storages/s3"
    response:
      save:
        json:
          storage_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        title: Testing S3 storage (bucket from conftest.py) changed
      method: PATCH
      url: "{django_live_url}/api/storages/s3/{storage_pk}"
    response:
      status_code: 200
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/storages/s3/{storage_pk}/sync"
    response:
      json:
        last_sync_count: 4
      status_code: 200
  - name: stage
    request:
      method: GET
      url: "{django_live_url}/api/projects/{project_pk}/next"
    response:
      json:
        data:
          image_url: !re_match "/tasks/\\d+/resolve/\\?fileuri=czM6Ly9weXRlc3QtczMtaW1hZ2VzL2ltYWdlMS5qcGc="
      status_code: 200
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/dm/views?project={project_pk}"
      json:
        project: "{project_pk}"
    response:
      status_code: 201
      save:
        json:
          view_pk: id
  - name: stage
    request:
      method: GET
      url: "{django_live_url}/api/tasks?view={view_pk}"
    response:
      json:
        tasks:
          - data:
              image_url: !re_match "/tasks/\\d+/resolve/\\?fileuri=czM6Ly9weXRlc3QtczMtaW1hZ2VzL2ltYWdlMS5qcGc="
      status_code: 200
  - name: stage
    request:
      data:
        project: "{project_pk}"
      method: GET
      url: "{django_live_url}/api/storages"
    response:
      status_code: 200
  - name: stage
    request:
      headers:
        content-type: application/json
      json:
        presign: false
      method: PATCH
      url: "{django_live_url}/api/storages/s3/{storage_pk}"
    response:
      status_code: 200
  - name: stage
    request:
      data:
        id: !int "{storage_pk}"
        bucket: pytest-s3-images
        project: "{project_pk}"
        title: Testing S3 storage (bucket from conftest.py)
        use_blob_urls: true
      method: POST
      url: "{django_live_url}/api/storages/s3/validate"
    response:
      status_code: 200
  - name: stage
    request:
      data:
        project: "{project_pk}"
      method: GET
      url: "{django_live_url}/api/storages"
    response:
      status_code: 200
---
test_name: test_import_from_s3_storage_recursive_scan
strict: false
marks:
  - usefixtures:
      - django_live_url
stages:
  - id: signup
    type: ref
  - name: stage
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image_url"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_s3_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        bucket: pytest-s3-images
        prefix: subdir
        project: "{project_pk}"
        title: Testing S3 storage (bucket from conftest.py)
        use_blob_urls: true
      method: POST
      url: "{django_live_url}/api/storages/s3"
    response:
      save:
        json:
          storage_pk: id
      status_code: 201
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/storages/s3/{storage_pk}/sync"
    response:
      json:
        last_sync_count: 2
      status_code: 200

  # now update storage to do recursive scan
  - name: stage
    request:
      method: PATCH
      url: "{django_live_url}/api/storages/s3/{storage_pk}"
      json:
        recursive_scan: true
    response:
      status_code: 200

  # and sync - the last subdir/another image should be returned
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/storages/s3/{storage_pk}/sync"
    response:
      json:
        last_sync_count: 1
      status_code: 200

---
test_name: test_import_from_s3_storage_recursive_scan_straigtaway
strict: false
marks:
  - usefixtures:
      - django_live_url
stages:
  - id: signup
    type: ref
  - name: stage
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image_url"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_s3_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        bucket: pytest-s3-images
        prefix: subdir
        project: "{project_pk}"
        title: Testing S3 storage (bucket from conftest.py)
        use_blob_urls: true
        recursive_scan: true
      method: POST
      url: "{django_live_url}/api/storages/s3"
    response:
      save:
        json:
          storage_pk: id
      status_code: 201
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/storages/s3/{storage_pk}/sync"
    response:
      json:
        last_sync_count: 3
      status_code: 200

---
test_name: test_import_from_gcs_storage
strict: false
marks:
  - usefixtures:
      - django_live_url
stages:
  - id: signup
    type: ref
  - name: stage
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image_url"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_import_from_gcs_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        bucket: test-gs-bucket
        project: "{project_pk}"
        title: Test GCS storage import (mocked GCS client from conftest.py)
        use_blob_urls: true
        recursive_scan: true
      method: POST
      url: "{django_live_url}/api/storages/gcs"
    response:
      save:
        json:
          storage_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        title: Test GCS storage import (mocked GCS client from conftest.py) changed
      method: PATCH
      url: "{django_live_url}/api/storages/gcs/{storage_pk}"
    response:
      status_code: 200
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/storages/gcs/{storage_pk}/sync"
    response:
      json:
        last_sync_count: 3
      status_code: 200
  - name: stage
    request:
      method: GET
      url: "{django_live_url}/api/projects/{project_pk}/next"
    response:
      json:
        data:
          image_url: !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldC9hYmM="
      status_code: 200
---
test_name: test_invalidate_gcs_storage
strict: false
marks:
  - usefixtures:
      - django_live_url
stages:
  - id: signup
    type: ref
  - name: stage
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image_url"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_invalidate_gcs_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201

  - name: stage
    request:
      data:
        bucket: test-gs-bucket
        project: "{project_pk}"
        title: Test Invalidate GCS storage (mocked GCS client from conftest.py)
        use_blob_urls: true
        google_application_credentials: '{{"wrong": "service account info"}}'
        recursive_scan: true
      method: POST
      url: "{django_live_url}/api/storages/gcs/validate"
    response:
      status_code: 400

---
test_name: test_import_from_gcs_storage_json
strict: false
marks:
  - usefixtures:
      - django_live_url
stages:
  - id: signup
    type: ref
  - name: stage
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image_url"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_import_from_gcs_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201
  - name: stage
    request:
      data:
        bucket: test-gs-bucket_JSON
        project: "{project_pk}"
        title: Test GCS storage import (mocked GCS client from conftest.py)
        use_blob_urls: false
        recursive_scan: true
      method: POST
      url: "{django_live_url}/api/storages/gcs"
    response:
      save:
        json:
          storage_pk: id
      status_code: 201
  - name: stage
    request:
      method: POST
      url: "{django_live_url}/api/storages/gcs/{storage_pk}/sync"
    response:
      json:
        last_sync_count: 3
      status_code: 200
  - name: stage
    request:
      method: GET
      url: "{django_live_url}/api/projects/{project_pk}/next"
    response:
      status_code: 200

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

  - name: setup a project
    request:
      data:
        is_published: true
        label_config:
          <View><Image name="image" value="$image"/><Choices name="label"
          toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
        title: test_import_from_gcs_storage
      method: POST
      url: "{django_live_url}/api/projects"
    response:
      save:
        json:
          project_pk: id
      status_code: 201

  - name: import a task with nested dictionary and array
    request:
      headers:
        content-type: application/json
      json:
        data:
          image: gs://test-gs-bucket_JSON/manual.link.jpg
          dict:
            key1: gs://test-gs-bucket_JSON/manual.link.jpg
            array:
              - gs://test-gs-bucket_JSON/manual.link.jpg
              - gs://test-gs-bucket_JSON/manual.link.jpg
          array:
            - item1: gs://test-gs-bucket_JSON/manual.link.jpg
              some: "some text"
            - item2: gs://test-gs-bucket_JSON/manual.link.jpg
              some: "some text"
            # This link should not be resolved - no matching bucket
            - item3: gs://bad-bucket/manual.link.jpg
              some: "some text"
      method: POST
      url: "{django_live_url}/api/projects/{project_pk}/import"
    response:
      json:
        annotation_count: 0
        prediction_count: 0
        task_count: 1
      status_code: 201

  - name: then connect GCS
    request:
      data:
        bucket: test-gs-bucket_JSON
        project: "{project_pk}"
        title: Test GCS storage import (mocked GCS client from conftest.py)
        use_blob_urls: false
        recursive_scan: true
      method: POST
      url: "{django_live_url}/api/storages/gcs"
    response:
      save:
        json:
          storage_pk: id
      status_code: 201

  - name: url should be resolved
    request:
      method: GET
      url: "{django_live_url}/api/projects/{project_pk}/next"
    response:
      json:
        data:
          image: !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldF9KU09OL21hbnVhbC5saW5rLmpwZw=="
          dict:
            key1: !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldF9KU09OL21hbnVhbC5saW5rLmpwZw=="
            array:
              - !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldF9KU09OL21hbnVhbC5saW5rLmpwZw=="
              - !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldF9KU09OL21hbnVhbC5saW5rLmpwZw=="
          array:
            - item1: !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldF9KU09OL21hbnVhbC5saW5rLmpwZw=="
              some: "some text"
            - item2: !re_match "/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly90ZXN0LWdzLWJ1Y2tldF9KU09OL21hbnVhbC5saW5rLmpwZw=="
              some: "some text"
            # This link should remain unresolved - no matching bucket
            - item3: !re_match "gs://bad-bucket/manual.link.+"
              some: "some text"
      status_code: 200
---
test_name: get_import_export_storage_types
strict: true
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/storages/types'
  response:
    status_code: 200
    json:
      - name: s3
        title: AWS S3
      - name: gcs
        title: Google Cloud Storage
      - name: azure
        title: Microsoft Azure
      - name: redis
        title: Redis
      - name: localfiles
        title: Local files
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/storages/export/types'
  response:
    status_code: 200
    json:
      - name: s3
        title: AWS S3
      - name: gcs
        title: Google Cloud Storage
      - name: azure
        title: Microsoft Azure
      - name: redis
        title: Redis
      - name: localfiles
        title: Local files

---
test_name: test_export_s3_storage
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_s3_storage
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-export-s3-bucket
      project: '{project_pk}'
      title: Testing Export S3 storage (bucket from conftest.py)
    method: POST
    url: '{django_live_url}/api/storages/export/s3'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      data:
        image_url: http://test.heartex.com/my_super_image.jpg
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/tasks'
  response:
    save:
      json:
        task_pk: id
    status_code: 201
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      lead_time: 12.34
      result:
      - from_name: label
        to_name: image
        type: choices
        value:
          choices:
          - pos
    method: POST
    url: '{django_live_url}/api/tasks/{task_pk}/annotations'
  response:
    save:
      json:
        annotation_pk: id
    status_code: 201
- name: sync
  request:
    method: POST
    url: '{django_live_url}/api/storages/export/s3/{storage_pk}/sync'
  response:
    status_code: 200
- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/dm/actions?id=delete_tasks_annotations&project={project_pk}'
  response:
    status_code: 200
---
test_name: test_export_gcs_storage
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_export_gcs_storage
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-export-gcs-bucket
      project: '{project_pk}'
      title: Testing Export GCS storage (bucket from conftest.py)
      recursive_scan: true
    method: POST
    url: '{django_live_url}/api/storages/export/gcs'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      title: New title
    method: PATCH
    url: '{django_live_url}/api/storages/export/gcs/{storage_pk}'
  response:
    status_code: 200
- name: stage
  request:
    data:
      id: !int "{storage_pk}"
      bucket: test-gs-bucket
    method: POST
    url: '{django_live_url}/api/storages/export/gcs/validate'
  response:
    status_code: 400
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      data:
        image_url: http://test.heartex.com/my_super_image.jpg
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/tasks'
  response:
    save:
      json:
        task_pk: id
    status_code: 201
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      lead_time: 12.34
      result:
      - from_name: label
        to_name: image
        type: choices
        value:
          choices:
          - pos
    method: POST
    url: '{django_live_url}/api/tasks/{task_pk}/annotations'
  response:
    save:
      json:
        annotation_pk: id
    status_code: 201
- name: sync
  request:
    method: POST
    url: '{django_live_url}/api/storages/export/gcs/{storage_pk}/sync'
  response:
    status_code: 200
---
test_name: test_empty_storage_list
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      email: test_export_gcs_storage@test.com
      password: 12345678
      title: test_export_gcs_storage
    method: POST
    url: '{django_live_url}/user/signup'
  response:
    status_code: 302
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/storages'
  response:
    status_code: 200

---
test_name: test_validate_s3_connection
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_validate_s3_connection
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-s3-images
      project: '{project_pk}'
      title: Testing S3 storage (bucket from conftest.py)
      use_blob_urls: true
    method: POST
    url: '{django_live_url}/api/storages/s3/validate'
  response:
    status_code: 200
- name: stage
  request:
    data:
      bucket: unexisted-s3-bucket
      project: '{project_pk}'
      title: Testing Invalid S3 storage (bucket from conftest.py)
    method: POST
    url: '{django_live_url}/api/storages/s3/validate'
  response:
    json:
      detail: Validation error
      exc_info: null
      status_code: 400
      validation_errors:
        non_field_errors:
        - Cannot find bucket unexisted-s3-bucket in S3
    status_code: 400

---
test_name: test_import_from_azure_storage
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_azure_storage
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      container: pytest-azure-images
      project: '{project_pk}'
      title: Testing Azure storage (bucket from conftest.py)
      use_blob_urls: true
      recursive_scan: true
    method: POST
    url: '{django_live_url}/api/storages/azure'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/storages/azure/{storage_pk}/sync'
  response:
    json:
      last_sync_count: 3
    status_code: 200
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        image_url: !re_match "/tasks/\\d+/resolve/\\?fileuri=YXp1cmUtYmxvYjovL3B5dGVzdC1henVyZS1pbWFnZXMvYWJj"
    status_code: 200
- name: stage
  request:
    data:
      project: '{project_pk}'
    method: GET
    url: '{django_live_url}/api/storages'
  response:
    status_code: 200
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      presign: false
    method: PATCH
    url: '{django_live_url}/api/storages/azure/{storage_pk}'
  response:
    status_code: 200
- name: stage
  request:
    data:
      project: '{project_pk}'
    method: GET
    url: '{django_live_url}/api/storages'
  response:
    status_code: 200

---
test_name: test_export_azure_storage
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_export_azure_storage
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-export-azure-bucket
      project: '{project_pk}'
      title: Testing Export azure storage (bucket from conftest.py)
    method: POST
    url: '{django_live_url}/api/storages/export/azure'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      title: New title
    method: PATCH
    url: '{django_live_url}/api/storages/export/azure/{storage_pk}'
  response:
    status_code: 200
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      data:
        image_url: http://test.heartex.com/my_super_image.jpg
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/tasks'
  response:
    save:
      json:
        task_pk: id
    status_code: 201
- name: stage
  request:
    headers:
      content-type: application/json
    json:
      lead_time: 12.34
      result:
      - from_name: label
        to_name: image
        type: choices
        value:
          choices:
          - pos
    method: POST
    url: '{django_live_url}/api/tasks/{task_pk}/annotations'
  response:
    save:
      json:
        annotation_pk: id
    status_code: 201

---
test_name: test_import_jsons_from_s3
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_s3_storage_with_json
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-s3-jsons
      project: '{project_pk}'
      title: Testing S3 storage 2 (bucket from conftest.py)
      use_blob_urls: false
    method: POST
    url: '{django_live_url}/api/storages/s3'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/storages/s3/{storage_pk}/sync'
  response:
    json:
      last_sync_count: 1
    status_code: 200
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/tasks'
  response:
    status_code: 200

- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        image_url: "http://ggg.com/image.jpg"
    status_code: 200

---

test_name: test_resolving_embedded_links
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: create_project_with_HyperText_for_embed_links
  request:
    data:
      is_published: true
      label_config: '
      <View>
        <Header value="Rate this article"/>
        <Rating name="rating" toName="pdf" maxRating="10" icon="star" size="medium" />
        <Choices name="choices" choice="single-radio" toName="pdf" showInline="true">
          <Choice value="Important article"/>
          <Choice value="Yellow press"/>
        </Choices>
        <HyperText name="pdf" value="$pdf" inline="true"/>
      </View>
      '
      title: create_project_with_HyperText_for_embed_links
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: then connect GCS
  request:
    data:
      bucket: heartex-test
      project: '{project_pk}'
      title: Test GCS storage import (mocked GCS client from conftest.py)
      use_blob_urls: false
    method: POST
    url: '{django_live_url}/api/storages/gcs'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201

- name: Import_Data_With_Embedded_Links
  request:
    headers:
      content-type: application/json
    json:
      - pdf: "<embed src='gs://heartex-test/file.pdf'/>"
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/import'
  response:
    json:
      annotation_count: 0
      prediction_count: 0
      task_count: 1
    status_code: 201

- name: Check_Resolved_Uri
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        pdf: !re_match "<embed src='/tasks/\\d+/resolve/\\?fileuri=Z3M6Ly9oZWFydGV4LXRlc3QvZmlsZS5wZGY='/>"
    status_code: 200
---
# we check here 2 things:
# - that json blobs are successfully synced from bucket,
# - s3:// links inside hypertext (like <a href="s3://.."/> have been resolved)
test_name: test_import_jsons_from_s3_and_resolve_hypertext
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><HyperText name="text" value="$text"/><Choices name="label"
        toName="text"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_s3_storage_with_json_and_hypertext
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-s3-jsons-hypertext
      project: '{project_pk}'
      title: Testing S3 storage 3 (bucket from conftest.py)
      use_blob_urls: false
    method: POST
    url: '{django_live_url}/api/storages/s3'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/storages/s3/{storage_pk}/sync'
  response:
    json:
      last_sync_count: 1
    status_code: 200
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/tasks'
  response:
    status_code: 200

- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        text: !re_match "<a href=\"/tasks/\\d+/resolve/\\?fileuri=czM6Ly9weXRlc3QtczMtanNvbnMtaHlwZXJ0ZXh0L2ZpbGUgd2l0aCAvc3BhY2VzIGFuZCcgLyAnIC8gcXVvdGVzLmpwZw=="
    status_code: 200
---
# - Check that json blobs containing partially encoded contents resolve correctly from the bucket,
# - s3:// links inside hypertext (like <a href="s3://path/to/%2Bbucket%3D.jpg"/> have been resolved)
test_name: test_import_jsons_from_s3_and_resolve_partially_encoded
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><HyperText name="text" value="$text"/><Choices name="label"
        toName="text"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_s3_storage_with_json_and_hypertext
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      bucket: pytest-s3-json-partially-encoded
      project: '{project_pk}'
      title: Testing S3 storage 3 (bucket from conftest.py)
      use_blob_urls: false
    method: POST
    url: '{django_live_url}/api/storages/s3'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/storages/s3/{storage_pk}/sync'
  response:
    json:
      last_sync_count: 1
    status_code: 200
- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/tasks'
  response:
    status_code: 200

- name: stage
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    json:
      data:
        text: !re_match "<a href=\"/tasks/\\d+/resolve/\\?fileuri=czM6Ly9weXRlc3QtczMtanNvbi1wYXJ0aWFsbHktZW5jb2RlZC9maWxlIHdpdGggL3NwYWNlcyBhbmQnIC8gJyAvICUyQnF1b3RlcyUzRC5qcGc=\"/>"
    status_code: 200
---
# we don't fail when unexisted s3:// links occur in the list
test_name: test_import_json_with_unexisted_s3_links
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image"/><Choices name="label"
        toName="image"><Choice value="0"/><Choice value="1"/></Choices></View>
      title: test_s3_storage_with_json_and_unexisted_links
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: connect s3 import storage
  request:
    data:
      bucket: pytest-s3-jsons-unexisted_links
      project: '{project_pk}'
      title: Testing S3 storage 4 (bucket from conftest.py)
      use_blob_urls: false
      presign: false
    method: POST
    url: '{django_live_url}/api/storages/s3'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: import tasks with s3 links
  request:
    files:
      file: tests/test_suites/samples/unexisted_s3_links.txt
    headers:
      content-type: multipart/form-data
    method: POST
    url: '{django_live_url}/api/projects/{project_pk}/import'

- name: get next task
  request:
    method: GET
    url: '{django_live_url}/api/projects/{project_pk}/next'
  response:
    status_code: 200
    json:
      data:
        image: !re_match "/tasks/\\d+/resolve/\\?fileuri=czM6Ly9weXRlc3QtczMtanNvbnMtdW5leGlzdGVkX2xpbmtzL3NvbWUtdW5leGlzdGVkLWltYWdlLmpwZw=="

---
test_name: test_connection_to_import_redis_storage
strict: false
marks:
- usefixtures:
  - django_live_url
stages:
- id: signup
  type: ref
- name: stage
  request:
    data:
      is_published: true
      label_config: <View><Image name="image" value="$image_url"/><Choices name="label"
        toName="image"><Choice value="pos"/><Choice value="neg"/></Choices></View>
      title: test_redis_storage
    method: POST
    url: '{django_live_url}/api/projects'
  response:
    save:
      json:
        project_pk: id
    status_code: 201
- name: stage
  request:
    data:
      project: '{project_pk}'
      title: Testing Redis storage
    method: POST
    url: '{django_live_url}/api/storages/redis/validate'
  response:
    status_code: 200
- name: stage
  request:
    data:
      project: '{project_pk}'
      title: Testing Redis storage
    method: POST
    url: '{django_live_url}/api/storages/redis'
  response:
    save:
      json:
        storage_pk: id
    status_code: 201
- name: stage
  request:
    method: POST
    url: '{django_live_url}/api/storages/redis/{storage_pk}/sync'
  response:
    json:
      last_sync_count: 0
    status_code: 200
