Add full QA script

This commit is contained in:
2026-04-20 07:07:21 -06:00
parent f5d90c1d4f
commit aa48d2428d

725
test-backend-full.sh Executable file
View File

@@ -0,0 +1,725 @@
#!/usr/bin/env bash
set -uo pipefail
BASE="https://petshop-backend.nicepond-c7280126.westus2.azurecontainerapps.io/api/v1"
PASS=0 FAIL=0
CLEANUP_USER_IDS=()
CLEANUP_PRODUCT_IDS=()
CLEANUP_CATEGORY_IDS=()
CLEANUP_PET_IDS=()
CLEANUP_MYPET_IDS=()
CLEANUP_SERVICE_IDS=()
CLEANUP_STORE_IDS=()
CLEANUP_APPT_IDS=()
CLEANUP_ADOPTION_IDS=()
CLEANUP_SALE_IDS=()
CLEANUP_COUPON_IDS=()
CLEANUP_SUPPLIER_IDS=()
CLEANUP_CONV_IDS=()
check() {
local label="$1" expect="$2" method="$3" path="$4"; shift 4
local code
code=$(curl -s -o /tmp/qa_body.json -w "%{http_code}" -X "$method" "$BASE$path" "$@" 2>/dev/null)
if [ "$code" = "$expect" ]; then PASS=$((PASS+1))
else FAIL=$((FAIL+1)); echo "FAIL: $label — expected $expect got $code"; fi
}
check_field() {
local label="$1" expr="$2" expected="$3"
local actual
actual=$(jq -r "$expr" /tmp/qa_body.json 2>/dev/null)
if [ "$actual" = "$expected" ]; then PASS=$((PASS+1))
else FAIL=$((FAIL+1)); echo "FAIL: $label — expected '$expected' got '$actual'"; fi
}
check_field_contains() {
local label="$1" expr="$2" expected="$3"
local actual
actual=$(jq -r "$expr" /tmp/qa_body.json 2>/dev/null)
if echo "$actual" | grep -q "$expected" 2>/dev/null; then PASS=$((PASS+1))
else FAIL=$((FAIL+1)); echo "FAIL: $label — expected contains '$expected' got '$actual'"; fi
}
check_field_gt() {
local label="$1" expr="$2" threshold="$3"
local actual
actual=$(jq -r "$expr" /tmp/qa_body.json 2>/dev/null)
if [ "$(echo "$actual > $threshold" | bc 2>/dev/null)" = "1" ]; then PASS=$((PASS+1))
else FAIL=$((FAIL+1)); echo "FAIL: $label — expected > $threshold got '$actual'"; fi
}
id_from_body() { jq -r '.id // .userId // empty' /tmp/qa_body.json 2>/dev/null; }
echo "========================================="
echo " PET SHOP QA — Full Backend Test Suite"
echo "========================================="
echo "--- 1. AUTH ---"
check "Admin login" 200 POST "/auth/login" -H 'Content-Type: application/json' -d '{"username":"admin","password":"admin123"}'
ADMIN_TOKEN=$(jq -r '.token' /tmp/qa_body.json)
if [ "$ADMIN_TOKEN" = "null" ] || [ -z "$ADMIN_TOKEN" ]; then echo "FATAL: Admin login failed"; exit 1; fi
check "Staff login" 200 POST "/auth/login" -H 'Content-Type: application/json' -d '{"username":"staff","password":"staff123"}'
STAFF_TOKEN=$(jq -r '.token' /tmp/qa_body.json)
if [ "$STAFF_TOKEN" = "null" ] || [ -z "$STAFF_TOKEN" ]; then echo "FATAL: Staff login failed"; exit 1; fi
check "Customer login" 200 POST "/auth/login" -H 'Content-Type: application/json' -d '{"username":"customer","password":"customer123"}'
CUST_TOKEN=$(jq -r '.token' /tmp/qa_body.json)
if [ "$CUST_TOKEN" = "null" ] || [ -z "$CUST_TOKEN" ]; then echo "FATAL: Customer login failed"; exit 1; fi
A=(-H "Authorization: Bearer $ADMIN_TOKEN")
S=(-H "Authorization: Bearer $STAFF_TOKEN")
C=(-H "Authorization: Bearer $CUST_TOKEN")
J=(-H "Content-Type: application/json")
check "GET /auth/me admin" 200 GET "/auth/me" "${A[@]}"
check_field "Admin role" ".role" "ADMIN"
check "GET /auth/me staff" 200 GET "/auth/me" "${S[@]}"
check_field "Staff role" ".role" "STAFF"
check "GET /auth/me customer" 200 GET "/auth/me" "${C[@]}"
check_field "Customer role" ".role" "CUSTOMER"
check "Admin avatar file" 200 GET "/auth/me/avatar/file" "${A[@]}"
check "Wrong password" 401 POST "/auth/login" "${J[@]}" -d '{"username":"admin","password":"wrong"}'
check "Empty login body" 400 POST "/auth/login" "${J[@]}" -d '{}'
check "Register QA user" 201 POST "/auth/register" "${J[@]}" -d '{"username":"testuser_qa","password":"Test1234!","email":"qa@test.com","firstName":"QA","lastName":"Test","phone":"5551234567"}'
QA_USER_ID=$(id_from_body)
[ -n "$QA_USER_ID" ] && CLEANUP_USER_IDS+=("$QA_USER_ID")
check "Login QA user" 200 POST "/auth/login" "${J[@]}" -d '{"username":"testuser_qa","password":"Test1234!"}'
QA_TOKEN=$(jq -r '.token' /tmp/qa_body.json)
check "GET /me QA user" 200 GET "/auth/me" -H "Authorization: Bearer $QA_TOKEN"
check_field "QA username" ".username" "testuser_qa"
check "Duplicate register" 409 POST "/auth/register" "${J[@]}" -d '{"username":"admin","password":"Test1234!","email":"dup@test.com","firstName":"A","lastName":"B","phone":"5550000000"}'
if [ "$(jq -r '.status // empty' /tmp/qa_body.json 2>/dev/null)" != "" ]; then PASS=$((PASS)); else
check "Duplicate register alt" 400 POST "/auth/register" "${J[@]}" -d '{"username":"admin","password":"Test1234!","email":"dup2@test.com","firstName":"A","lastName":"B","phone":"5550000001"}'
fi
check "Register missing fields" 400 POST "/auth/register" "${J[@]}" -d '{"username":"incomplete_qa"}'
echo "--- 2. PRODUCTS ---"
check "GET /products" 200 GET "/products"
check "GET /products/1" 200 GET "/products/1"
check "GET /products?q=dog" 200 GET "/products?q=dog"
check "GET /products?categoryId=1" 200 GET "/products?categoryId=1"
check "GET /products/999999" 404 GET "/products/999999"
check "Create product (admin)" 201 POST "/products" "${A[@]}" "${J[@]}" -d '{"prodName":"QA_TEST_Product","description":"QA test","price":9.99,"categoryId":1}'
PROD_ID=$(id_from_body)
[ -n "$PROD_ID" ] && CLEANUP_PRODUCT_IDS+=("$PROD_ID")
check_field "Product name" ".prodName" "QA_TEST_Product"
check "Create product (customer)" 403 POST "/products" "${C[@]}" "${J[@]}" -d '{"prodName":"QA_TEST_Nope","price":1,"categoryId":1}'
check "Create product (no auth)" 401 POST "/products" "${J[@]}" -d '{"prodName":"QA_TEST_Nope2","price":1,"categoryId":1}'
check "Create product missing name" 400 POST "/products" "${A[@]}" "${J[@]}" -d '{"price":1,"categoryId":1}'
if [ -n "$PROD_ID" ]; then
check "Update product" 200 PUT "/products/$PROD_ID" "${A[@]}" "${J[@]}" -d "{\"prodName\":\"QA_TEST_Updated\",\"description\":\"updated\",\"price\":19.99,\"categoryId\":1}"
check_field "Updated name" ".prodName" "QA_TEST_Updated"
fi
check "Create product to delete" 201 POST "/products" "${A[@]}" "${J[@]}" -d '{"prodName":"QA_TEST_DeleteMe","description":"del","price":1,"categoryId":1}'
DEL_PROD_ID=$(id_from_body)
if [ -n "$DEL_PROD_ID" ]; then
check "Delete product" 200 DELETE "/products/$DEL_PROD_ID" "${A[@]}"
check "GET deleted product" 404 GET "/products/$DEL_PROD_ID"
fi
check "GET /products paginated" 200 GET "/products?page=0&size=5"
check "GET /products sorted" 200 GET "/products?sort=price,desc"
echo "--- 3. CATEGORIES ---"
check "GET /categories" 200 GET "/categories"
check "GET /categories/1" 200 GET "/categories/1"
check "GET /categories/999999" 404 GET "/categories/999999"
check "Create category (admin)" 201 POST "/categories" "${A[@]}" "${J[@]}" -d '{"catName":"QA_TEST_Category","description":"qa"}'
CAT_ID=$(id_from_body)
[ -n "$CAT_ID" ] && CLEANUP_CATEGORY_IDS+=("$CAT_ID")
check "Create category (customer)" 403 POST "/categories" "${C[@]}" "${J[@]}" -d '{"catName":"QA_TEST_Nope"}'
check "Create category missing name" 400 POST "/categories" "${A[@]}" "${J[@]}" -d '{"description":"no name"}'
if [ -n "$CAT_ID" ]; then
check "Update category" 200 PUT "/categories/$CAT_ID" "${A[@]}" "${J[@]}" -d "{\"catName\":\"QA_TEST_CatUpdated\",\"description\":\"updated\"}"
check_field "Updated cat name" ".catName" "QA_TEST_CatUpdated"
fi
check "Create category to delete" 201 POST "/categories" "${A[@]}" "${J[@]}" -d '{"catName":"QA_TEST_CatDel","description":"del"}'
DEL_CAT_ID=$(id_from_body)
if [ -n "$DEL_CAT_ID" ]; then
check "Delete category" 200 DELETE "/categories/$DEL_CAT_ID" "${A[@]}"
check "GET deleted category" 404 GET "/categories/$DEL_CAT_ID"
fi
echo "--- 4. PETS ---"
check "GET /pets" 200 GET "/pets"
check "GET /pets/2" 200 GET "/pets/2"
check "GET /pets?species=Dog" 200 GET "/pets?species=Dog"
check "GET /pets?status=Available" 200 GET "/pets?status=Available"
check "GET /pets/999999" 404 GET "/pets/999999"
check "GET /my-pets (customer)" 200 GET "/my-pets" "${C[@]}"
check "Admin create pet" 201 POST "/pets" "${A[@]}" "${J[@]}" -d '{"name":"QA_TEST_Pet","species":"Dog","breed":"Labrador","age":2,"gender":"Male","status":"Available","storeId":1,"price":100,"description":"QA test pet"}'
PET_ID=$(id_from_body)
[ -n "$PET_ID" ] && CLEANUP_PET_IDS+=("$PET_ID")
check_field "Pet name" ".name" "QA_TEST_Pet"
check_field "Pet species" ".species" "Dog"
if [ -n "$PET_ID" ]; then
check "Update pet" 200 PUT "/pets/$PET_ID" "${A[@]}" "${J[@]}" -d "{\"name\":\"QA_TEST_PetUpd\",\"species\":\"Dog\",\"breed\":\"Labrador\",\"age\":3,\"gender\":\"Male\",\"status\":\"Available\",\"storeId\":1,\"price\":150,\"description\":\"updated\"}"
check_field "Updated pet name" ".name" "QA_TEST_PetUpd"
fi
check "Admin create pet to delete" 201 POST "/pets" "${A[@]}" "${J[@]}" -d '{"name":"QA_TEST_PetDel","species":"Cat","breed":"Siamese","age":1,"gender":"Female","status":"Available","storeId":1,"price":50,"description":"del"}'
DEL_PET_ID=$(id_from_body)
if [ -n "$DEL_PET_ID" ]; then
check "Delete pet" 200 DELETE "/pets/$DEL_PET_ID" "${A[@]}"
check "GET deleted pet" 404 GET "/pets/$DEL_PET_ID"
fi
check "Customer create my-pet" 201 POST "/my-pets" "${C[@]}" "${J[@]}" -d '{"name":"QA_TEST_MyPet","species":"Rabbit","breed":"Holland Lop","age":1,"gender":"Female","description":"my pet"}'
MY_PET_ID=$(id_from_body)
[ -n "$MY_PET_ID" ] && CLEANUP_MYPET_IDS+=("$MY_PET_ID")
check "GET /my-pets has new pet" 200 GET "/my-pets" "${C[@]}"
check "Create pet (customer direct)" 403 POST "/pets" "${C[@]}" "${J[@]}" -d '{"name":"QA_TEST_Nope","species":"Dog","breed":"Lab","age":1,"gender":"Male","status":"Available","storeId":1,"price":10}'
check "Create pet (no auth)" 401 POST "/pets" "${J[@]}" -d '{"name":"QA_TEST_Nope2","species":"Dog","breed":"Lab","age":1,"gender":"Male","status":"Available","storeId":1,"price":10}'
check "GET /pets paginated" 200 GET "/pets?page=0&size=5"
echo "--- 5. SERVICES ---"
check "GET /services" 200 GET "/services"
check "GET /services/1" 200 GET "/services/1"
check "GET /services?species=Dog" 200 GET "/services?species=Dog"
check "GET /services/999999" 404 GET "/services/999999"
check "Create service (admin)" 201 POST "/services" "${A[@]}" "${J[@]}" -d '{"serviceName":"QA_TEST_Service","description":"qa svc","basePrice":25.00,"duration":30,"species":["Dog","Cat"]}'
SVC_ID=$(id_from_body)
[ -n "$SVC_ID" ] && CLEANUP_SERVICE_IDS+=("$SVC_ID")
check_field "Service name" ".serviceName" "QA_TEST_Service"
if [ -n "$SVC_ID" ]; then
check "Update service" 200 PUT "/services/$SVC_ID" "${A[@]}" "${J[@]}" -d "{\"serviceName\":\"QA_TEST_SvcUpd\",\"description\":\"upd\",\"basePrice\":30,\"duration\":45,\"species\":[\"Dog\"]}"
fi
check "Create service to delete" 201 POST "/services" "${A[@]}" "${J[@]}" -d '{"serviceName":"QA_TEST_SvcDel","description":"del","basePrice":10,"duration":15,"species":["Cat"]}'
DEL_SVC_ID=$(id_from_body)
if [ -n "$DEL_SVC_ID" ]; then
check "Delete service" 200 DELETE "/services/$DEL_SVC_ID" "${A[@]}"
fi
check "Create service (customer)" 403 POST "/services" "${C[@]}" "${J[@]}" -d '{"serviceName":"QA_TEST_Nope","basePrice":10,"duration":10,"species":["Dog"]}'
echo "--- 6. STORES ---"
check "GET /stores" 200 GET "/stores"
check "GET /stores/1" 200 GET "/stores/1"
check "GET /stores/999999" 404 GET "/stores/999999"
check "Create store (admin)" 201 POST "/stores" "${A[@]}" "${J[@]}" -d '{"storeName":"QA_TEST_Store","address":"123 QA St","city":"Testville","state":"QA","zipCode":"00000","phone":"5559999999"}'
STORE_ID=$(id_from_body)
[ -n "$STORE_ID" ] && CLEANUP_STORE_IDS+=("$STORE_ID")
if [ -n "$STORE_ID" ]; then
check "Update store" 200 PUT "/stores/$STORE_ID" "${A[@]}" "${J[@]}" -d "{\"storeName\":\"QA_TEST_StoreUpd\",\"address\":\"456 QA Ave\",\"city\":\"Testville\",\"state\":\"QA\",\"zipCode\":\"00001\",\"phone\":\"5559999998\"}"
fi
check "Create store to delete" 201 POST "/stores" "${A[@]}" "${J[@]}" -d '{"storeName":"QA_TEST_StoreDel","address":"789 Del Rd","city":"Gone","state":"QA","zipCode":"00002","phone":"5559999997"}'
DEL_STORE_ID=$(id_from_body)
if [ -n "$DEL_STORE_ID" ]; then
check "Delete store" 200 DELETE "/stores/$DEL_STORE_ID" "${A[@]}"
fi
check "Create store (staff)" 403 POST "/stores" "${S[@]}" "${J[@]}" -d '{"storeName":"QA_TEST_Nope","address":"x","city":"x","state":"x","zipCode":"x","phone":"x"}'
echo "--- 7. USERS / EMPLOYEES / CUSTOMERS ---"
check "GET /users (admin)" 200 GET "/users" "${A[@]}"
check "GET /users (customer)" 403 GET "/users" "${C[@]}"
check "GET /users/1" 200 GET "/users/1" "${A[@]}"
check "GET /users/999999" 404 GET "/users/999999" "${A[@]}"
check "GET /employees (admin)" 200 GET "/employees" "${A[@]}"
check "GET /employees (staff)" 403 GET "/employees" "${S[@]}"
check "GET /customers (staff)" 200 GET "/customers" "${S[@]}"
check "GET /customers (customer)" 403 GET "/customers" "${C[@]}"
check "Admin create user" 201 POST "/users" "${A[@]}" "${J[@]}" -d '{"username":"qa_test_user2","password":"Test1234!","email":"qa2@test.com","firstName":"QA2","lastName":"Test2","phone":"5552222222","role":"CUSTOMER"}'
NEW_USER_ID=$(id_from_body)
[ -n "$NEW_USER_ID" ] && CLEANUP_USER_IDS+=("$NEW_USER_ID")
check_field "Created username" ".username" "qa_test_user2"
if [ -n "$NEW_USER_ID" ]; then
check "Update user" 200 PUT "/users/$NEW_USER_ID" "${A[@]}" "${J[@]}" -d "{\"username\":\"qa_test_user2\",\"email\":\"qa2upd@test.com\",\"firstName\":\"QA2U\",\"lastName\":\"Test2U\",\"phone\":\"5552222223\",\"role\":\"CUSTOMER\"}"
fi
check "GET /users/1/avatar/file" 200 GET "/users/1/avatar/file" "${A[@]}"
check "GET /users/50/avatar/file (default)" 200 GET "/users/50/avatar/file" "${A[@]}"
check "GET /users no auth" 401 GET "/users"
check "Create user (staff)" 403 POST "/users" "${S[@]}" "${J[@]}" -d '{"username":"qa_nope","password":"x","email":"n@n.com","firstName":"N","lastName":"N","phone":"0","role":"CUSTOMER"}'
check "Create user (customer)" 403 POST "/users" "${C[@]}" "${J[@]}" -d '{"username":"qa_nope2","password":"x","email":"n2@n.com","firstName":"N","lastName":"N","phone":"0","role":"CUSTOMER"}'
echo "--- 8. APPOINTMENTS ---"
check "GET /appointments (admin)" 200 GET "/appointments" "${A[@]}"
check "GET /appointments/1" 200 GET "/appointments/1" "${A[@]}"
check "GET /appointments?storeId=1" 200 GET "/appointments?storeId=1" "${A[@]}"
check "GET /appointments?status=Scheduled" 200 GET "/appointments?status=Scheduled" "${A[@]}"
check "GET /appointments/availability" 200 GET "/appointments/availability?storeId=1&serviceId=1&date=2027-06-01" "${A[@]}"
check "GET /appointments/999999" 404 GET "/appointments/999999" "${A[@]}"
check "Create appointment" 201 POST "/appointments" "${A[@]}" "${J[@]}" -d '{"petId":53,"customerId":32,"storeId":2,"employeeId":7,"serviceId":1,"appointmentDate":"2027-06-15","appointmentTime":"10:00","notes":"QA_TEST"}'
APPT_ID=$(id_from_body)
[ -n "$APPT_ID" ] && CLEANUP_APPT_IDS+=("$APPT_ID")
check_field "Appointment status" ".status" "Scheduled"
if [ -n "$APPT_ID" ]; then
check "Cancel appointment" 200 PUT "/appointments/$APPT_ID" "${A[@]}" "${J[@]}" -d "{\"petId\":53,\"customerId\":32,\"storeId\":2,\"employeeId\":7,\"serviceId\":1,\"appointmentDate\":\"2027-06-15\",\"appointmentTime\":\"10:00\",\"status\":\"Cancelled\",\"notes\":\"QA_TEST cancelled\"}"
check_field "Cancelled status" ".status" "Cancelled"
fi
check "Create appointment to delete" 201 POST "/appointments" "${A[@]}" "${J[@]}" -d '{"petId":53,"customerId":32,"storeId":2,"employeeId":7,"serviceId":1,"appointmentDate":"2027-07-01","appointmentTime":"14:00","notes":"QA_TEST_DEL"}'
DEL_APPT_ID=$(id_from_body)
if [ -n "$DEL_APPT_ID" ]; then
check "Delete appointment" 200 DELETE "/appointments/$DEL_APPT_ID" "${A[@]}"
fi
check "Appointment past date" 400 POST "/appointments" "${A[@]}" "${J[@]}" -d '{"petId":53,"customerId":32,"storeId":2,"employeeId":7,"serviceId":1,"appointmentDate":"2020-01-01","appointmentTime":"10:00","notes":"QA_TEST past"}'
check "Pet-service mismatch" 400 POST "/appointments" "${A[@]}" "${J[@]}" -d '{"petId":38,"customerId":17,"storeId":1,"employeeId":4,"serviceId":1,"appointmentDate":"2027-08-01","appointmentTime":"10:00","notes":"QA_TEST mismatch"}'
check "Create appt for duplicate test" 201 POST "/appointments" "${A[@]}" "${J[@]}" -d '{"petId":53,"customerId":32,"storeId":2,"employeeId":7,"serviceId":1,"appointmentDate":"2027-09-01","appointmentTime":"09:00","notes":"QA_TEST dup1"}'
DUP_APPT_ID=$(id_from_body)
[ -n "$DUP_APPT_ID" ] && CLEANUP_APPT_IDS+=("$DUP_APPT_ID")
check "Duplicate time/employee" 400 POST "/appointments" "${A[@]}" "${J[@]}" -d '{"petId":53,"customerId":32,"storeId":2,"employeeId":7,"serviceId":1,"appointmentDate":"2027-09-01","appointmentTime":"09:00","notes":"QA_TEST dup2"}'
check "GET /appointments (customer)" 200 GET "/appointments" "${C[@]}"
check "GET /appointments (staff)" 200 GET "/appointments" "${S[@]}"
check "Create appointment (no auth)" 401 POST "/appointments" "${J[@]}" -d '{"petId":53,"customerId":32,"storeId":1,"employeeId":4,"serviceId":1,"appointmentDate":"2027-10-01","appointmentTime":"10:00"}'
echo "--- 9. ADOPTIONS ---"
check "GET /adoptions (admin)" 200 GET "/adoptions" "${A[@]}"
check "GET /adoptions/1" 200 GET "/adoptions/1" "${A[@]}"
check "GET /adoptions/999999" 404 GET "/adoptions/999999" "${A[@]}"
AVAIL_PET_1=""
AVAIL_PET_2=""
AVAIL_PET_3=""
curl -s "$BASE/pets?status=Available&size=5" "${A[@]}" -o /tmp/qa_avail.json 2>/dev/null
AVAIL_PET_1=$(jq -r '.content[0].id // empty' /tmp/qa_avail.json 2>/dev/null)
AVAIL_PET_2=$(jq -r '.content[1].id // empty' /tmp/qa_avail.json 2>/dev/null)
AVAIL_PET_3=$(jq -r '.content[2].id // empty' /tmp/qa_avail.json 2>/dev/null)
if [ -n "$AVAIL_PET_1" ]; then
check "Staff create adoption (Pending)" 201 POST "/adoptions" "${S[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_1,\"customerId\":32,\"storeId\":1,\"status\":\"Pending\",\"notes\":\"QA_TEST adopt1\"}"
ADOPT_ID_1=$(id_from_body)
[ -n "$ADOPT_ID_1" ] && CLEANUP_ADOPTION_IDS+=("$ADOPT_ID_1")
check "Pet now Pending" 200 GET "/pets/$AVAIL_PET_1"
check_field "Pet status Pending" ".status" "Pending"
if [ -n "$ADOPT_ID_1" ]; then
check "Cancel adoption" 200 PUT "/adoptions/$ADOPT_ID_1" "${S[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_1,\"customerId\":32,\"storeId\":1,\"status\":\"Cancelled\",\"notes\":\"QA_TEST cancelled\"}"
check "Pet back to Available" 200 GET "/pets/$AVAIL_PET_1"
check_field "Pet status Available" ".status" "Available"
fi
fi
if [ -n "$AVAIL_PET_2" ]; then
check "Staff create adoption 2" 201 POST "/adoptions" "${S[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_2,\"customerId\":33,\"storeId\":1,\"status\":\"Pending\",\"notes\":\"QA_TEST adopt2\"}"
ADOPT_ID_2=$(id_from_body)
[ -n "$ADOPT_ID_2" ] && CLEANUP_ADOPTION_IDS+=("$ADOPT_ID_2")
if [ -n "$ADOPT_ID_2" ]; then
check "Complete adoption" 200 PUT "/adoptions/$ADOPT_ID_2" "${S[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_2,\"customerId\":33,\"storeId\":1,\"status\":\"Completed\",\"notes\":\"QA_TEST completed\"}"
check "Pet now Adopted" 200 GET "/pets/$AVAIL_PET_2"
check_field "Pet status Adopted" ".status" "Adopted"
fi
fi
if [ -n "$AVAIL_PET_3" ]; then
check "Customer request adoption" 201 POST "/adoptions" "${C[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_3,\"storeId\":1,\"notes\":\"QA_TEST customer adopt\"}"
ADOPT_ID_3=$(id_from_body)
[ -n "$ADOPT_ID_3" ] && CLEANUP_ADOPTION_IDS+=("$ADOPT_ID_3")
if [ -n "$ADOPT_ID_3" ]; then
check "Cancel customer adoption" 200 PUT "/adoptions/$ADOPT_ID_3" "${C[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_3,\"storeId\":1,\"status\":\"Cancelled\",\"notes\":\"QA_TEST cust cancelled\"}"
check "Pet Available again" 200 GET "/pets/$AVAIL_PET_3"
check_field "Pet Available after cancel" ".status" "Available"
fi
check "Adopt already pending" 201 POST "/adoptions" "${S[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_3,\"customerId\":34,\"storeId\":1,\"status\":\"Pending\",\"notes\":\"QA_TEST pending block\"}"
ADOPT_BLOCK_ID=$(id_from_body)
[ -n "$ADOPT_BLOCK_ID" ] && CLEANUP_ADOPTION_IDS+=("$ADOPT_BLOCK_ID")
check "Duplicate adoption for pending pet" 400 POST "/adoptions" "${S[@]}" "${J[@]}" -d "{\"petId\":$AVAIL_PET_3,\"customerId\":35,\"storeId\":1,\"status\":\"Pending\",\"notes\":\"QA_TEST dup\"}"
fi
check "GET /adoptions (staff)" 200 GET "/adoptions" "${S[@]}"
check "GET /adoptions (customer)" 200 GET "/adoptions" "${C[@]}"
echo "--- 10. SALES ---"
check "GET /sales (admin)" 200 GET "/sales" "${A[@]}"
check "GET /sales/1" 200 GET "/sales/1" "${A[@]}"
check "GET /sales/my (customer)" 200 GET "/sales/my" "${C[@]}"
check "GET /sales (customer)" 403 GET "/sales" "${C[@]}"
check "GET /sales/999999" 404 GET "/sales/999999" "${A[@]}"
curl -s "$BASE/inventory?storeId=1" "${A[@]}" -o /tmp/qa_inv_before.json 2>/dev/null
INV_BEFORE=$(jq -r '.content[] | select(.productId == 1) | .quantity // 0' /tmp/qa_inv_before.json 2>/dev/null | head -1)
check "Staff create sale" 201 POST "/sales" "${S[@]}" "${J[@]}" -d '{"storeId":1,"customerId":32,"items":[{"productId":1,"quantity":1}],"notes":"QA_TEST sale"}'
SALE_ID=$(id_from_body)
[ -n "$SALE_ID" ] && CLEANUP_SALE_IDS+=("$SALE_ID")
if [ -n "$INV_BEFORE" ] && [ "$INV_BEFORE" != "" ] && [ "$INV_BEFORE" != "null" ]; then
curl -s "$BASE/inventory?storeId=1" "${A[@]}" -o /tmp/qa_inv_after.json 2>/dev/null
INV_AFTER=$(jq -r '.content[] | select(.productId == 1) | .quantity // 0' /tmp/qa_inv_after.json 2>/dev/null | head -1)
if [ -n "$INV_AFTER" ] && [ "$INV_AFTER" != "null" ] && [ "$((INV_BEFORE - 1))" = "$INV_AFTER" ]; then
PASS=$((PASS+1))
else
FAIL=$((FAIL+1)); echo "FAIL: Inventory decrease — before=$INV_BEFORE after=$INV_AFTER"
fi
fi
check "Sale non-existent product" 404 POST "/sales" "${S[@]}" "${J[@]}" -d '{"storeId":1,"customerId":32,"items":[{"productId":999999,"quantity":1}]}'
check "Sale zero quantity" 400 POST "/sales" "${S[@]}" "${J[@]}" -d '{"storeId":1,"customerId":32,"items":[{"productId":1,"quantity":0}]}'
check "Sale (no auth)" 401 POST "/sales" "${J[@]}" -d '{"storeId":1,"customerId":32,"items":[{"productId":1,"quantity":1}]}'
check "Sale (customer)" 403 POST "/sales" "${C[@]}" "${J[@]}" -d '{"storeId":1,"customerId":15,"items":[{"productId":1,"quantity":1}]}'
check "Staff create sale 2" 201 POST "/sales" "${S[@]}" "${J[@]}" -d '{"storeId":1,"customerId":32,"items":[{"productId":2,"quantity":1}],"notes":"QA_TEST sale2"}'
SALE_ID_2=$(id_from_body)
[ -n "$SALE_ID_2" ] && CLEANUP_SALE_IDS+=("$SALE_ID_2")
check "GET /sales filtered by store" 200 GET "/sales?storeId=1" "${A[@]}"
check "GET /sales paginated" 200 GET "/sales?page=0&size=5" "${A[@]}"
echo "--- 11. CART ---"
check "GET /cart (customer)" 200 GET "/cart?storeId=1" "${C[@]}"
check "Add cart item" 200 POST "/cart/items" "${C[@]}" "${J[@]}" -d '{"productId":1,"storeId":1,"quantity":1}'
if [ "$(jq -r '.status // empty' /tmp/qa_body.json 2>/dev/null)" = "" ]; then
check "Add cart item alt" 201 POST "/cart/items" "${C[@]}" "${J[@]}" -d '{"productId":2,"storeId":1,"quantity":1}'
fi
check "GET cart with item" 200 GET "/cart?storeId=1" "${C[@]}"
CART_SUBTOTAL=$(jq -r '.subtotal // .totalBeforeDiscount // 0' /tmp/qa_body.json 2>/dev/null)
CART_ITEM_ID=$(jq -r '.items[0].id // .items[0].cartItemId // empty' /tmp/qa_body.json 2>/dev/null)
if [ -n "$CART_ITEM_ID" ]; then
check "Update cart qty" 200 PUT "/cart/items/$CART_ITEM_ID" "${C[@]}" "${J[@]}" -d '{"quantity":2}'
check "GET cart after qty update" 200 GET "/cart?storeId=1" "${C[@]}"
fi
check "Apply coupon WELCOME10" 200 POST "/cart/coupon" "${C[@]}" "${J[@]}" -d '{"couponCode":"WELCOME10","storeId":1}'
check "GET cart with coupon" 200 GET "/cart?storeId=1" "${C[@]}"
DISCOUNT=$(jq -r '.discount // .totalDiscount // 0' /tmp/qa_body.json 2>/dev/null)
check "Remove coupon" 200 DELETE "/cart/coupon?storeId=1" "${C[@]}"
check "GET cart no coupon" 200 GET "/cart?storeId=1" "${C[@]}"
check "Apply points" 200 POST "/cart/points" "${C[@]}" "${J[@]}" -d '{"points":10,"storeId":1}'
check "Remove points" 200 DELETE "/cart/points?storeId=1" "${C[@]}"
if [ -n "$CART_ITEM_ID" ]; then
check "Remove cart item" 200 DELETE "/cart/items/$CART_ITEM_ID" "${C[@]}"
fi
check "Clear cart" 200 DELETE "/cart?storeId=1" "${C[@]}"
check "Add item qty 0" 400 POST "/cart/items" "${C[@]}" "${J[@]}" -d '{"productId":1,"storeId":1,"quantity":0}'
check "Apply invalid coupon" 400 POST "/cart/coupon" "${C[@]}" "${J[@]}" -d '{"couponCode":"FAKECOUPON999","storeId":1}'
check "Checkout empty cart" 400 POST "/cart/checkout" "${C[@]}" "${J[@]}" -d '{"storeId":1}'
check "Add item for checkout test" 200 POST "/cart/items" "${C[@]}" "${J[@]}" -d '{"productId":1,"storeId":1,"quantity":1}'
check "Checkout" 200 POST "/cart/checkout" "${C[@]}" "${J[@]}" -d '{"storeId":1}'
CHECKOUT_SALE_ID=$(jq -r '.id // .saleId // empty' /tmp/qa_body.json 2>/dev/null)
[ -n "$CHECKOUT_SALE_ID" ] && CLEANUP_SALE_IDS+=("$CHECKOUT_SALE_ID")
check "Clear cart final" 200 DELETE "/cart?storeId=1" "${C[@]}"
echo "--- 12. REFUNDS ---"
check "GET /refunds (admin)" 200 GET "/refunds" "${A[@]}"
check "GET /refunds (customer)" 200 GET "/refunds" "${C[@]}"
CUST_SALE_ID=""
if [ -n "$CHECKOUT_SALE_ID" ]; then
CUST_SALE_ID="$CHECKOUT_SALE_ID"
else
curl -s "$BASE/sales/my" "${C[@]}" -o /tmp/qa_my_sales.json 2>/dev/null
CUST_SALE_ID=$(jq -r '.content[0].id // .[0].id // empty' /tmp/qa_my_sales.json 2>/dev/null)
fi
if [ -n "$CUST_SALE_ID" ]; then
check "Customer create refund" 201 POST "/refunds" "${C[@]}" "${J[@]}" -d "{\"saleId\":$CUST_SALE_ID,\"reason\":\"QA_TEST refund reason\"}"
REFUND_ID=$(id_from_body)
if [ -n "$REFUND_ID" ]; then
check "Staff approve refund" 200 PUT "/refunds/$REFUND_ID" "${S[@]}" "${J[@]}" -d "{\"status\":\"Approved\",\"saleId\":$CUST_SALE_ID,\"reason\":\"QA_TEST approved\"}"
check_field "Refund approved" ".status" "Approved"
fi
fi
check "Refund non-existent sale" 404 POST "/refunds" "${C[@]}" "${J[@]}" -d '{"saleId":999999,"reason":"QA_TEST nope"}'
check "Refund missing reason" 400 POST "/refunds" "${C[@]}" "${J[@]}" -d '{"saleId":1}'
check "GET /refunds (staff)" 200 GET "/refunds" "${S[@]}"
check "GET /refunds paginated" 200 GET "/refunds?page=0&size=5" "${A[@]}"
echo "--- 13. COUPONS ---"
check "GET /coupons (admin)" 200 GET "/coupons" "${A[@]}"
check "GET /coupons/1" 200 GET "/coupons/1" "${A[@]}"
check "GET /coupons/code/WELCOME10" 200 GET "/coupons/code/WELCOME10" "${A[@]}"
check "GET /coupons (customer)" 403 GET "/coupons" "${C[@]}"
check "Create coupon" 201 POST "/coupons" "${A[@]}" "${J[@]}" -d '{"code":"QA_TEST_CPN","discountPercent":10,"description":"QA test coupon","expiryDate":"2028-12-31","maxUses":100}'
CPN_ID=$(id_from_body)
[ -n "$CPN_ID" ] && CLEANUP_COUPON_IDS+=("$CPN_ID")
check_field "Coupon code" ".code" "QA_TEST_CPN"
if [ -n "$CPN_ID" ]; then
check "Update coupon" 200 PUT "/coupons/$CPN_ID" "${A[@]}" "${J[@]}" -d "{\"code\":\"QA_TEST_CPN\",\"discountPercent\":15,\"description\":\"updated\",\"expiryDate\":\"2028-12-31\",\"maxUses\":50}"
fi
check "Create coupon to delete" 201 POST "/coupons" "${A[@]}" "${J[@]}" -d '{"code":"QA_TEST_DEL","discountPercent":5,"description":"del","expiryDate":"2028-12-31","maxUses":10}'
DEL_CPN_ID=$(id_from_body)
if [ -n "$DEL_CPN_ID" ]; then
check "Delete coupon" 200 DELETE "/coupons/$DEL_CPN_ID" "${A[@]}"
fi
check "Coupon 100% discount" 400 POST "/coupons" "${A[@]}" "${J[@]}" -d '{"code":"QA_TEST_100","discountPercent":100,"description":"bad","expiryDate":"2028-12-31","maxUses":1}'
check "Coupon 150% discount" 400 POST "/coupons" "${A[@]}" "${J[@]}" -d '{"code":"QA_TEST_150","discountPercent":150,"description":"bad","expiryDate":"2028-12-31","maxUses":1}'
check "Coupon 99.99%" 201 POST "/coupons" "${A[@]}" "${J[@]}" -d '{"code":"QA_TEST_99","discountPercent":99.99,"description":"boundary","expiryDate":"2028-12-31","maxUses":1}'
BOUNDARY_CPN_ID=$(id_from_body)
[ -n "$BOUNDARY_CPN_ID" ] && CLEANUP_COUPON_IDS+=("$BOUNDARY_CPN_ID")
check "Duplicate coupon code" 400 POST "/coupons" "${A[@]}" "${J[@]}" -d '{"code":"WELCOME10","discountPercent":5,"description":"dup","expiryDate":"2028-12-31","maxUses":1}'
check "Create coupon (customer)" 403 POST "/coupons" "${C[@]}" "${J[@]}" -d '{"code":"QA_TEST_NOPE","discountPercent":5,"description":"nope","expiryDate":"2028-12-31","maxUses":1}'
echo "--- 14. SUPPLIERS / PRODUCT-SUPPLIERS / INVENTORY / PURCHASE-ORDERS ---"
check "GET /suppliers (admin)" 200 GET "/suppliers" "${A[@]}"
check "GET /suppliers/1" 200 GET "/suppliers/1" "${A[@]}"
check "GET /suppliers (customer)" 403 GET "/suppliers" "${C[@]}"
check "Create supplier" 201 POST "/suppliers" "${A[@]}" "${J[@]}" -d '{"supplierName":"QA_TEST_Supplier","contactName":"QA Contact","email":"qa_supplier@test.com","phone":"5553333333","address":"100 Supply Rd"}'
SUPP_ID=$(id_from_body)
[ -n "$SUPP_ID" ] && CLEANUP_SUPPLIER_IDS+=("$SUPP_ID")
if [ -n "$SUPP_ID" ]; then
check "Update supplier" 200 PUT "/suppliers/$SUPP_ID" "${A[@]}" "${J[@]}" -d "{\"supplierName\":\"QA_TEST_SuppUpd\",\"contactName\":\"QA Updated\",\"email\":\"qa_supp_upd@test.com\",\"phone\":\"5553333334\",\"address\":\"101 Supply Rd\"}"
fi
check "Create supplier to delete" 201 POST "/suppliers" "${A[@]}" "${J[@]}" -d '{"supplierName":"QA_TEST_SuppDel","contactName":"Del","email":"del@test.com","phone":"5550000000","address":"x"}'
DEL_SUPP_ID=$(id_from_body)
if [ -n "$DEL_SUPP_ID" ]; then
check "Delete supplier" 200 DELETE "/suppliers/$DEL_SUPP_ID" "${A[@]}"
fi
check "GET /product-suppliers (admin)" 200 GET "/product-suppliers" "${A[@]}"
check "GET /inventory (admin)" 200 GET "/inventory" "${A[@]}"
check "GET /inventory/1" 200 GET "/inventory/1" "${A[@]}"
check "GET /purchase-orders (admin)" 200 GET "/purchase-orders" "${A[@]}"
check "GET /purchase-orders (customer)" 403 GET "/purchase-orders" "${C[@]}"
check "GET /inventory (customer)" 403 GET "/inventory" "${C[@]}"
echo "--- 15. CHAT ---"
check "GET /chat/conversations (customer)" 200 GET "/chat/conversations" "${C[@]}"
check "Create conversation" 201 POST "/chat/conversations" "${C[@]}" "${J[@]}" -d '{}'
CONV_ID=$(id_from_body)
[ -n "$CONV_ID" ] && CLEANUP_CONV_IDS+=("$CONV_ID")
if [ -n "$CONV_ID" ]; then
check "Send message" 201 POST "/chat/conversations/$CONV_ID/messages" "${C[@]}" "${J[@]}" -d '{"content":"Hello from QA_TEST"}'
check "Send empty message" 400 POST "/chat/conversations/$CONV_ID/messages" "${C[@]}" "${J[@]}" -d '{"content":""}'
check "Send null content" 400 POST "/chat/conversations/$CONV_ID/messages" "${C[@]}" "${J[@]}" -d '{}'
check "GET messages" 200 GET "/chat/conversations/$CONV_ID/messages" "${C[@]}"
check "Request human takeover" 200 POST "/chat/conversations/$CONV_ID/takeover" "${C[@]}" "${J[@]}" -d '{}'
check "Staff view conversations" 200 GET "/chat/conversations" "${S[@]}"
check "Staff send reply" 201 POST "/chat/conversations/$CONV_ID/messages" "${S[@]}" "${J[@]}" -d '{"content":"Staff reply QA_TEST"}'
check "GET conversation detail" 200 GET "/chat/conversations/$CONV_ID" "${S[@]}"
check "Close conversation" 200 PUT "/chat/conversations/$CONV_ID/close" "${S[@]}" "${J[@]}" -d '{}'
check "GET closed conversation" 200 GET "/chat/conversations/$CONV_ID" "${C[@]}"
check_field "Conversation closed" ".status" "CLOSED"
check "Send to closed" 400 POST "/chat/conversations/$CONV_ID/messages" "${C[@]}" "${J[@]}" -d '{"content":"should fail"}'
fi
check "GET /chat/conversations (admin)" 200 GET "/chat/conversations" "${A[@]}"
check "Create conv 2" 201 POST "/chat/conversations" "${C[@]}" "${J[@]}" -d '{}'
CONV_ID_2=$(id_from_body)
[ -n "$CONV_ID_2" ] && CLEANUP_CONV_IDS+=("$CONV_ID_2")
check "Send message conv 2" 201 POST "/chat/conversations/$CONV_ID_2/messages" "${C[@]}" "${J[@]}" -d '{"content":"QA_TEST second conv"}'
echo "--- 16. ACTIVITY LOGS / ANALYTICS / DROPDOWNS / HEALTH ---"
check "GET /health" 200 GET "/health"
check "GET /activity-logs (admin)" 200 GET "/activity-logs" "${A[@]}"
check "GET /activity-logs (customer)" 403 GET "/activity-logs" "${C[@]}"
check "GET /analytics/dashboard (admin)" 200 GET "/analytics/dashboard" "${A[@]}"
check "GET /analytics/dashboard (customer)" 403 GET "/analytics/dashboard" "${C[@]}"
check "GET /analytics/dashboard?days=1" 200 GET "/analytics/dashboard?days=1" "${A[@]}"
for ep in "dropdowns/pets" "dropdowns/services" "dropdowns/products" "dropdowns/categories" \
"dropdowns/product-categories" "dropdowns/pet-species" "dropdowns/pet-breeds" \
"dropdowns/stores" "dropdowns/customers" "dropdowns/adoption-pets" \
"dropdowns/employees" "dropdowns/suppliers"; do
check "GET /$ep" 200 GET "/$ep" "${A[@]}"
done
check "GET /dropdowns/stores/1/employees" 200 GET "/dropdowns/stores/1/employees" "${A[@]}"
check "GET /dropdowns/customers/32/pets" 200 GET "/dropdowns/customers/32/pets" "${A[@]}"
echo "--- 17. CROSS-ENTITY ---"
curl -s "$BASE/inventory?storeId=1" "${A[@]}" -o /tmp/qa_cross_inv1.json 2>/dev/null
CROSS_INV_BEFORE=$(jq -r '.content[] | select(.productId == 2) | .quantity // 0' /tmp/qa_cross_inv1.json 2>/dev/null | head -1)
check "Cross: create sale" 201 POST "/sales" "${S[@]}" "${J[@]}" -d '{"storeId":1,"customerId":32,"items":[{"productId":2,"quantity":1}],"notes":"QA_TEST_CROSS"}'
CROSS_SALE_ID=$(id_from_body)
[ -n "$CROSS_SALE_ID" ] && CLEANUP_SALE_IDS+=("$CROSS_SALE_ID")
if [ -n "$CROSS_INV_BEFORE" ] && [ "$CROSS_INV_BEFORE" != "null" ] && [ "$CROSS_INV_BEFORE" != "" ]; then
curl -s "$BASE/inventory?storeId=1" "${A[@]}" -o /tmp/qa_cross_inv2.json 2>/dev/null
CROSS_INV_AFTER=$(jq -r '.content[] | select(.productId == 2) | .quantity // 0' /tmp/qa_cross_inv2.json 2>/dev/null | head -1)
if [ "$((CROSS_INV_BEFORE - 1))" = "$CROSS_INV_AFTER" ]; then
PASS=$((PASS+1))
else
FAIL=$((FAIL+1)); echo "FAIL: Cross inventory decrease — before=$CROSS_INV_BEFORE after=$CROSS_INV_AFTER"
fi
fi
if [ -n "$CROSS_SALE_ID" ]; then
check "Cross: create refund" 201 POST "/refunds" "${C[@]}" "${J[@]}" -d "{\"saleId\":$CROSS_SALE_ID,\"reason\":\"QA_TEST cross refund\"}"
CROSS_REFUND_ID=$(id_from_body)
if [ -n "$CROSS_REFUND_ID" ]; then
check "Cross: approve refund" 200 PUT "/refunds/$CROSS_REFUND_ID" "${S[@]}" "${J[@]}" -d "{\"status\":\"Approved\",\"saleId\":$CROSS_SALE_ID,\"reason\":\"QA_TEST cross approved\"}"
curl -s "$BASE/inventory?storeId=1" "${A[@]}" -o /tmp/qa_cross_inv3.json 2>/dev/null
CROSS_INV_RESTORED=$(jq -r '.content[] | select(.productId == 2) | .quantity // 0' /tmp/qa_cross_inv3.json 2>/dev/null | head -1)
if [ -n "$CROSS_INV_RESTORED" ] && [ "$CROSS_INV_RESTORED" = "$CROSS_INV_BEFORE" ]; then
PASS=$((PASS+1))
else
FAIL=$((FAIL+1)); echo "FAIL: Cross inventory restore — expected=$CROSS_INV_BEFORE got=$CROSS_INV_RESTORED"
fi
fi
fi
curl -s "$BASE/pets?status=Available&size=5&page=1" "${A[@]}" -o /tmp/qa_cross_avail.json 2>/dev/null
CROSS_PET=$(jq -r '.content[0].id // empty' /tmp/qa_cross_avail.json 2>/dev/null)
if [ -n "$CROSS_PET" ]; then
check "Cross: create adoption Pending" 201 POST "/adoptions" "${S[@]}" "${J[@]}" -d "{\"petId\":$CROSS_PET,\"customerId\":35,\"storeId\":1,\"status\":\"Pending\",\"notes\":\"QA_TEST cross adopt\"}"
CROSS_ADOPT_ID=$(id_from_body)
[ -n "$CROSS_ADOPT_ID" ] && CLEANUP_ADOPTION_IDS+=("$CROSS_ADOPT_ID")
check "Cross: pet is Pending" 200 GET "/pets/$CROSS_PET"
check_field "Cross pet Pending" ".status" "Pending"
if [ -n "$CROSS_ADOPT_ID" ]; then
check "Cross: complete adoption" 200 PUT "/adoptions/$CROSS_ADOPT_ID" "${S[@]}" "${J[@]}" -d "{\"petId\":$CROSS_PET,\"customerId\":35,\"storeId\":1,\"status\":\"Completed\",\"notes\":\"QA_TEST cross completed\"}"
check "Cross: pet is Adopted" 200 GET "/pets/$CROSS_PET"
check_field "Cross pet Adopted" ".status" "Adopted"
fi
fi
curl -s "$BASE/pets?status=Available&size=5&page=2" "${A[@]}" -o /tmp/qa_cross_avail2.json 2>/dev/null
CROSS_PET_2=$(jq -r '.content[0].id // empty' /tmp/qa_cross_avail2.json 2>/dev/null)
if [ -n "$CROSS_PET_2" ]; then
check "Cross: adopt then cancel" 201 POST "/adoptions" "${S[@]}" "${J[@]}" -d "{\"petId\":$CROSS_PET_2,\"customerId\":36,\"storeId\":1,\"status\":\"Pending\",\"notes\":\"QA_TEST cross cancel\"}"
CROSS_ADOPT_ID_2=$(id_from_body)
[ -n "$CROSS_ADOPT_ID_2" ] && CLEANUP_ADOPTION_IDS+=("$CROSS_ADOPT_ID_2")
if [ -n "$CROSS_ADOPT_ID_2" ]; then
check "Cross: cancel adoption" 200 PUT "/adoptions/$CROSS_ADOPT_ID_2" "${S[@]}" "${J[@]}" -d "{\"petId\":$CROSS_PET_2,\"customerId\":36,\"storeId\":1,\"status\":\"Cancelled\",\"notes\":\"QA_TEST cross cancelled\"}"
check "Cross: pet Available" 200 GET "/pets/$CROSS_PET_2"
check_field "Cross pet Available" ".status" "Available"
fi
fi
echo ""
echo "--- CLEANUP ---"
for id in "${CLEANUP_CONV_IDS[@]}"; do
curl -s -o /dev/null -X PUT "$BASE/chat/conversations/$id/close" "${S[@]}" "${J[@]}" -d '{}' 2>/dev/null
done
for id in "${CLEANUP_ADOPTION_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/adoptions/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_APPT_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/appointments/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_SALE_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/sales/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_MYPET_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/my-pets/$id" "${C[@]}" 2>/dev/null
done
for id in "${CLEANUP_PET_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/pets/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_SERVICE_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/services/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_PRODUCT_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/products/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_CATEGORY_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/categories/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_STORE_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/stores/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_COUPON_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/coupons/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_SUPPLIER_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/suppliers/$id" "${A[@]}" 2>/dev/null
done
for id in "${CLEANUP_USER_IDS[@]}"; do
curl -s -o /dev/null -X DELETE "$BASE/users/$id" "${A[@]}" 2>/dev/null
done
curl -s -o /dev/null -X DELETE "$BASE/users" "${A[@]}" -G -d "username=testuser_qa" 2>/dev/null
rm -f /tmp/qa_body.json /tmp/qa_avail.json /tmp/qa_inv_before.json /tmp/qa_inv_after.json
rm -f /tmp/qa_my_sales.json /tmp/qa_cross_inv1.json /tmp/qa_cross_inv2.json /tmp/qa_cross_inv3.json
rm -f /tmp/qa_cross_avail.json /tmp/qa_cross_avail2.json
echo ""
echo "========================================="
echo "RESULTS: $PASS passed, $FAIL failed"
echo "========================================="