|
|
@@ -1,14 +1,30 @@ |
|
|
#!/bin/bash |
|
|
#!/bin/bash |
|
|
# Full API smoke test: gateways, zones, trackerzones, trackers (list/update/delete). |
|
|
|
|
|
# Usage: ./api/smoke_test.sh or BASE_URL=http://host:port ./api/smoke_test.sh |
|
|
|
|
|
|
|
|
# Full API smoke test: list, update, and delete for gateways, zones, |
|
|
|
|
|
# tracker zones, and trackers. Followed by a pagination showcase for |
|
|
|
|
|
# every list endpoint. |
|
|
|
|
|
# |
|
|
|
|
|
# The script reads existing records from the database and exercises |
|
|
|
|
|
# update + delete on them, so it is safe to run against a populated |
|
|
|
|
|
# dev environment. Nothing is created — only existing rows are touched. |
|
|
|
|
|
# |
|
|
|
|
|
# Requires: jq (https://stedolan.github.io/jq/) |
|
|
|
|
|
# |
|
|
|
|
|
# Usage: |
|
|
|
|
|
# ./api/smoke_test.sh |
|
|
|
|
|
# BASE_URL=http://host:port ./api/smoke_test.sh |
|
|
set -e |
|
|
set -e |
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
|
|
. "${SCRIPT_DIR}/../_common.sh" |
|
|
. "${SCRIPT_DIR}/../_common.sh" |
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
|
|
|
# GATEWAYS |
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
echo "==========================================" |
|
|
echo "==========================================" |
|
|
echo "GATEWAY API TESTS" |
|
|
echo "GATEWAY API TESTS" |
|
|
echo "==========================================" |
|
|
echo "==========================================" |
|
|
|
|
|
|
|
|
|
|
|
# List all gateways. jq -c '.[]' prints one compact JSON object per line |
|
|
|
|
|
# so we can iterate and extract the id field. |
|
|
echo "1. Listing all Gateways" |
|
|
echo "1. Listing all Gateways" |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getGateways" | jq -c '.[]') |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getGateways" | jq -c '.[]') |
|
|
GATEWAY_IDS=() |
|
|
GATEWAY_IDS=() |
|
|
@@ -19,27 +35,37 @@ for r in $LIST; do |
|
|
done |
|
|
done |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
|
|
|
# Update and delete only when there are at least 2 gateways so we don't |
|
|
|
|
|
# accidentally destroy the only one in the system. |
|
|
if [ ${#GATEWAY_IDS[@]} -gt 1 ]; then |
|
|
if [ ${#GATEWAY_IDS[@]} -gt 1 ]; then |
|
|
echo -e "\n\n2. Updating Gateway ${GATEWAY_IDS[1]}" |
|
|
echo -e "\n\n2. Updating Gateway ${GATEWAY_IDS[1]}" |
|
|
|
|
|
# PUT replaces the full record — all fields must be supplied. |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateGateway/${GATEWAY_IDS[1]}" \ |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateGateway/${GATEWAY_IDS[1]}" \ |
|
|
-H "Content-Type: application/json" \ |
|
|
-H "Content-Type: application/json" \ |
|
|
-d "{\"id\": \"${GATEWAY_IDS[1]}\", \"name\": \"GU-100-Updated\", \"mac\": \"AA:BB:CC:DD:EE:FF\", \"status\": \"online\", \"model\": \"MG3\", \"ip\": \"127.0.0.1\", \"position\": \"unknown\", \"x\": 1, \"y\": 1, \"notes\": \"some description\", \"floor\": \"second\", \"building\": \"hospital\"}" |
|
|
-d "{\"id\": \"${GATEWAY_IDS[1]}\", \"name\": \"GU-100-Updated\", \"mac\": \"AA:BB:CC:DD:EE:FF\", \"status\": \"online\", \"model\": \"MG3\", \"ip\": \"127.0.0.1\", \"position\": \"unknown\", \"x\": 1, \"y\": 1, \"notes\": \"some description\", \"floor\": \"second\", \"building\": \"hospital\"}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n3. Listing Gateways after update" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n3. Listing Gateways after update (verify name changed)" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getGateways" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getGateways" | jq -c '.[]' |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
echo -e "\n\n4. Deleting Gateway ${GATEWAY_IDS[1]}" |
|
|
echo -e "\n\n4. Deleting Gateway ${GATEWAY_IDS[1]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeGateway/${GATEWAY_IDS[1]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeGateway/${GATEWAY_IDS[1]}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n5. Verifying Delete (List again)..." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n5. Verifying delete — Gateway ${GATEWAY_IDS[1]} should be gone" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getGateways" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getGateways" | jq -c '.[]' |
|
|
else |
|
|
else |
|
|
echo "Not enough gateways to test update/delete" |
|
|
|
|
|
|
|
|
echo "Not enough gateways to test update/delete (need at least 2)" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
|
|
|
# ZONES |
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
echo -e "\n\n==========================================" |
|
|
echo -e "\n\n==========================================" |
|
|
echo "ZONE API TESTS" |
|
|
echo "ZONE API TESTS" |
|
|
echo "==========================================" |
|
|
echo "==========================================" |
|
|
|
|
|
|
|
|
echo "6. Listing all Zones" |
|
|
echo "6. Listing all Zones" |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getZones" | jq -c '.[]') |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getZones" | jq -c '.[]') |
|
|
ZONE_IDS=() |
|
|
ZONE_IDS=() |
|
|
@@ -51,24 +77,32 @@ sleep 1 |
|
|
|
|
|
|
|
|
if [ ${#ZONE_IDS[@]} -gt 0 ]; then |
|
|
if [ ${#ZONE_IDS[@]} -gt 0 ]; then |
|
|
echo -e "\n\n7. Updating Zone ${ZONE_IDS[0]}" |
|
|
echo -e "\n\n7. Updating Zone ${ZONE_IDS[0]}" |
|
|
|
|
|
# updateZone takes the id inside the body (no path parameter). |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateZone" -H "Content-Type: application/json" \ |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateZone" -H "Content-Type: application/json" \ |
|
|
-d "{\"id\": \"${ZONE_IDS[0]}\", \"name\": \"Zone-Updated\", \"groups\": [\"security\", \"logistics\"]}" |
|
|
-d "{\"id\": \"${ZONE_IDS[0]}\", \"name\": \"Zone-Updated\", \"groups\": [\"security\", \"logistics\"]}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n8. Listing Zones after update" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n8. Listing Zones after update (verify name and groups changed)" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getZones" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getZones" | jq -c '.[]' |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
echo -e "\n\n9. Deleting Zone ${ZONE_IDS[0]}" |
|
|
echo -e "\n\n9. Deleting Zone ${ZONE_IDS[0]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeZone/${ZONE_IDS[0]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeZone/${ZONE_IDS[0]}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n10. Verifying Delete..." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n10. Verifying delete — Zone ${ZONE_IDS[0]} should be gone" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getZones" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getZones" | jq -c '.[]' |
|
|
else |
|
|
else |
|
|
echo "No zones to test update/delete" |
|
|
|
|
|
|
|
|
echo "No zones found — skipping update/delete tests" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
|
|
|
# TRACKER ZONES |
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
echo -e "\n\n==========================================" |
|
|
echo -e "\n\n==========================================" |
|
|
echo "TRACKERZONE API TESTS" |
|
|
echo "TRACKERZONE API TESTS" |
|
|
echo "==========================================" |
|
|
echo "==========================================" |
|
|
|
|
|
|
|
|
echo "11. Listing all TrackerZones" |
|
|
echo "11. Listing all TrackerZones" |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getTrackerZones" | jq -c '.[]') |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getTrackerZones" | jq -c '.[]') |
|
|
TRACKERZONE_IDS=() |
|
|
TRACKERZONE_IDS=() |
|
|
@@ -80,24 +114,32 @@ sleep 1 |
|
|
|
|
|
|
|
|
if [ ${#TRACKERZONE_IDS[@]} -gt 0 ]; then |
|
|
if [ ${#TRACKERZONE_IDS[@]} -gt 0 ]; then |
|
|
echo -e "\n\n12. Updating TrackerZone ${TRACKERZONE_IDS[0]}" |
|
|
echo -e "\n\n12. Updating TrackerZone ${TRACKERZONE_IDS[0]}" |
|
|
|
|
|
# updateTrackerZone also takes the id inside the body. |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateTrackerZone" -H "Content-Type: application/json" \ |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateTrackerZone" -H "Content-Type: application/json" \ |
|
|
-d "{\"id\": \"${TRACKERZONE_IDS[0]}\", \"name\": \"TrackerZone-Updated\"}" |
|
|
-d "{\"id\": \"${TRACKERZONE_IDS[0]}\", \"name\": \"TrackerZone-Updated\"}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
echo -e "\n\n13. Listing TrackerZones after update" |
|
|
echo -e "\n\n13. Listing TrackerZones after update" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackerZones" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackerZones" | jq -c '.[]' |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
echo -e "\n\n14. Deleting TrackerZone ${TRACKERZONE_IDS[0]}" |
|
|
echo -e "\n\n14. Deleting TrackerZone ${TRACKERZONE_IDS[0]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeTrackerZone/${TRACKERZONE_IDS[0]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeTrackerZone/${TRACKERZONE_IDS[0]}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n15. Verifying Delete..." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n15. Verifying delete — TrackerZone ${TRACKERZONE_IDS[0]} should be gone" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackerZones" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackerZones" | jq -c '.[]' |
|
|
else |
|
|
else |
|
|
echo "No trackerzones to test update/delete" |
|
|
|
|
|
|
|
|
echo "No tracker zones found — skipping update/delete tests" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
|
|
|
# TRACKERS |
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
echo -e "\n\n==========================================" |
|
|
echo -e "\n\n==========================================" |
|
|
echo "TRACKER API TESTS" |
|
|
echo "TRACKER API TESTS" |
|
|
echo "==========================================" |
|
|
echo "==========================================" |
|
|
|
|
|
|
|
|
echo "16. Listing all Trackers" |
|
|
echo "16. Listing all Trackers" |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getTrackers" | jq -c '.[]') |
|
|
LIST=$(curl -s -X GET "$BASE_URL/reslevis/getTrackers" | jq -c '.[]') |
|
|
TRACKER_IDS=() |
|
|
TRACKER_IDS=() |
|
|
@@ -109,21 +151,69 @@ sleep 1 |
|
|
|
|
|
|
|
|
if [ ${#TRACKER_IDS[@]} -gt 0 ]; then |
|
|
if [ ${#TRACKER_IDS[@]} -gt 0 ]; then |
|
|
echo -e "\n\n17. Updating Tracker ${TRACKER_IDS[0]}" |
|
|
echo -e "\n\n17. Updating Tracker ${TRACKER_IDS[0]}" |
|
|
|
|
|
# Only the fields provided are updated; omitted fields retain their values |
|
|
|
|
|
# because the server does a full Save (not a partial patch). |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateTracker" -H "Content-Type: application/json" \ |
|
|
curl -s -X PUT "$BASE_URL/reslevis/updateTracker" -H "Content-Type: application/json" \ |
|
|
-d "{\"id\": \"${TRACKER_IDS[0]}\", \"name\": \"Tracker-Updated\", \"battery\": 85, \"status\": \"inactive\"}" |
|
|
-d "{\"id\": \"${TRACKER_IDS[0]}\", \"name\": \"Tracker-Updated\", \"battery\": 85, \"status\": \"inactive\"}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n18. Listing Trackers after update" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n18. Listing Trackers after update (verify name/status changed)" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackers" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackers" | jq -c '.[]' |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
|
|
|
|
|
|
echo -e "\n\n19. Deleting Tracker ${TRACKER_IDS[0]}" |
|
|
echo -e "\n\n19. Deleting Tracker ${TRACKER_IDS[0]}" |
|
|
|
|
|
# Deleting a tracker also publishes a DELETE event to Kafka so the |
|
|
|
|
|
# location and decoder services stop tracking that MAC address. |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeTracker/${TRACKER_IDS[0]}" |
|
|
curl -s -X DELETE "$BASE_URL/reslevis/removeTracker/${TRACKER_IDS[0]}" |
|
|
sleep 1 |
|
|
sleep 1 |
|
|
echo -e "\n\n20. Verifying Delete..." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n\n20. Verifying delete — Tracker ${TRACKER_IDS[0]} should be gone" |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackers" | jq -c '.[]' |
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackers" | jq -c '.[]' |
|
|
else |
|
|
else |
|
|
echo "No trackers to test update/delete" |
|
|
|
|
|
|
|
|
echo "No trackers found — skipping update/delete tests" |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
|
|
|
# PAGINATION SHOWCASE |
|
|
|
|
|
# All list endpoints accept ?limit=N&offset=N query parameters. |
|
|
|
|
|
# Default: limit=100, offset=0. |
|
|
|
|
|
# Use limit + offset to page through large result sets. |
|
|
|
|
|
# --------------------------------------------------------------------------- |
|
|
|
|
|
echo -e "\n\n==========================================" |
|
|
|
|
|
echo "PAGINATION SHOWCASE" |
|
|
|
|
|
echo "All list endpoints support ?limit=N&offset=N" |
|
|
|
|
|
echo "Default: limit=100, offset=0" |
|
|
|
|
|
echo "==========================================" |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Gateways: first page (limit=5, offset=0) ---" |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getGateways?limit=5&offset=0" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Gateways: second page (limit=5, offset=5) ---" |
|
|
|
|
|
# offset moves the window forward by the page size; combine with the same |
|
|
|
|
|
# limit to get the next batch of results. |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getGateways?limit=5&offset=5" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Trackers: first page (limit=3, offset=0) ---" |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackers?limit=3&offset=0" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Trackers: second page (limit=3, offset=3) ---" |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackers?limit=3&offset=3" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Zones: first page (limit=10, offset=0) ---" |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getZones?limit=10&offset=0" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- TrackerZones: first page (limit=10, offset=0) ---" |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getTrackerZones?limit=10&offset=0" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Alerts: first page (limit=10, offset=0) ---" |
|
|
|
|
|
# Alerts are created automatically when a tracker enters a restricted zone. |
|
|
|
|
|
# Use offset to page through the alert history. |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/alerts?limit=10&offset=0" | jq '.' |
|
|
|
|
|
|
|
|
|
|
|
echo -e "\n--- Latest tracker positions: first page (limit=5, offset=0) ---" |
|
|
|
|
|
# getTracks (no uuid) returns the most recent position record per tracker. |
|
|
|
|
|
curl -s -X GET "$BASE_URL/reslevis/getTracks?limit=5&offset=0" | jq '.' |
|
|
|
|
|
|
|
|
echo -e "\n\n==========================================" |
|
|
echo -e "\n\n==========================================" |
|
|
echo "ALL TESTS COMPLETED" |
|
|
echo "ALL TESTS COMPLETED" |
|
|
echo "==========================================" |
|
|
echo "==========================================" |