diff --git a/fia_api/router.py b/fia_api/router.py index 9698d024..411cdfab 100644 --- a/fia_api/router.py +++ b/fia_api/router.py @@ -124,6 +124,7 @@ async def get_jobs( order_by: OrderField = "start", order_direction: Literal["asc", "desc"] = "desc", include_run: bool = False, + as_user: bool = False, ) -> list[JobResponse] | list[JobWithRunResponse]: """ Retrieve all jobs. @@ -136,10 +137,18 @@ async def get_jobs( "experiment_title", "filename",] :param order_direction: Literal["asc", "desc"] :param include_run: bool + :param as_user: bool :return: List of JobResponse objects """ user = get_user_from_token(credentials.credentials) - user_number = None if user.role == "staff" else user.user_number + + if as_user: + user_number = user.user_number + elif user.role == "staff": + user_number = None + else: + user_number = user.user_number + jobs = get_all_jobs( limit=limit, offset=offset, order_by=order_by, order_direction=order_direction, user_number=user_number ) @@ -158,6 +167,7 @@ async def get_jobs_by_instrument( order_by: OrderField = "start", order_direction: Literal["asc", "desc"] = "desc", include_run: bool = False, + as_user: bool = False, ) -> list[JobResponse] | list[JobWithRunResponse]: """ Retrieve a list of jobs for a given instrument. @@ -174,8 +184,16 @@ async def get_jobs_by_instrument( :return: List of JobResponse objects """ user = get_user_from_token(credentials.credentials) + + if as_user: + user_number = user.user_number + elif user.role == "staff": + user_number = None + else: + user_number = user.user_number + instrument = instrument.upper() - user_number = None if user.role == "staff" else user.user_number + jobs = get_job_by_instrument( instrument, limit=limit, diff --git a/test/e2e/test_core.py b/test/e2e/test_core.py index 9db5ccf9..15dfc61a 100644 --- a/test/e2e/test_core.py +++ b/test/e2e/test_core.py @@ -57,6 +57,87 @@ def test_get_all_jobs_for_dev_mode(): assert len(response.json()) == expected_number_of_jobs +@patch("fia_api.core.services.job.get_experiments_for_user_number") +@patch("fia_api.core.auth.tokens.requests.post") +def test_get_jobs_as_user(mock_post, mock_get_experiment_numbers_for_user_number): + """Test get all jobs with as_user flag for staff""" + mock_post.return_value.status_code = HTTPStatus.OK + mock_get_experiment_numbers_for_user_number.return_value = [1820497] + response = client.get("/jobs?as_user=true", headers={"Authorization": f"Bearer {STAFF_TOKEN}"}) + assert response.status_code == HTTPStatus.OK + assert response.json() == [ + { + "id": 5001, + "end": None, + "inputs": { + "ei": "'auto'", + "sam_mass": 0.0, + "sam_rmm": 0.0, + "monovan": 0, + "remove_bkg": True, + "sum_runs": False, + "runno": 25581, + "mask_file_link": "https://raw.githubusercontent.com/pace-neutrons/InstrumentFiles/" + "964733aec28b00b13f32fb61afa363a74dd62130/mari/mari_mask2023_1.xml", + "wbvan": 12345, + }, + "outputs": None, + "start": None, + "state": "NOT_STARTED", + "status_message": None, + "script": None, + "stacktrace": None, + "runner_image": None, + "type": "JobType.AUTOREDUCTION", + } + ] + + +@patch("fia_api.core.services.job.get_experiments_for_user_number") +def test_get_jobs_as_user_dev_mode(mock_get_experiment_numbers_for_user_number): + """Test get all jobs with as_user flag in dev mode""" + mock_get_experiment_numbers_for_user_number.return_value = [1820497] + with patch("fia_api.core.auth.tokens.DEV_MODE", True): + response = client.get("/jobs?as_user=true") + assert response.status_code == HTTPStatus.OK + assert response.json() == [ + { + "id": 5001, + "end": None, + "inputs": { + "ei": "'auto'", + "sam_mass": 0.0, + "sam_rmm": 0.0, + "monovan": 0, + "remove_bkg": True, + "sum_runs": False, + "runno": 25581, + "mask_file_link": "https://raw.githubusercontent.com/pace-neutrons/InstrumentFiles/" + "964733aec28b00b13f32fb61afa363a74dd62130/mari/mari_mask2023_1.xml", + "wbvan": 12345, + }, + "outputs": None, + "start": None, + "state": "NOT_STARTED", + "status_message": None, + "script": None, + "stacktrace": None, + "runner_image": None, + "type": "JobType.AUTOREDUCTION", + } + ] + + +@patch("fia_api.core.auth.tokens.requests.post") +def test_get_jobs_as_user_false_for_staff(mock_post): + """Test get all jobs with as_user flag set to false""" + mock_post.return_value.status_code = HTTPStatus.OK + response = client.get("/jobs?as_user=false&limit=10", headers={"Authorization": f"Bearer {STAFF_TOKEN}"}) + assert response.status_code == HTTPStatus.OK + expected_number_of_jobs = 10 + assert len(response.json()) == expected_number_of_jobs + + @patch("fia_api.core.services.job.get_experiments_for_user_number") @patch("fia_api.core.auth.tokens.requests.post") def test_get_all_job_for_user(mock_post, mock_get_experiment_numbers_for_user_number): @@ -116,7 +197,7 @@ def test_get_all_job_for_user_include_run(mock_post, mock_get_experiment_numbers "raw_frames": 8067, "run_end": "2019-03-22T10:18:26", "run_start": "2019-03-22T10:15:44", - "title": "Whitebeam - vanadium - detector tests - vacuum bad - HT " "on not on all LAB", + "title": "Whitebeam - vanadium - detector tests - vacuum bad - HT on not on all LAB", "users": "Wood,Guidi,Benedek,Mansson,Juranyi,Nocerino,Forslund,Matsubara", }, "inputs": { @@ -337,7 +418,7 @@ def test_get_jobs_for_instrument_jobs_exist_for_staff(mock_post): @patch("fia_api.core.auth.tokens.requests.post") -@patch("fia_api.core.auth.experiments.requests.get") +@patch("fia_api.core.auth.experiments.requests.get") # HERE def test_get_jobs_for_instrument_jobs_dont_exist_for_user(mock_get, mock_post): """ Test empty array of jobs returned for given instrument when the instrument and jobs exist @@ -384,7 +465,7 @@ def test_get_jobs_for_instrument_runs_included_for_staff(mock_post): "raw_frames": 8067, "run_end": "2019-03-22T10:18:26", "run_start": "2019-03-22T10:15:44", - "title": "Whitebeam - vanadium - detector tests - vacuum bad - HT " "on not on all LAB", + "title": "Whitebeam - vanadium - detector tests - vacuum bad - HT on not on all LAB", "users": "Wood,Guidi,Benedek,Mansson,Juranyi,Nocerino,Forslund,Matsubara", }, "script": None, @@ -451,6 +532,29 @@ def test_limit_offset_jobs(mock_post): assert response_one.json() != response_two.json() +@patch("fia_api.core.auth.tokens.requests.post") +def test_get_instrument_jobs_as_user_false_for_staff(mock_post): + """Test get MARI jobs with as_user flag set to false""" + mock_post.return_value.status_code = HTTPStatus.OK + response = client.get( + "/instrument/mari/jobs?limit=10&as_user=false", headers={"Authorization": f"Bearer {STAFF_TOKEN}"} + ) + assert response.status_code == HTTPStatus.OK + expected_number_of_jobs = 10 + assert len(response.json()) == expected_number_of_jobs + + +@patch("fia_api.core.services.job.get_experiments_for_user_number") +def test_get_instrument_jobs_as_user_dev_mode(mock_get_experiment_numbers_for_user_number): + """Test get MARI jobs with as_user flag in dev mode""" + mock_get_experiment_numbers_for_user_number.return_value = [1820497] + with patch("fia_api.core.auth.tokens.DEV_MODE", True): + response = client.get("/instrument/mari/jobs?as_user=true&limit=1") + assert response.status_code == HTTPStatus.OK + expected_number_of_jobs = 1 + assert len(response.json()) == expected_number_of_jobs + + def test_instrument_jobs_count(): """ Test instrument jobs count @@ -554,3 +658,48 @@ def test_get_mantid_runners_bad_jwt(mock_post): mock_post.return_value.status_code = HTTPStatus.FORBIDDEN response = client.get("/jobs/runners", headers={"Authorization": "foo"}) assert response.status_code == HTTPStatus.FORBIDDEN + + +@patch("fia_api.core.services.job.get_experiments_for_user_number") +@patch("fia_api.core.auth.tokens.requests.post") +def test_get_jobs_as_user_flag_for_staff(mock_post, mock_get_experiment_numbers_for_user_number): + """Test get all jobs with as_user flag set to true and false for a staff user""" + mock_post.return_value.status_code = HTTPStatus.OK + mock_get_experiment_numbers_for_user_number.return_value = [1820497] + + response_as_user_true = client.get("/jobs?as_user=true", headers={"Authorization": f"Bearer {STAFF_TOKEN}"}) + + response_as_user_false = client.get("/jobs?as_user=false", headers={"Authorization": f"Bearer {STAFF_TOKEN}"}) + + assert len(response_as_user_true.json()) != len(response_as_user_false.json()) + + +@patch("fia_api.core.auth.tokens.requests.post") +def test_get_jobs_as_user_flag_for_staff_2(mock_post): + """Test get all jobs with as_user flag set to true and false for a staff user""" + mock_post.return_value.status_code = HTTPStatus.FORBIDDEN + + response = client.get("/jobs?as_user=true", headers={"Authorization": f"Bearer {STAFF_TOKEN}"}) + + assert response.status_code == HTTPStatus.FORBIDDEN + + +@patch("fia_api.core.services.job.get_experiments_for_user_number") +@patch("fia_api.core.auth.tokens.requests.post") +def test_3(mock_post, mock_get_experiment_numbers_for_user_number): + """Test get all jobs with as_user flag set to true and false for a staff user""" + mock_post.return_value.status_code = HTTPStatus.OK + mock_get_experiment_numbers_for_user_number.return_value = [1820497] + + response_as_user_true = client.get( + "/instrument/mari/jobs?&as_user=true", headers={"Authorization": f"Bearer {USER_TOKEN}"} + ) + assert response_as_user_true.status_code == HTTPStatus.OK + + response_as_user_false = client.get( + "/instrument/mari/jobs?&as_user=false", headers={"Authorization": f"Bearer {USER_TOKEN}"} + ) + assert response_as_user_false.status_code == HTTPStatus.OK + + assert + assert len(response_as_user_true.json()) == len(response_as_user_false.json())