Skip to content

Commit

Permalink
Update models and test files
Browse files Browse the repository at this point in the history
  • Loading branch information
lbeckman314 committed Nov 5, 2024
1 parent 291ea90 commit b728ba2
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 248 deletions.
4 changes: 3 additions & 1 deletion tes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def strconv(value: Any) -> Any:
"""
if isinstance(value, (tuple, list)):
if all([isinstance(n, str) for n in value]):
return [str(n) for n in value]
return type(value)(str(n) for n in value)
else:
return value
elif isinstance(value, str):
Expand Down Expand Up @@ -110,6 +110,8 @@ def timestampconv(value: Optional[str]) -> Optional[datetime]:
"""
if value is None:
return value
if isinstance(value, datetime):
return value
return dateutil.parser.parse(value)


Expand Down
2 changes: 1 addition & 1 deletion tes/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def unmarshal(j: Any, o: Type, convert_camel_case=True) -> Any:
try:
m = json.loads(j)
except json.decoder.JSONDecodeError:
pass
raise UnmarshalError("Unable to decode JSON string: %s" % j)
elif j is None:
return None
else:
Expand Down
20 changes: 11 additions & 9 deletions tests/integration/test_funnel.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,7 @@ def tes_client():

@pytest.fixture
def task():
return tes.Task(
executors=[
tes.Executor(
image="alpine",
command=["echo", "hello"]
)
]
)
return tes.Task(executors=[tes.Executor(image="alpine", command=["echo", "hello"])])


def test_service_info(tes_client):
Expand All @@ -39,7 +32,16 @@ def test_task_status(tes_client, task):
assert task_id is not None

status = tes_client.get_task(task_id, view="MINIMAL").state
assert status in ["QUEUED", "INITIALIZING", "RUNNING", "COMPLETE", "CANCELED", "EXECUTOR_ERROR", "SYSTEM_ERROR", "UNKNOWN"]
assert status in [
"QUEUED",
"INITIALIZING",
"RUNNING",
"COMPLETE",
"CANCELED",
"EXECUTOR_ERROR",
"SYSTEM_ERROR",
"UNKNOWN",
]


def test_task_logs(tes_client, task):
Expand Down
129 changes: 42 additions & 87 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,14 @@

import pytest

from tes.client import HTTPClient
from tes.client import append_suffixes_to_url, HTTPClient, send_request
from tes.models import Task, Executor
from tes.utils import TimeoutError


@pytest.fixture
def task():
return Task(
executors=[
Executor(
image="alpine",
command=["echo", "hello"]
)
]
)
return Task(executors=[Executor(image="alpine", command=["echo", "hello"])])


@pytest.fixture
Expand All @@ -43,7 +36,7 @@ def test_cli():
assert cli.urls == [
"http://fakehost:8000/ga4gh/tes/v1",
"http://fakehost:8000/v1",
"http://fakehost:8000"
"http://fakehost:8000",
]
assert cli.timeout == 5

Expand All @@ -62,24 +55,17 @@ def test_cli():

def test_create_task(cli, task, mock_id, mock_url):
with requests_mock.Mocker() as m:
m.post(
f"{mock_url}/ga4gh/tes/v1/tasks",
status_code=200,
json={"id": mock_id}
)
m.post(f"{mock_url}/ga4gh/tes/v1/tasks", status_code=200, json={"id": mock_id})
cli.create_task(task)
assert m.last_request.text == task.as_json()
assert m.last_request.timeout == cli.timeout

m.post(
f"{mock_url}/ga4gh/tes/v1/tasks",
status_code=500
)
m.post(f"{mock_url}/ga4gh/tes/v1/tasks", status_code=500)
with pytest.raises(requests.HTTPError):
cli.create_task(task)

with pytest.raises(TypeError):
cli.create_task('not_a_task_object') # type: ignore
cli.create_task("not_a_task_object") # type: ignore


def test_get_task(cli, mock_id, mock_url):
Expand All @@ -90,92 +76,63 @@ def test_get_task(cli, mock_id, mock_url):
json={
"id": mock_id,
"state": "RUNNING",
}
},
)
cli.get_task(mock_id, "MINIMAL")
assert m.last_request.url == f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}?view=MINIMAL"
assert (
m.last_request.url
== f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}?view=MINIMAL"
)
assert m.last_request.timeout == cli.timeout

m.get(
requests_mock.ANY,
status_code=404
)
m.get(requests_mock.ANY, status_code=404)
with pytest.raises(requests.HTTPError):
cli.get_task(mock_id)


def test_list_tasks(cli, mock_url):
with requests_mock.Mocker() as m:
m.get(
f"{mock_url}/ga4gh/tes/v1/tasks",
status_code=200,
json={
"tasks": []
}
)
m.get(f"{mock_url}/ga4gh/tes/v1/tasks", status_code=200, json={"tasks": []})
cli.list_tasks()
assert m.last_request.url == f"{mock_url}/ga4gh/tes/v1/tasks?view=MINIMAL"
assert m.last_request.timeout == cli.timeout

# empty response
m.get(
f"{mock_url}/ga4gh/tes/v1/tasks",
status_code=200,
json={}
)
m.get(f"{mock_url}/ga4gh/tes/v1/tasks", status_code=200, json={})
cli.list_tasks()
assert m.last_request.url == f"{mock_url}/ga4gh/tes/v1/tasks?view=MINIMAL"

m.get(
f"{mock_url}/ga4gh/tes/v1/tasks",
status_code=500
)
m.get(f"{mock_url}/ga4gh/tes/v1/tasks", status_code=500)
with pytest.raises(requests.HTTPError):
cli.list_tasks()


def test_cancel_task(cli, mock_id, mock_url):
with requests_mock.Mocker() as m:
m.post(
f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}:cancel",
status_code=200,
json={}
f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}:cancel", status_code=200, json={}
)
cli.cancel_task(mock_id)
assert m.last_request.url == f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}:cancel"
assert m.last_request.timeout == cli.timeout

m.post(
f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}:cancel",
status_code=500
)
m.post(f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}:cancel", status_code=500)
with pytest.raises(requests.HTTPError):
cli.cancel_task(mock_id)

m.post(
requests_mock.ANY,
status_code=404,
json={}
)
m.post(requests_mock.ANY, status_code=404, json={})
with pytest.raises(requests.HTTPError):
cli.cancel_task(mock_id)


def test_get_service_info(cli, mock_url):
with requests_mock.Mocker() as m:
m.get(
f"{mock_url}/ga4gh/tes/v1/service-info",
status_code=200,
json={}
)
m.get(f"{mock_url}/ga4gh/tes/v1/service-info", status_code=200, json={})
cli.get_service_info()
assert m.last_request.url == f"{mock_url}/ga4gh/tes/v1/service-info"
assert m.last_request.timeout == cli.timeout

m.get(
f"{mock_url}/ga4gh/tes/v1/service-info",
status_code=500
)
m.get(f"{mock_url}/ga4gh/tes/v1/service-info", status_code=500)
with pytest.raises(requests.HTTPError):
cli.get_service_info()

Expand All @@ -189,21 +146,18 @@ def test_wait(cli, mock_id, mock_url):
json={
"id": mock_id,
"state": "RUNNING",
}
},
)
cli.wait(mock_id, timeout=1)

with requests_mock.Mocker() as m:
m.get(
f"{mock_url}/ga4gh/tes/v1/tasks/{mock_id}",
[
{"status_code": 200,
"json": {"id": mock_id, "state": "INITIALIZING"}},
{"status_code": 200,
"json": {"id": mock_id, "state": "RUNNING"}},
{"status_code": 200,
"json": {"id": mock_id, "state": "COMPLETE"}}
]
{"status_code": 200, "json": {"id": mock_id, "state": "INITIALIZING"}},
{"status_code": 200, "json": {"id": mock_id, "state": "RUNNING"}},
{"status_code": 200, "json": {"id": mock_id, "state": "COMPLETE"}},
],
)
cli.wait(mock_id, timeout=2)

Expand All @@ -215,7 +169,7 @@ def test_wait_exception(cli, mock_id, mock_url):
status_code=200,
json={
"Error": "Error",
}
},
)
with pytest.raises(Exception):
cli.wait(mock_id, timeout=2)
Expand All @@ -229,7 +183,7 @@ def test_wait_no_state_change(cli, mock_id, mock_url):
{"status_code": 200, "json": {"id": mock_id, "state": "RUNNING"}},
{"status_code": 200, "json": {"id": mock_id, "state": "RUNNING"}},
# Continues to return RUNNING state
]
],
)
with pytest.raises(TimeoutError):
cli.wait(mock_id, timeout=2)
Expand All @@ -249,10 +203,12 @@ def test_request_params():
with pytest.raises(KeyError):
_ = vals["params"]

cli = HTTPClient(url="http://fakehost:8000", user="user",
password="password", token="token")
vals = cli._request_params(data='{"json": "string"}',
params={"query_param": "value"})
cli = HTTPClient(
url="http://fakehost:8000", user="user", password="password", token="token"
)
vals = cli._request_params(
data='{"json": "string"}', params={"query_param": "value"}
)
assert vals["timeout"] == 10
assert vals["headers"]["Content-type"] == "application/json"
assert vals["headers"]["Authorization"] == "Bearer token"
Expand All @@ -270,18 +226,18 @@ def test_append_suffixes_to_url():

results = append_suffixes_to_url(urls=urls, suffixes=suffixes)
assert len(results) == len(urls) * len(suffixes)
assert all(url == 'http://example.com/foo' for url in results)
assert all(url == "http://example.com/foo" for url in results)

results = append_suffixes_to_url(urls=urls, suffixes=no_suffixes)
assert len(results) == len(urls) * len(no_suffixes)
assert all(url == 'http://example.com' for url in results)
assert all(url == "http://example.com" for url in results)

results = append_suffixes_to_url(urls=urls_order, suffixes=suffixes_order)
assert len(results) == len(urls_order) * len(suffixes_order)
assert results[0] == 'http://example1.com/1'
assert results[1] == 'http://example1.com/2'
assert results[2] == 'http://example2.com/1'
assert results[3] == 'http://example2.com/2'
assert results[0] == "http://example1.com/1"
assert results[1] == "http://example1.com/2"
assert results[2] == "http://example2.com/1"
assert results[3] == "http://example2.com/2"


def test_send_request():
Expand All @@ -305,7 +261,7 @@ def test_send_request():
m.get(mock_urls[1], status_code=200)
response = send_request(paths=mock_urls)
assert response.status_code == 200
assert m.last_request.url.rstrip('/') == f"{mock_url}"
assert m.last_request.url.rstrip("/") == f"{mock_url}"

# error on first path, 404 on second
with requests_mock.Mocker() as m:
Expand All @@ -327,14 +283,13 @@ def test_send_request():
m.get(mock_urls[1], status_code=200)
response = send_request(paths=mock_urls)
assert response.status_code == 200
assert m.last_request.url.rstrip('/') == f"{mock_url}"
assert m.last_request.url.rstrip("/") == f"{mock_url}"

# POST 200
with requests_mock.Mocker() as m:
m.post(f"{mock_url}/suffix/foo/{mock_id}:bar", status_code=200)
paths = append_suffixes_to_url(mock_urls, ["/foo/{id}:bar"])
response = send_request(paths=paths, method="post", json={},
id=mock_id)
response = send_request(paths=paths, method="post", json={}, id=mock_id)
assert response.status_code == 200
assert m.last_request.url == f"{mock_url}/suffix/foo/{mock_id}:bar"

Expand Down
Loading

0 comments on commit b728ba2

Please sign in to comment.