2022-05-25 15:17:30 -04:00
|
|
|
"""Test Process Api Blueprint."""
|
2022-05-31 14:10:00 -04:00
|
|
|
import io
|
2022-05-25 15:17:30 -04:00
|
|
|
import json
|
|
|
|
import os
|
|
|
|
import shutil
|
2022-06-12 07:39:30 -04:00
|
|
|
from typing import Dict
|
|
|
|
from typing import Iterator
|
|
|
|
from typing import Optional
|
|
|
|
from typing import Union
|
2022-05-25 15:17:30 -04:00
|
|
|
|
2022-05-31 14:10:00 -04:00
|
|
|
import pytest
|
2022-06-12 07:39:30 -04:00
|
|
|
from flask.app import Flask
|
2022-05-25 15:17:30 -04:00
|
|
|
from flask.testing import FlaskClient
|
2022-06-08 12:14:39 -04:00
|
|
|
from flask_bpmn.models.db import db
|
2022-06-01 11:17:25 -04:00
|
|
|
from tests.spiffworkflow_backend.helpers.test_data import find_or_create_user
|
|
|
|
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
|
|
|
|
from tests.spiffworkflow_backend.helpers.test_data import logged_in_headers
|
|
|
|
|
|
|
|
from spiffworkflow_backend.models.file import FileType
|
|
|
|
from spiffworkflow_backend.models.process_group import ProcessGroup
|
2022-06-08 12:14:39 -04:00
|
|
|
from spiffworkflow_backend.models.process_group import ProcessGroupSchema
|
|
|
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
2022-06-01 11:17:25 -04:00
|
|
|
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
|
|
|
from spiffworkflow_backend.models.process_model import ProcessModelInfoSchema
|
|
|
|
from spiffworkflow_backend.services.process_model_service import ProcessModelService
|
2022-05-25 15:17:30 -04:00
|
|
|
|
2022-06-13 15:44:19 -04:00
|
|
|
from werkzeug.test import TestResponse
|
|
|
|
|
2022-05-25 15:17:30 -04:00
|
|
|
|
|
|
|
@pytest.fixture()
|
2022-06-10 18:27:06 -04:00
|
|
|
def with_bpmn_file_cleanup() -> Iterator[None]:
|
2022-05-25 16:38:03 -04:00
|
|
|
"""Process_group_resource."""
|
2022-05-26 14:17:05 -04:00
|
|
|
try:
|
|
|
|
yield
|
|
|
|
finally:
|
|
|
|
process_model_service = ProcessModelService()
|
|
|
|
if os.path.exists(process_model_service.root_path()):
|
|
|
|
shutil.rmtree(process_model_service.root_path())
|
|
|
|
|
2022-05-25 15:17:30 -04:00
|
|
|
|
2022-05-26 14:17:05 -04:00
|
|
|
# phase 1: req_id: 7.1 Deploy process
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_model_add(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-05-26 14:17:05 -04:00
|
|
|
"""Test_add_new_process_model."""
|
|
|
|
create_process_model(app, client)
|
|
|
|
create_spec_file(app, client)
|
2022-05-25 15:17:30 -04:00
|
|
|
|
2022-05-31 14:10:00 -04:00
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_model_delete(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 18:47:38 -04:00
|
|
|
"""Test_process_model_delete."""
|
2022-06-08 18:17:46 -04:00
|
|
|
create_process_model(app, client)
|
|
|
|
|
|
|
|
# assert we have a model
|
2022-06-08 18:47:38 -04:00
|
|
|
process_model = ProcessModelService().get_spec("make_cookies")
|
2022-06-08 18:17:46 -04:00
|
|
|
assert process_model is not None
|
2022-06-08 18:47:38 -04:00
|
|
|
assert process_model.id == "make_cookies"
|
2022-06-08 18:17:46 -04:00
|
|
|
|
|
|
|
# delete the model
|
|
|
|
user = find_or_create_user()
|
2022-06-08 18:47:38 -04:00
|
|
|
response = client.delete(
|
2022-06-09 15:04:15 -04:00
|
|
|
f"/v1.0/process-models/{process_model.process_group_id}/{process_model.id}",
|
|
|
|
headers=logged_in_headers(user),
|
2022-06-08 18:47:38 -04:00
|
|
|
)
|
2022-06-10 12:17:49 -04:00
|
|
|
assert response.status_code == 200
|
2022-06-10 12:51:38 -04:00
|
|
|
assert response.json["ok"] is True
|
2022-06-08 18:17:46 -04:00
|
|
|
|
|
|
|
# assert we no longer have a model
|
2022-06-08 18:47:38 -04:00
|
|
|
process_model = ProcessModelService().get_spec("make_cookies")
|
2022-06-08 18:17:46 -04:00
|
|
|
assert process_model is None
|
|
|
|
|
|
|
|
|
2022-06-13 15:43:09 -04:00
|
|
|
def test_process_model_delete_with_instances(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
):
|
2022-06-14 09:44:36 -04:00
|
|
|
"""Test_process_model_delete_with_instances."""
|
2022-06-13 15:43:09 -04:00
|
|
|
db.session.query(ProcessInstanceModel).delete()
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
test_process_group_id = "runs_without_input"
|
|
|
|
test_process_model_id = "sample"
|
|
|
|
user = find_or_create_user()
|
|
|
|
headers = logged_in_headers(user)
|
|
|
|
# create an instance from a model
|
|
|
|
response = create_process_instance(app, client, test_process_group_id, test_process_model_id, headers)
|
|
|
|
|
|
|
|
data = json.loads(response.get_data(as_text=True))
|
|
|
|
# make sure the instance has the correct model
|
|
|
|
assert data['process_model_identifier'] == test_process_model_id
|
|
|
|
|
|
|
|
# try to delete the model
|
|
|
|
response = client.delete(
|
|
|
|
f"/v1.0/process-models/{test_process_group_id}/{test_process_model_id}",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
|
|
|
|
|
|
|
# make sure we get an error in the response
|
|
|
|
assert response.status_code == 400
|
|
|
|
data = json.loads(response.get_data(as_text=True))
|
|
|
|
assert data['code'] == 'existing_instances'
|
|
|
|
assert data['message'] == 'We cannot delete the model `sample`, there are existing instances that depend on it.'
|
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_model_update(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-10 10:32:45 -04:00
|
|
|
"""Test_process_model_update."""
|
2022-06-10 10:31:27 -04:00
|
|
|
create_process_model(app, client)
|
|
|
|
process_model = ProcessModelService().get_spec("make_cookies")
|
2022-06-10 10:34:09 -04:00
|
|
|
assert process_model.id == "make_cookies"
|
|
|
|
assert process_model.display_name == "Cooooookies"
|
2022-06-10 10:31:27 -04:00
|
|
|
|
2022-06-10 10:34:09 -04:00
|
|
|
process_model.display_name = "Updated Display Name"
|
2022-06-10 10:31:27 -04:00
|
|
|
|
|
|
|
user = find_or_create_user()
|
|
|
|
response = client.put(
|
2022-06-10 10:34:09 -04:00
|
|
|
f"/v1.0/process-models/{process_model.process_group_id}/{process_model.id}",
|
2022-06-10 10:31:27 -04:00
|
|
|
headers=logged_in_headers(user),
|
2022-06-10 10:34:09 -04:00
|
|
|
content_type="application/json",
|
|
|
|
data=json.dumps(ProcessModelInfoSchema().dump(process_model)),
|
2022-06-10 10:31:27 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
2022-06-10 10:34:09 -04:00
|
|
|
assert response.json["display_name"] == "Updated Display Name"
|
2022-06-10 10:31:27 -04:00
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_group_add(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_add_process_group."""
|
2022-06-08 18:17:46 -04:00
|
|
|
process_group = ProcessGroup(
|
2022-06-08 12:14:39 -04:00
|
|
|
id="test", display_name="Another Test Category", display_order=0, admin=False
|
|
|
|
)
|
|
|
|
user = find_or_create_user()
|
|
|
|
response = client.post(
|
|
|
|
"/v1.0/process-groups",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
content_type="application/json",
|
2022-06-08 18:17:46 -04:00
|
|
|
data=json.dumps(ProcessGroupSchema().dump(process_group)),
|
2022-06-08 12:14:39 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 201
|
|
|
|
|
2022-06-08 18:17:46 -04:00
|
|
|
# Check what is returned
|
2022-06-08 12:14:39 -04:00
|
|
|
result = ProcessGroupSchema().loads(response.get_data(as_text=True))
|
|
|
|
assert result.display_name == "Another Test Category"
|
|
|
|
assert result.id == "test"
|
|
|
|
|
2022-06-08 18:17:46 -04:00
|
|
|
# Check what is persisted
|
|
|
|
persisted = ProcessModelService().get_process_group("test")
|
|
|
|
assert persisted.display_name == "Another Test Category"
|
2022-06-08 18:47:38 -04:00
|
|
|
assert persisted.id == "test"
|
2022-06-08 18:17:46 -04:00
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_group_delete(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 18:47:38 -04:00
|
|
|
"""Test_process_group_delete."""
|
2022-06-08 18:17:46 -04:00
|
|
|
process_group_id = "test"
|
|
|
|
process_group_display_name = "My Process Group"
|
2022-06-10 12:19:00 -04:00
|
|
|
|
2022-06-08 18:17:46 -04:00
|
|
|
user = find_or_create_user()
|
2022-06-08 18:47:38 -04:00
|
|
|
create_process_group(
|
|
|
|
client, user, process_group_id, display_name=process_group_display_name
|
|
|
|
)
|
2022-06-08 18:17:46 -04:00
|
|
|
persisted = ProcessModelService().get_process_group(process_group_id)
|
|
|
|
assert persisted is not None
|
|
|
|
assert persisted.id == process_group_id
|
|
|
|
|
2022-06-10 08:15:06 -04:00
|
|
|
client.delete(
|
|
|
|
f"/v1.0/process-groups/{process_group_id}", headers=logged_in_headers(user)
|
|
|
|
)
|
2022-06-10 08:11:26 -04:00
|
|
|
|
|
|
|
deleted = ProcessModelService().get_process_group(process_group_id)
|
|
|
|
assert deleted is None
|
2022-06-08 18:17:46 -04:00
|
|
|
|
2022-06-08 12:14:39 -04:00
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_group_update(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-10 12:50:29 -04:00
|
|
|
"""Test Process Group Update."""
|
2022-06-10 12:51:38 -04:00
|
|
|
group_id = "test_process_group"
|
|
|
|
group_display_name = "Test Group"
|
2022-06-10 12:18:37 -04:00
|
|
|
|
|
|
|
user = find_or_create_user()
|
|
|
|
create_process_group(client, user, group_id, display_name=group_display_name)
|
|
|
|
process_group = ProcessModelService().get_process_group(group_id)
|
|
|
|
|
|
|
|
assert process_group.display_name == group_display_name
|
|
|
|
|
2022-06-10 12:51:38 -04:00
|
|
|
process_group.display_name = "Modified Display Name"
|
2022-06-10 12:18:37 -04:00
|
|
|
|
2022-06-10 12:51:38 -04:00
|
|
|
response = client.put(
|
|
|
|
f"/v1.0/process-groups/{group_id}",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
content_type="application/json",
|
|
|
|
data=json.dumps(ProcessGroupSchema().dump(process_group)),
|
|
|
|
)
|
2022-06-10 12:18:37 -04:00
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
process_group = ProcessModelService().get_process_group(group_id)
|
2022-06-10 12:51:38 -04:00
|
|
|
assert process_group.display_name == "Modified Display Name"
|
2022-06-10 12:18:37 -04:00
|
|
|
|
|
|
|
|
2022-06-10 17:48:36 -04:00
|
|
|
def test_process_model_file_update_fails_if_no_file_given(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-10 14:08:09 -04:00
|
|
|
"""Test_process_model_file_update."""
|
|
|
|
create_spec_file(app, client)
|
|
|
|
|
|
|
|
spec = load_test_spec(app, "random_fact")
|
|
|
|
data = {"key1": "THIS DATA"}
|
|
|
|
user = find_or_create_user()
|
|
|
|
response = client.put(
|
|
|
|
"/v1.0/process-models/%s/file/random_fact.svg" % spec.id,
|
|
|
|
data=data,
|
|
|
|
follow_redirects=True,
|
|
|
|
content_type="multipart/form-data",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
assert response.json["code"] == "no_file_given"
|
|
|
|
|
|
|
|
|
2022-06-10 17:48:36 -04:00
|
|
|
def test_process_model_file_update_fails_if_contents_is_empty(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-10 14:08:09 -04:00
|
|
|
"""Test_process_model_file_update."""
|
|
|
|
create_spec_file(app, client)
|
|
|
|
|
|
|
|
spec = load_test_spec(app, "random_fact")
|
|
|
|
data = {"file": (io.BytesIO(b""), "random_fact.svg")}
|
|
|
|
user = find_or_create_user()
|
|
|
|
response = client.put(
|
|
|
|
"/v1.0/process-models/%s/file/random_fact.svg" % spec.id,
|
|
|
|
data=data,
|
|
|
|
follow_redirects=True,
|
|
|
|
content_type="multipart/form-data",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
assert response.json["code"] == "file_contents_empty"
|
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_model_file_update(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-10 14:08:09 -04:00
|
|
|
"""Test_process_model_file_update."""
|
2022-06-08 11:08:12 -04:00
|
|
|
original_file = create_spec_file(app, client)
|
|
|
|
|
|
|
|
spec = load_test_spec(app, "random_fact")
|
2022-06-10 14:08:09 -04:00
|
|
|
new_file_contents = b"THIS_IS_NEW_DATA"
|
|
|
|
data = {"file": (io.BytesIO(new_file_contents), "random_fact.svg")}
|
2022-06-08 11:08:12 -04:00
|
|
|
user = find_or_create_user()
|
|
|
|
response = client.put(
|
|
|
|
"/v1.0/process-models/%s/file/random_fact.svg" % spec.id,
|
|
|
|
data=data,
|
|
|
|
follow_redirects=True,
|
|
|
|
content_type="multipart/form-data",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["ok"]
|
|
|
|
|
|
|
|
response = client.get(
|
|
|
|
f"/v1.0/process-models/{spec.id}/file/random_fact.svg",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
updated_file = json.loads(response.get_data(as_text=True))
|
|
|
|
assert original_file != updated_file
|
2022-06-10 14:08:09 -04:00
|
|
|
assert updated_file["file_contents"] == new_file_contents.decode()
|
2022-06-08 11:08:12 -04:00
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_get_file(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_get_file."""
|
2022-06-06 17:16:25 -04:00
|
|
|
user = find_or_create_user()
|
|
|
|
test_process_group_id = "group_id1"
|
|
|
|
process_model_dir_name = "hello_world"
|
|
|
|
load_test_spec(app, process_model_dir_name, process_group_id=test_process_group_id)
|
|
|
|
response = client.get(
|
2022-06-08 12:14:39 -04:00
|
|
|
f"/v1.0/process-models/{process_model_dir_name}/file/hello_world.bpmn",
|
|
|
|
headers=logged_in_headers(user),
|
2022-06-06 17:16:25 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["name"] == "hello_world.bpmn"
|
|
|
|
assert response.json["process_group_id"] == "group_id1"
|
|
|
|
assert response.json["process_model_id"] == "hello_world"
|
|
|
|
|
|
|
|
|
2022-06-08 18:47:38 -04:00
|
|
|
def test_get_workflow_from_workflow_spec(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-05-31 14:10:00 -04:00
|
|
|
"""Test_get_workflow_from_workflow_spec."""
|
2022-05-26 16:20:30 -04:00
|
|
|
user = find_or_create_user()
|
2022-05-31 14:10:00 -04:00
|
|
|
spec = load_test_spec(app, "hello_world")
|
2022-06-06 09:05:14 -04:00
|
|
|
response = client.post(
|
2022-06-10 08:15:06 -04:00
|
|
|
f"/v1.0/process-models/{spec.process_group_id}/{spec.id}",
|
|
|
|
headers=logged_in_headers(user),
|
2022-05-31 14:10:00 -04:00
|
|
|
)
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 201
|
|
|
|
assert "hello_world" == response.json["process_model_identifier"]
|
|
|
|
# assert('Task_GetName' == response.json['next_task']['name'])
|
2022-05-26 16:20:30 -04:00
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_get_process_groups_when_none(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_get_process_groups_when_none."""
|
2022-06-03 10:56:07 -04:00
|
|
|
user = find_or_create_user()
|
2022-06-08 12:14:39 -04:00
|
|
|
response = client.get("/v1.0/process-groups", headers=logged_in_headers(user))
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json == []
|
2022-06-03 10:56:07 -04:00
|
|
|
|
|
|
|
|
2022-06-08 18:47:38 -04:00
|
|
|
def test_get_process_groups_when_there_are_some(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_get_process_groups_when_there_are_some."""
|
2022-06-03 10:56:07 -04:00
|
|
|
user = find_or_create_user()
|
|
|
|
load_test_spec(app, "hello_world")
|
2022-06-08 12:14:39 -04:00
|
|
|
response = client.get("/v1.0/process-groups", headers=logged_in_headers(user))
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 200
|
|
|
|
assert len(response.json) == 1
|
2022-06-03 10:56:07 -04:00
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_get_process_group_when_found(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_get_process_group_when_found."""
|
2022-06-03 12:18:41 -04:00
|
|
|
user = find_or_create_user()
|
2022-06-03 13:40:11 -04:00
|
|
|
test_process_group_id = "group_id1"
|
|
|
|
process_model_dir_name = "hello_world"
|
|
|
|
load_test_spec(app, process_model_dir_name, process_group_id=test_process_group_id)
|
2022-06-06 09:05:14 -04:00
|
|
|
response = client.get(
|
|
|
|
f"/v1.0/process-groups/{test_process_group_id}", headers=logged_in_headers(user)
|
2022-06-03 12:18:41 -04:00
|
|
|
)
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["id"] == test_process_group_id
|
|
|
|
assert response.json["process_models"][0]["id"] == process_model_dir_name
|
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_get_process_model_when_found(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_get_process_model_when_found."""
|
2022-06-06 09:05:14 -04:00
|
|
|
user = find_or_create_user()
|
|
|
|
test_process_group_id = "group_id1"
|
|
|
|
process_model_dir_name = "hello_world"
|
|
|
|
load_test_spec(app, process_model_dir_name, process_group_id=test_process_group_id)
|
|
|
|
response = client.get(
|
2022-06-09 15:04:15 -04:00
|
|
|
f"/v1.0/process-models/{test_process_group_id}/{process_model_dir_name}",
|
2022-06-08 12:14:39 -04:00
|
|
|
headers=logged_in_headers(user),
|
2022-06-06 09:05:14 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["id"] == process_model_dir_name
|
|
|
|
assert len(response.json["files"]) == 1
|
|
|
|
assert response.json["files"][0]["name"] == "hello_world.bpmn"
|
|
|
|
|
|
|
|
|
2022-06-08 12:14:39 -04:00
|
|
|
def test_get_process_model_when_not_found(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_get_process_model_when_not_found."""
|
2022-06-06 09:05:14 -04:00
|
|
|
user = find_or_create_user()
|
|
|
|
process_model_dir_name = "THIS_NO_EXISTS"
|
2022-06-09 15:04:15 -04:00
|
|
|
group = create_process_group(client, user, "my_group")
|
2022-06-06 09:05:14 -04:00
|
|
|
response = client.get(
|
2022-06-09 15:04:15 -04:00
|
|
|
f"/v1.0/process-models/{group.json['id']}/{process_model_dir_name}",
|
2022-06-08 12:14:39 -04:00
|
|
|
headers=logged_in_headers(user),
|
2022-06-06 09:05:14 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 400
|
|
|
|
assert response.json["code"] == "process_mode_cannot_be_found"
|
2022-06-03 12:18:41 -04:00
|
|
|
|
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def test_process_instance_create(
|
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_process_instance_create."""
|
2022-06-13 15:42:29 -04:00
|
|
|
print('test_process_instance_create: ')
|
2022-06-07 17:28:48 -04:00
|
|
|
test_process_group_id = "runs_without_input"
|
2022-06-13 15:42:29 -04:00
|
|
|
test_process_model_id = "sample"
|
2022-06-07 11:07:38 -04:00
|
|
|
user = find_or_create_user()
|
2022-06-07 17:28:48 -04:00
|
|
|
headers = logged_in_headers(user)
|
2022-06-13 15:42:29 -04:00
|
|
|
response = create_process_instance(app, client, test_process_group_id, test_process_model_id, headers)
|
|
|
|
assert response.json["status"] == "complete"
|
|
|
|
assert response.json["process_model_identifier"] == test_process_model_id
|
|
|
|
assert response.json["data"]["current_user"]["username"] == "test_user1"
|
|
|
|
assert response.json["data"]["Mike"] == "Awesome"
|
|
|
|
assert response.json["data"]["person"] == "Kevin"
|
2022-06-07 17:28:48 -04:00
|
|
|
|
|
|
|
|
2022-06-08 12:14:39 -04:00
|
|
|
def test_process_instance_list_with_default_list(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_process_instance_list_with_default_list."""
|
2022-06-07 17:28:48 -04:00
|
|
|
db.session.query(ProcessInstanceModel).delete()
|
|
|
|
db.session.commit()
|
|
|
|
|
|
|
|
test_process_group_id = "runs_without_input"
|
|
|
|
process_model_dir_name = "sample"
|
|
|
|
user = find_or_create_user()
|
|
|
|
headers = logged_in_headers(user)
|
2022-06-08 12:14:39 -04:00
|
|
|
create_process_instance(
|
|
|
|
app, client, test_process_group_id, process_model_dir_name, headers
|
|
|
|
)
|
2022-06-07 17:28:48 -04:00
|
|
|
|
|
|
|
response = client.get(
|
2022-06-08 12:14:39 -04:00
|
|
|
f"/v1.0/process-models/{process_model_dir_name}/process-instances",
|
|
|
|
headers=logged_in_headers(user),
|
2022-06-07 17:28:48 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert len(response.json["results"]) == 1
|
|
|
|
assert response.json["pagination"]["count"] == 1
|
|
|
|
assert response.json["pagination"]["pages"] == 1
|
|
|
|
assert response.json["pagination"]["total"] == 1
|
|
|
|
|
|
|
|
process_instance_dict = response.json["results"][0]
|
|
|
|
assert type(process_instance_dict["id"]) is int
|
|
|
|
assert process_instance_dict["process_model_identifier"] == process_model_dir_name
|
|
|
|
assert process_instance_dict["process_group_id"] == test_process_group_id
|
|
|
|
assert type(process_instance_dict["start_in_seconds"]) is int
|
|
|
|
assert process_instance_dict["start_in_seconds"] > 0
|
|
|
|
assert type(process_instance_dict["end_in_seconds"]) is int
|
|
|
|
assert process_instance_dict["end_in_seconds"] > 0
|
2022-06-08 12:14:39 -04:00
|
|
|
assert (
|
|
|
|
process_instance_dict["start_in_seconds"]
|
|
|
|
<= process_instance_dict["end_in_seconds"]
|
|
|
|
)
|
2022-06-07 17:28:48 -04:00
|
|
|
assert process_instance_dict["status"] == "complete"
|
|
|
|
|
|
|
|
|
2022-06-08 12:14:39 -04:00
|
|
|
def test_process_instance_list_with_paginated_items(
|
2022-06-10 18:27:06 -04:00
|
|
|
app: Flask, client: FlaskClient, with_bpmn_file_cleanup: None
|
|
|
|
) -> None:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Test_process_instance_list_with_paginated_items."""
|
2022-06-07 17:28:48 -04:00
|
|
|
db.session.query(ProcessInstanceModel).delete()
|
|
|
|
db.session.commit()
|
|
|
|
|
2022-06-07 11:07:38 -04:00
|
|
|
test_process_group_id = "runs_without_input"
|
|
|
|
process_model_dir_name = "sample"
|
2022-06-07 17:28:48 -04:00
|
|
|
user = find_or_create_user()
|
|
|
|
headers = logged_in_headers(user)
|
2022-06-08 12:14:39 -04:00
|
|
|
create_process_instance(
|
|
|
|
app, client, test_process_group_id, process_model_dir_name, headers
|
|
|
|
)
|
|
|
|
create_process_instance(
|
|
|
|
app, client, test_process_group_id, process_model_dir_name, headers
|
|
|
|
)
|
|
|
|
create_process_instance(
|
|
|
|
app, client, test_process_group_id, process_model_dir_name, headers
|
|
|
|
)
|
|
|
|
create_process_instance(
|
|
|
|
app, client, test_process_group_id, process_model_dir_name, headers
|
|
|
|
)
|
|
|
|
create_process_instance(
|
|
|
|
app, client, test_process_group_id, process_model_dir_name, headers
|
|
|
|
)
|
2022-06-07 17:28:48 -04:00
|
|
|
|
|
|
|
response = client.get(
|
2022-06-08 12:14:39 -04:00
|
|
|
f"/v1.0/process-models/{process_model_dir_name}/process-instances?per_page=2&page=3",
|
|
|
|
headers=logged_in_headers(user),
|
2022-06-07 17:28:48 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert len(response.json["results"]) == 1
|
|
|
|
assert response.json["pagination"]["count"] == 1
|
|
|
|
assert response.json["pagination"]["pages"] == 3
|
|
|
|
assert response.json["pagination"]["total"] == 5
|
|
|
|
|
|
|
|
response = client.get(
|
2022-06-08 12:14:39 -04:00
|
|
|
f"/v1.0/process-models/{process_model_dir_name}/process-instances?per_page=2&page=1",
|
|
|
|
headers=logged_in_headers(user),
|
2022-06-07 17:28:48 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert len(response.json["results"]) == 2
|
|
|
|
assert response.json["pagination"]["count"] == 2
|
|
|
|
assert response.json["pagination"]["pages"] == 3
|
|
|
|
assert response.json["pagination"]["total"] == 5
|
|
|
|
|
|
|
|
|
2022-06-08 12:14:39 -04:00
|
|
|
def create_process_instance(
|
2022-06-12 07:39:30 -04:00
|
|
|
app: Flask,
|
|
|
|
client: FlaskClient,
|
|
|
|
test_process_group_id: str,
|
2022-06-13 15:42:29 -04:00
|
|
|
test_process_model_id: str,
|
2022-06-12 07:39:30 -04:00
|
|
|
headers: Dict[str, str],
|
2022-06-13 15:42:29 -04:00
|
|
|
) -> TestResponse:
|
2022-06-08 12:14:39 -04:00
|
|
|
"""Create_process_instance."""
|
2022-06-13 15:42:29 -04:00
|
|
|
load_test_spec(app, test_process_model_id, process_group_id=test_process_group_id)
|
2022-06-07 11:07:38 -04:00
|
|
|
response = client.post(
|
2022-06-13 15:42:29 -04:00
|
|
|
f"/v1.0/process-models/{test_process_group_id}/{test_process_model_id}",
|
2022-06-09 15:04:15 -04:00
|
|
|
headers=headers,
|
2022-06-07 11:07:38 -04:00
|
|
|
)
|
|
|
|
assert response.status_code == 201
|
2022-06-13 15:42:29 -04:00
|
|
|
return response
|
2022-06-07 11:07:38 -04:00
|
|
|
|
|
|
|
|
2022-06-10 18:27:06 -04:00
|
|
|
def create_process_model(app: Flask, client: FlaskClient) -> None:
|
2022-05-31 14:10:00 -04:00
|
|
|
"""Create_process_model."""
|
2022-05-25 15:17:30 -04:00
|
|
|
process_model_service = ProcessModelService()
|
2022-05-31 14:10:00 -04:00
|
|
|
assert 0 == len(process_model_service.get_specs())
|
|
|
|
assert 0 == len(process_model_service.get_process_groups())
|
2022-06-03 13:45:32 -04:00
|
|
|
process_group = ProcessGroup(
|
2022-05-31 14:10:00 -04:00
|
|
|
id="test_cat", display_name="Test Category", display_order=0, admin=False
|
|
|
|
)
|
2022-06-03 13:45:32 -04:00
|
|
|
process_model_service.add_process_group(process_group)
|
2022-05-31 14:10:00 -04:00
|
|
|
spec = ProcessModelInfo(
|
|
|
|
id="make_cookies",
|
|
|
|
display_name="Cooooookies",
|
|
|
|
description="Om nom nom delicious cookies",
|
2022-06-03 13:45:32 -04:00
|
|
|
process_group_id=process_group.id,
|
2022-05-31 14:10:00 -04:00
|
|
|
standalone=False,
|
|
|
|
is_review=False,
|
|
|
|
is_master_spec=False,
|
|
|
|
libraries=[],
|
|
|
|
library=False,
|
|
|
|
primary_process_id="",
|
|
|
|
primary_file_name="",
|
|
|
|
)
|
2022-05-27 10:58:37 -04:00
|
|
|
user = find_or_create_user()
|
2022-06-06 09:05:14 -04:00
|
|
|
response = client.post(
|
2022-06-08 18:17:46 -04:00
|
|
|
"/v1.0/process-models",
|
2022-05-31 14:10:00 -04:00
|
|
|
content_type="application/json",
|
|
|
|
data=json.dumps(ProcessModelInfoSchema().dump(spec)),
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 201
|
2022-05-25 15:17:30 -04:00
|
|
|
|
2022-05-31 14:10:00 -04:00
|
|
|
fs_spec = process_model_service.get_spec("make_cookies")
|
|
|
|
assert spec.display_name == fs_spec.display_name
|
|
|
|
assert 0 == fs_spec.display_order
|
|
|
|
assert 1 == len(process_model_service.get_process_groups())
|
|
|
|
|
2022-05-25 15:17:30 -04:00
|
|
|
|
2022-06-12 07:39:30 -04:00
|
|
|
def create_spec_file(
|
|
|
|
app: Flask, client: FlaskClient
|
|
|
|
) -> Dict[str, Optional[Union[str, bool, int]]]:
|
2022-05-25 16:38:03 -04:00
|
|
|
"""Test_create_spec_file."""
|
2022-05-31 14:10:00 -04:00
|
|
|
spec = load_test_spec(app, "random_fact")
|
|
|
|
data = {"file": (io.BytesIO(b"abcdef"), "random_fact.svg")}
|
2022-05-27 10:58:37 -04:00
|
|
|
user = find_or_create_user()
|
2022-06-06 09:05:14 -04:00
|
|
|
response = client.post(
|
2022-06-08 11:08:12 -04:00
|
|
|
"/v1.0/process-models/%s/file" % spec.id,
|
2022-05-31 14:10:00 -04:00
|
|
|
data=data,
|
|
|
|
follow_redirects=True,
|
|
|
|
content_type="multipart/form-data",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
2022-05-25 16:38:03 -04:00
|
|
|
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 201
|
|
|
|
assert response.get_data() is not None
|
|
|
|
file = json.loads(response.get_data(as_text=True))
|
2022-05-31 14:10:00 -04:00
|
|
|
assert FileType.svg.value == file["type"]
|
|
|
|
assert "image/svg+xml" == file["content_type"]
|
2022-05-25 16:38:03 -04:00
|
|
|
|
2022-06-06 09:05:14 -04:00
|
|
|
response = client.get(
|
2022-06-08 11:08:12 -04:00
|
|
|
f"/v1.0/process-models/{spec.id}/file/random_fact.svg",
|
2022-05-31 14:10:00 -04:00
|
|
|
headers=logged_in_headers(user),
|
|
|
|
)
|
2022-06-06 09:05:14 -04:00
|
|
|
assert response.status_code == 200
|
|
|
|
file2 = json.loads(response.get_data(as_text=True))
|
2022-06-08 11:08:12 -04:00
|
|
|
assert file["file_contents"] == file2["file_contents"]
|
|
|
|
return file
|
2022-06-08 18:17:46 -04:00
|
|
|
|
|
|
|
|
2022-06-08 18:47:38 -04:00
|
|
|
def create_process_group(client, user, process_group_id, display_name=""):
|
|
|
|
"""Create_process_group."""
|
2022-06-08 18:17:46 -04:00
|
|
|
process_group = ProcessGroup(
|
2022-06-08 18:47:38 -04:00
|
|
|
id=process_group_id, display_name=display_name, display_order=0, admin=False
|
2022-06-08 18:17:46 -04:00
|
|
|
)
|
|
|
|
response = client.post(
|
|
|
|
"/v1.0/process-groups",
|
|
|
|
headers=logged_in_headers(user),
|
|
|
|
content_type="application/json",
|
|
|
|
data=json.dumps(ProcessGroupSchema().dump(process_group)),
|
|
|
|
)
|
|
|
|
assert response.status_code == 201
|
2022-06-08 18:47:38 -04:00
|
|
|
assert response.json["id"] == process_group_id
|
2022-06-08 18:17:46 -04:00
|
|
|
return response
|
2022-06-10 10:31:27 -04:00
|
|
|
|
2022-06-10 10:34:09 -04:00
|
|
|
|
2022-06-10 10:31:27 -04:00
|
|
|
# def test_get_process_model(self):
|
|
|
|
#
|
|
|
|
# load_test_spec('random_fact')
|
|
|
|
# response = client.get('/v1.0/workflow-specification/random_fact', headers=logged_in_headers())
|
|
|
|
# assert_success(response)
|
|
|
|
# json_data = json.loads(response.get_data(as_text=True))
|
|
|
|
# api_spec = WorkflowSpecInfoSchema().load(json_data)
|
|
|
|
#
|
|
|
|
# fs_spec = process_model_service.get_spec('random_fact')
|
|
|
|
# assert(WorkflowSpecInfoSchema().dump(fs_spec) == json_data)
|
|
|
|
#
|