aboutsummaryrefslogtreecommitdiff
path: root/tests/uploader/test_parse.py
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-10-17 10:26:15 -0500
committerFrederick Muriuki Muriithi2024-10-17 11:32:28 -0500
commit85215361b561d332cab954ea68438a2d442c96d8 (patch)
tree90a3115843770f5e3806762695223a7115a71d99 /tests/uploader/test_parse.py
parent9db2d0986619bf801e2308ee55e4340d9f050376 (diff)
downloadgn-uploader-85215361b561d332cab954ea68438a2d442c96d8.tar.gz
Rename test module.
Diffstat (limited to 'tests/uploader/test_parse.py')
-rw-r--r--tests/uploader/test_parse.py96
1 files changed, 96 insertions, 0 deletions
diff --git a/tests/uploader/test_parse.py b/tests/uploader/test_parse.py
new file mode 100644
index 0000000..076c47c
--- /dev/null
+++ b/tests/uploader/test_parse.py
@@ -0,0 +1,96 @@
+"""Test the 'parse' module in the web-ui"""
+import sys
+
+import redis
+import pytest
+
+from uploader.jobs import job, jobsnamespace
+
+from tests.conftest import uploadable_file_object
+
+def test_parse_with_existing_uploaded_file(#pylint: disable=[too-many-arguments]
+ client,
+ db_url,
+ redis_url,
+ redis_ttl,
+ jobs_prefix,
+ job_id,
+ monkeypatch):
+ """
+ GIVEN: 1. A flask application testing client
+ 2. A valid file, and filetype
+ WHEN: The file is uploaded, and the parsing triggered
+ THEN: Ensure that:
+ 1. the system redirects to the job/parse status page
+ 2. the job is placed on redis for processing
+ """
+ monkeypatch.setattr("uploader.jobs.uuid4", lambda : job_id)
+ # Upload a file
+ speciesid = 1
+ filename = "no_data_errors.tsv"
+ filetype = "average"
+ client.post(
+ "/upload", data={
+ "speciesid": speciesid,
+ "filetype": filetype,
+ "qc_text_file": uploadable_file_object(filename)})
+ # Checks
+ resp = client.get(f"/parse/parse?speciesid={speciesid}&filename={filename}"
+ f"&filetype={filetype}")
+ assert resp.status_code == 302
+ assert b'Redirecting...' in resp.data
+ assert b'/parse/status/934c55d8-396e-4959-90e1-2698e9205758' in resp.data
+
+ with redis.Redis.from_url(redis_url, decode_responses=True) as rconn:
+ the_job = job(rconn, jobsnamespace(), job_id)
+
+ assert the_job["jobid"] == job_id
+ assert the_job["filename"] == filename
+ assert the_job["command"] == " ".join([
+ sys.executable, "-m", "scripts.validate_file", db_url, redis_url,
+ jobs_prefix, job_id, "--redisexpiry", str(redis_ttl), str(speciesid),
+ filetype, f"{client.application.config['UPLOAD_FOLDER']}/{filename}"])
+
+@pytest.mark.parametrize(
+ "filename,uri,error_msgs",
+ (("non_existent.file",
+ "/parse/parse?filename=non_existent.file&filename=average",
+ [b'Selected file does not exist (any longer)']),
+ ("non_existent.file",
+ "/parse/parse?filename=non_existent.file&filename=standard-error",
+ [b'Selected file does not exist (any longer)']),
+ ("non_existent.file",
+ "/parse/parse?filename=non_existent.file&filename=percival",
+ [b'Selected file does not exist (any longer)',
+ b'Invalid filetype provided']),
+ ("no_data_errors.tsv",
+ "/parse/parse?filename=no_data_errors.tsv&filename=percival",
+ [b'Invalid filetype provided']),
+ ("no_data_errors.tsv",
+ "/parse/parse?filename=no_data_errors.tsv",
+ [b'No filetype provided']),
+ (None, "/parse/parse", [b'No file provided', b'No filetype provided'])))
+def test_parse_with_non_uploaded_file(client, filename, uri, error_msgs):
+ """
+ GIVEN: 1. A flask application testing client
+ 2. A valid filetype
+ 3. A filename to a file that has not been uploaded yet
+ WHEN: The parsing triggered
+ THEN: Ensure that the appropriate errors are displayed
+ """
+ ## Conditionally upload files
+ if filename and filename != "non_existent.file":
+ client.post(
+ "/upload", data={
+ "filetype": "average",
+ "qc_text_file": uploadable_file_object(filename)})
+ # Trigger
+ resp = client.get(uri,follow_redirects=True)
+ ## Check that there was exactly one redirect
+ assert len(resp.history) == 1 and resp.history[0].status_code == 302
+ ## Check that redirect is to home page and is successful
+ assert resp.request.path == "/upload"
+ assert resp.status_code == 200
+ ## Check that error(s) are displayed
+ for error_msg in error_msgs:
+ assert error_msg in resp.data