feature:
Full SOFA Score: Data Layer + Scoring Engine Glasgow Coma Scale: Data Layer + Scoring Engine
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
|
||||
echo "=== Phase 25 verification ==="
|
||||
|
||||
echo "1. Integration tests"
|
||||
dotnet test "${ROOT_DIR}/VigilCareClinicalAPI.Tests" \
|
||||
--filter "FullyQualifiedName~GcsScoring" \
|
||||
--no-restore
|
||||
|
||||
echo "2. Manual API checks (requires running stack)"
|
||||
BASE_URL="${BASE_URL:-http://localhost:5270}"
|
||||
ENCOUNTER_ID="${ENCOUNTER_ID:?Set ENCOUNTER_ID to an active encounter UUID}"
|
||||
|
||||
post_obs() {
|
||||
local code="$1" value="$2"
|
||||
curl -sf -X POST "${BASE_URL}/api/v1/encounters/${ENCOUNTER_ID}/observations" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"observations\":[{\"observationCode\":\"${code}\",\"value\":${value},\"unit\":\"score\",\"source\":\"Manual\",\"recordedAt\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}]}"
|
||||
}
|
||||
|
||||
post_obs GCS_EYE 4
|
||||
post_obs GCS_VERBAL 5
|
||||
post_obs GCS_MOTOR 6
|
||||
curl -sf "${BASE_URL}/api/v1/encounters/${ENCOUNTER_ID}/gcs" | jq -e '.data.totalScore == 15'
|
||||
|
||||
post_obs GCS_EYE 1
|
||||
post_obs GCS_VERBAL 2
|
||||
post_obs GCS_MOTOR 3
|
||||
echo "Verify GCS_CRITICAL alert, NEWS2 consciousness=3, and qSOFA altered mentation in DB/UI"
|
||||
|
||||
echo "Phase 25 verification complete."
|
||||
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
|
||||
echo "=== Phase 26 verification ==="
|
||||
|
||||
echo "1. Integration tests"
|
||||
dotnet test "${ROOT_DIR}/VigilCareClinicalAPI.Tests" \
|
||||
--filter "FullyQualifiedName~SofaScoring" \
|
||||
--no-restore
|
||||
|
||||
echo "2. Manual API checks (requires running stack)"
|
||||
BASE_URL="${BASE_URL:-http://localhost:5270}"
|
||||
ENCOUNTER_ID="${ENCOUNTER_ID:?Set ENCOUNTER_ID to an active encounter UUID}"
|
||||
|
||||
post_obs() {
|
||||
local code="$1" value="$2"
|
||||
curl -sf -X POST "${BASE_URL}/api/v1/encounters/${ENCOUNTER_ID}/observations" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"observations\":[{\"observationCode\":\"${code}\",\"value\":${value},\"unit\":\"score\",\"source\":\"Manual\",\"recordedAt\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}]}"
|
||||
}
|
||||
|
||||
wait_for_sofa_baseline() {
|
||||
for _ in $(seq 1 30); do
|
||||
if curl -sf "${BASE_URL}/api/v1/encounters/${ENCOUNTER_ID}/sofa/history?limit=20" \
|
||||
| jq -e '[.data.items[] | select(.isBaseline == true)] | length > 0' >/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
echo "Timed out waiting for SOFA baseline"
|
||||
return 1
|
||||
}
|
||||
|
||||
wait_for_sofa_delta() {
|
||||
local min_delta="$1"
|
||||
for _ in $(seq 1 30); do
|
||||
if curl -sf "${BASE_URL}/api/v1/encounters/${ENCOUNTER_ID}/sofa" \
|
||||
| jq -e ".data.deltaFromBaseline >= ${min_delta}" >/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
echo "Timed out waiting for SOFA delta >= ${min_delta}"
|
||||
return 1
|
||||
}
|
||||
|
||||
post_obs PAO2_MMHG 100
|
||||
post_obs FIO2_PCT 40
|
||||
post_obs PLATELET_K_UL 180
|
||||
post_obs BILIRUBIN_MG_DL 1.0
|
||||
post_obs SYSTOLIC_BP 120
|
||||
post_obs DIASTOLIC_BP 80
|
||||
post_obs CREATININE_MG_DL 1.0
|
||||
post_obs URINE_OUTPUT_ML_H 50
|
||||
wait_for_sofa_baseline
|
||||
curl -sf "${BASE_URL}/api/v1/encounters/${ENCOUNTER_ID}/sofa" | jq -e '.data.totalScore >= 0'
|
||||
|
||||
post_obs PLATELET_K_UL 20
|
||||
post_obs CREATININE_MG_DL 4.5
|
||||
wait_for_sofa_delta 2
|
||||
echo "Verify SOFA_SEPSIS alert and delta >= 2 in DB/UI"
|
||||
|
||||
echo "Phase 26 verification complete."
|
||||
Reference in New Issue
Block a user