Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
256 changes: 249 additions & 7 deletions graph-proxy/src/graphql/workflows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ mod tests {

let mut server = mockito::Server::new_async().await;
let mut response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
response_file_path.push("test-resources");
response_file_path.push("test-assets");
response_file_path.push("get-workflow-wdkwj.json");
let workflow_endpoint = server
.mock(
Expand Down Expand Up @@ -515,7 +515,7 @@ mod tests {

let mut server = mockito::Server::new_async().await;
let mut response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
response_file_path.push("test-resources");
response_file_path.push("test-assets");
response_file_path.push("get-workflow-wdkwj.json");
let workflow_endpoint = server
.mock(
Expand Down Expand Up @@ -568,6 +568,248 @@ mod tests {
assert_eq!(resp.data.into_json().unwrap(), expected_data);
}

#[tokio::test]
async fn single_failed_workflow_query() {
let workflow_name = "numpy-benchmark-qhb59";
let visit = Visit {
proposal_code: "mg".to_string(),
proposal_number: 36964,
number: 1,
};

let mut server = mockito::Server::new_async().await;
let mut response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
response_file_path.push("test-assets");
response_file_path.push("get-workflow-qhb59-failed.json");
let workflow_endpoint = server
.mock(
"GET",
&format!("/api/v1/workflows/{}/{}", visit, workflow_name)[..],
)
.with_status(200)
.with_header("content-type", "application/json")
.with_body_from_file(response_file_path)
.create_async()
.await;

let argo_server_url = Url::parse(&server.url()).unwrap();
let schema = root_schema_builder()
.data(ArgoServerUrl(argo_server_url))
.data(None::<Authorization<Bearer>>)
.finish();
let query = format!(
r#"
query {{
workflow(name: "{}", visit: {{proposalCode: "{}", proposalNumber: {}, number: {}}}) {{
status {{
...on WorkflowFailedStatus {{
startTime
endTime
message
tasks {{
id
}}
}}
}}
}}
}}
"#,
workflow_name, visit.proposal_code, visit.proposal_number, visit.number
);
let resp = schema.execute(query).await.into_result().unwrap();

workflow_endpoint.assert_async().await;
let expected_data = json!({
"workflow": {
"status": {
"startTime": "2024-10-02T11:11:17+00:00",
"endTime": "2024-10-02T11:12:32+00:00",
"message": "OOMKilled (exit code 137)",
"tasks": [{"id": workflow_name}]
}
}
});
assert_eq!(resp.data.into_json().unwrap(), expected_data);
}

#[tokio::test]
async fn single_errored_workflow_query() {
let workflow_name = "numpy-benchmark-jwcfp";
let visit = Visit {
proposal_code: "mg".to_string(),
proposal_number: 36964,
number: 1,
};

let mut server = mockito::Server::new_async().await;
let mut response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
response_file_path.push("test-assets");
response_file_path.push("get-workflow-jwcfp-errored.json");
let workflow_endpoint = server
.mock(
"GET",
&format!("/api/v1/workflows/{}/{}", visit, workflow_name)[..],
)
.with_status(200)
.with_header("content-type", "application/json")
.with_body_from_file(response_file_path)
.create_async()
.await;

let argo_server_url = Url::parse(&server.url()).unwrap();
let schema = root_schema_builder()
.data(ArgoServerUrl(argo_server_url))
.data(None::<Authorization<Bearer>>)
.finish();
let query = format!(
r#"
query {{
workflow(name: "{}", visit: {{proposalCode: "{}", proposalNumber: {}, number: {}}}) {{
status {{
...on WorkflowErroredStatus {{
startTime
endTime
message
tasks {{
id
}}
}}
}}
}}
}}
"#,
workflow_name, visit.proposal_code, visit.proposal_number, visit.number
);
let resp = schema.execute(query).await.into_result().unwrap();

workflow_endpoint.assert_async().await;
let expected_data = json!({
"workflow": {
"status": {
"startTime": "2024-10-11T14:35:37+00:00",
"endTime": "2024-10-11T14:35:37+00:00",
"message": "error in entry template execution: Error applying PodSpecPatch",
"tasks": [{"id": workflow_name}]
}
}
});
assert_eq!(resp.data.into_json().unwrap(), expected_data);
}

#[tokio::test]
async fn single_running_workflow_query() {
let workflow_name = "numpy-benchmark-kc7pf";
let visit = Visit {
proposal_code: "mg".to_string(),
proposal_number: 36964,
number: 1,
};

let mut server = mockito::Server::new_async().await;
let mut response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
response_file_path.push("test-assets");
response_file_path.push("get-workflow-kc7pf-running.json");
let workflow_endpoint = server
.mock(
"GET",
&format!("/api/v1/workflows/{}/{}", visit, workflow_name)[..],
)
.with_status(200)
.with_header("content-type", "application/json")
.with_body_from_file(response_file_path)
.create_async()
.await;

let argo_server_url = Url::parse(&server.url()).unwrap();
let schema = root_schema_builder()
.data(ArgoServerUrl(argo_server_url))
.data(None::<Authorization<Bearer>>)
.finish();
let query = format!(
r#"
query {{
workflow(name: "{}", visit: {{proposalCode: "{}", proposalNumber: {}, number: {}}}) {{
status {{
...on WorkflowRunningStatus {{
startTime
message
tasks {{
id
}}
}}
}}
}}
}}
"#,
workflow_name, visit.proposal_code, visit.proposal_number, visit.number
);
let resp = schema.execute(query).await.into_result().unwrap();

workflow_endpoint.assert_async().await;
let expected_data = json!({
"workflow": {
"status": {
"startTime": "2025-01-22T12:29:45+00:00",
"message": null,
"tasks": [{"id": workflow_name}]
}
}
});
assert_eq!(resp.data.into_json().unwrap(), expected_data);
}

#[tokio::test]
async fn single_null_workflow_query() {
let workflow_name = "numpy-benchmark-pwtgn";
let visit = Visit {
proposal_code: "mg".to_string(),
proposal_number: 36964,
number: 1,
};

let mut server = mockito::Server::new_async().await;
let mut response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
response_file_path.push("test-assets");
response_file_path.push("get-workflow-pwtgn-null.json");
let workflow_endpoint = server
.mock(
"GET",
&format!("/api/v1/workflows/{}/{}", visit, workflow_name)[..],
)
.with_status(200)
.with_header("content-type", "application/json")
.with_body_from_file(response_file_path)
.create_async()
.await;

let argo_server_url = Url::parse(&server.url()).unwrap();
let schema = root_schema_builder()
.data(ArgoServerUrl(argo_server_url))
.data(None::<Authorization<Bearer>>)
.finish();
let query = format!(
r#"
query {{
workflow(name: "{}", visit: {{proposalCode: "{}", proposalNumber: {}, number: {}}}) {{
status {{
__typename
}}
}}
}}
"#,
workflow_name, visit.proposal_code, visit.proposal_number, visit.number
);
let resp = schema.execute(query).await.into_result().unwrap();

workflow_endpoint.assert_async().await;
let expected_data = json!({
"workflow": {
"status": null,
}
});
assert_eq!(resp.data.into_json().unwrap(), expected_data);
}

#[tokio::test]
async fn multiple_workflows_query() {
let visit = Visit {
Expand All @@ -579,7 +821,7 @@ mod tests {

let mut server = mockito::Server::new_async().await;
let mut multiple_workflows_response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
multiple_workflows_response_file_path.push("test-resources");
multiple_workflows_response_file_path.push("test-assets");
multiple_workflows_response_file_path.push("get-workflows.json");

let workflows_endpoint = server
Expand Down Expand Up @@ -645,13 +887,13 @@ mod tests {

let mut server = mockito::Server::new_async().await;
let mut multiple_workflows_response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
multiple_workflows_response_file_path.push("test-resources");
multiple_workflows_response_file_path.push("test-assets");
multiple_workflows_response_file_path.push("get-workflows.json");
let mut workflow_one_response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
workflow_one_response_file_path.push("test-resources");
workflow_one_response_file_path.push("test-assets");
workflow_one_response_file_path.push("get-workflow-wdkwj.json");
let mut workflow_two_response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
workflow_two_response_file_path.push("test-resources");
workflow_two_response_file_path.push("test-assets");
workflow_two_response_file_path.push("get-workflow-n6jsg.json");

let workflows_endpoint = server
Expand Down Expand Up @@ -746,7 +988,7 @@ mod tests {

let mut server = mockito::Server::new_async().await;
let mut multiple_workflows_response_file_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
multiple_workflows_response_file_path.push("test-resources");
multiple_workflows_response_file_path.push("test-assets");
multiple_workflows_response_file_path.push("get-workflows.json");

let workflows_endpoint = server
Expand Down
Loading
Loading