add tests, 05 is broken
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
TOKEN1=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzc0ODYzMTYxLCJpYXQiOjE3NzQ4NTk1NjF9.Xc2AdvB-OppMH_Xbudlf7roy81mLJW_OkZwriVP6tck
|
||||||
|
USER1_ID=1
|
||||||
|
TOKEN2=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyIiwiZXhwIjoxNzc0ODYzMTYxLCJpYXQiOjE3NzQ4NTk1NjF9.EOY84pt8UUrIsGWAVgVUDUJdGxdll6Db-lFFKw4HeA4
|
||||||
|
USER2_ID=2
|
||||||
|
GROUP_ID=1
|
||||||
Executable
+22
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Create two user accounts
|
||||||
|
source "$(dirname "$0")/config.sh"
|
||||||
|
|
||||||
|
echo "=== Creating account: $USER1_NAME ==="
|
||||||
|
RESP1=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/new/client" \
|
||||||
|
-d "username=$USER1_NAME" \
|
||||||
|
-d "password=$USER1_PASS" \
|
||||||
|
-d "color=$USER1_COLOR")
|
||||||
|
BODY1=$(echo "$RESP1" | head -1)
|
||||||
|
CODE1=$(echo "$RESP1" | tail -1)
|
||||||
|
echo "Response: $BODY1 (HTTP $CODE1)"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Creating account: $USER2_NAME ==="
|
||||||
|
RESP2=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/new/client" \
|
||||||
|
-d "username=$USER2_NAME" \
|
||||||
|
-d "password=$USER2_PASS" \
|
||||||
|
-d "color=$USER2_COLOR")
|
||||||
|
BODY2=$(echo "$RESP2" | head -1)
|
||||||
|
CODE2=$(echo "$RESP2" | tail -1)
|
||||||
|
echo "Response: $BODY2 (HTTP $CODE2)"
|
||||||
Executable
+26
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Login both users and save tokens
|
||||||
|
source "$(dirname "$0")/config.sh"
|
||||||
|
|
||||||
|
echo "=== Logging in as $USER1_NAME ==="
|
||||||
|
TOKEN1=$(curl -s -X POST "$BASE_URL/new/token" \
|
||||||
|
-d "username=$USER1_NAME" \
|
||||||
|
-d "password=$USER1_PASS")
|
||||||
|
echo "Token1: $TOKEN1"
|
||||||
|
save_state "TOKEN1" "$TOKEN1"
|
||||||
|
|
||||||
|
USER1_ID=$(decode_jwt_sub "$TOKEN1")
|
||||||
|
echo "User1 ID: $USER1_ID"
|
||||||
|
save_state "USER1_ID" "$USER1_ID"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Logging in as $USER2_NAME ==="
|
||||||
|
TOKEN2=$(curl -s -X POST "$BASE_URL/new/token" \
|
||||||
|
-d "username=$USER2_NAME" \
|
||||||
|
-d "password=$USER2_PASS")
|
||||||
|
echo "Token2: $TOKEN2"
|
||||||
|
save_state "TOKEN2" "$TOKEN2"
|
||||||
|
|
||||||
|
USER2_ID=$(decode_jwt_sub "$TOKEN2")
|
||||||
|
echo "User2 ID: $USER2_ID"
|
||||||
|
save_state "USER2_ID" "$USER2_ID"
|
||||||
Executable
+19
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Create a group as user1
|
||||||
|
source "$(dirname "$0")/config.sh"
|
||||||
|
|
||||||
|
TOKEN1=$(load_state "TOKEN1")
|
||||||
|
if [[ -z "$TOKEN1" ]]; then
|
||||||
|
echo "ERROR: No token found. Run 02_login.sh first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Creating group: $GROUP_NAME ==="
|
||||||
|
# Pipe curl directly to od to avoid null bytes being lost in bash variables
|
||||||
|
GROUP_ID=$(curl -s -X POST "$BASE_URL/new/group" \
|
||||||
|
-d "token=$TOKEN1" \
|
||||||
|
-d "name=$GROUP_NAME" \
|
||||||
|
-d "color=$GROUP_COLOR" \
|
||||||
|
| od -An -tu4 -N4 --endian=big | tr -d ' ')
|
||||||
|
echo "Group ID: $GROUP_ID"
|
||||||
|
save_state "GROUP_ID" "$GROUP_ID"
|
||||||
Executable
+24
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Add user2 to the group (user1 is owner)
|
||||||
|
source "$(dirname "$0")/config.sh"
|
||||||
|
|
||||||
|
TOKEN1=$(load_state "TOKEN1")
|
||||||
|
GROUP_ID=$(load_state "GROUP_ID")
|
||||||
|
USER2_ID=$(load_state "USER2_ID")
|
||||||
|
|
||||||
|
if [[ -z "$TOKEN1" || -z "$GROUP_ID" || -z "$USER2_ID" ]]; then
|
||||||
|
echo "ERROR: Missing state. Run previous scripts first."
|
||||||
|
echo " TOKEN1=$TOKEN1"
|
||||||
|
echo " GROUP_ID=$GROUP_ID"
|
||||||
|
echo " USER2_ID=$USER2_ID"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Adding user2 (ID: $USER2_ID) to group $GROUP_ID ==="
|
||||||
|
RESP=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/mod/group/addclients" \
|
||||||
|
-d "token=$TOKEN1" \
|
||||||
|
-d "groupid=$GROUP_ID" \
|
||||||
|
-d "users=$USER2_ID")
|
||||||
|
BODY=$(echo "$RESP" | head -1)
|
||||||
|
CODE=$(echo "$RESP" | tail -1)
|
||||||
|
echo "Response: $BODY (HTTP $CODE)"
|
||||||
Executable
+68
@@ -0,0 +1,68 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Send a message on the group via WebSocket (requires websocat)
|
||||||
|
source "$(dirname "$0")/config.sh"
|
||||||
|
|
||||||
|
TOKEN1=$(load_state "TOKEN1")
|
||||||
|
GROUP_ID=$(load_state "GROUP_ID")
|
||||||
|
|
||||||
|
echo "=== Debug: loaded state ==="
|
||||||
|
echo " TOKEN1: ${TOKEN1:0:20}..."
|
||||||
|
echo " GROUP_ID: $GROUP_ID"
|
||||||
|
|
||||||
|
if [[ -z "$TOKEN1" || -z "$GROUP_ID" ]]; then
|
||||||
|
echo "ERROR: Missing state. Run previous scripts first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v websocat &>/dev/null; then
|
||||||
|
echo "ERROR: websocat is not installed."
|
||||||
|
echo "Install it with: cargo install websocat"
|
||||||
|
echo " or: pacman -S websocat"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
AUTH_MSG="{\"token\":\"$TOKEN1\"}"
|
||||||
|
CHAT_MSG="{\"subject\":$GROUP_ID,\"content\":\"Hello from user1!\"}"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Sending message to group $GROUP_ID as user1 ==="
|
||||||
|
echo " Auth payload: $AUTH_MSG"
|
||||||
|
echo " Chat payload: $CHAT_MSG"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "[*] Connecting to ws://localhost:8080/ws ..."
|
||||||
|
|
||||||
|
# Use a temp file to capture all ws output
|
||||||
|
WS_OUT=$(mktemp)
|
||||||
|
trap "rm -f $WS_OUT" EXIT
|
||||||
|
|
||||||
|
(
|
||||||
|
echo "[>] Sending auth message..." >&2
|
||||||
|
echo "$AUTH_MSG"
|
||||||
|
sleep 2
|
||||||
|
echo "[>] Auth sent. Sending chat message..." >&2
|
||||||
|
echo "$CHAT_MSG"
|
||||||
|
sleep 2
|
||||||
|
echo "[>] Chat message sent. Closing..." >&2
|
||||||
|
) | websocat -v ws://localhost:8080/ws 2>&1 | tee "$WS_OUT" &
|
||||||
|
|
||||||
|
WS_PID=$!
|
||||||
|
|
||||||
|
# Wait for websocat to finish or timeout after 10s
|
||||||
|
WAITED=0
|
||||||
|
while kill -0 $WS_PID 2>/dev/null && [[ $WAITED -lt 10 ]]; do
|
||||||
|
sleep 1
|
||||||
|
WAITED=$((WAITED + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if kill -0 $WS_PID 2>/dev/null; then
|
||||||
|
echo "[!] websocat still running after ${WAITED}s, killing..."
|
||||||
|
kill $WS_PID 2>/dev/null
|
||||||
|
wait $WS_PID 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== WebSocket output ==="
|
||||||
|
cat "$WS_OUT"
|
||||||
|
echo ""
|
||||||
|
echo "=== Done ==="
|
||||||
Executable
+12
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Clean up state file left by test scripts
|
||||||
|
DIR="$(dirname "$0")"
|
||||||
|
STATE_FILE="$DIR/.state"
|
||||||
|
|
||||||
|
if [[ -f "$STATE_FILE" ]]; then
|
||||||
|
echo "Removing $STATE_FILE"
|
||||||
|
rm "$STATE_FILE"
|
||||||
|
echo "Done."
|
||||||
|
else
|
||||||
|
echo "Nothing to clean up."
|
||||||
|
fi
|
||||||
Executable
+38
@@ -0,0 +1,38 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Shared config for all test scripts
|
||||||
|
|
||||||
|
BASE_URL="http://localhost:8080"
|
||||||
|
|
||||||
|
USER1_NAME="user_one"
|
||||||
|
USER1_PASS="password1234"
|
||||||
|
USER1_COLOR="255,0,0"
|
||||||
|
|
||||||
|
USER2_NAME="user_two"
|
||||||
|
USER2_PASS="password5678"
|
||||||
|
USER2_COLOR="0,0,255"
|
||||||
|
|
||||||
|
GROUP_NAME="TestGroup"
|
||||||
|
GROUP_COLOR="0,255,0"
|
||||||
|
|
||||||
|
# File to persist state between scripts
|
||||||
|
STATE_FILE="$(dirname "$0")/.state"
|
||||||
|
|
||||||
|
save_state() {
|
||||||
|
local key="$1" value="$2"
|
||||||
|
touch "$STATE_FILE"
|
||||||
|
# Remove existing key if present, then append
|
||||||
|
sed -i "/^${key}=/d" "$STATE_FILE"
|
||||||
|
echo "${key}=${value}" >> "$STATE_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
load_state() {
|
||||||
|
local key="$1"
|
||||||
|
if [[ -f "$STATE_FILE" ]]; then
|
||||||
|
grep "^${key}=" "$STATE_FILE" | cut -d'=' -f2-
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
decode_jwt_sub() {
|
||||||
|
local token="$1"
|
||||||
|
echo "$token" | cut -d'.' -f2 | base64 -d 2>/dev/null | python3 -c "import sys,json; print(json.load(sys.stdin)['sub'])"
|
||||||
|
}
|
||||||
Executable
+43
@@ -0,0 +1,43 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Run the full test flow end-to-end
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DIR="$(dirname "$0")"
|
||||||
|
|
||||||
|
# Clean previous state
|
||||||
|
rm -f "$DIR/.state"
|
||||||
|
|
||||||
|
echo "============================="
|
||||||
|
echo " Step 1: Create accounts"
|
||||||
|
echo "============================="
|
||||||
|
bash "$DIR/01_create_accounts.sh"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "============================="
|
||||||
|
echo " Step 2: Login"
|
||||||
|
echo "============================="
|
||||||
|
bash "$DIR/02_login.sh"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "============================="
|
||||||
|
echo " Step 3: Create group"
|
||||||
|
echo "============================="
|
||||||
|
bash "$DIR/03_create_group.sh"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "============================="
|
||||||
|
echo " Step 4: Add user2 to group"
|
||||||
|
echo "============================="
|
||||||
|
bash "$DIR/04_add_user_to_group.sh"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "============================="
|
||||||
|
echo " Step 5: Send message"
|
||||||
|
echo "============================="
|
||||||
|
bash "$DIR/05_send_message.sh"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "============================="
|
||||||
|
echo " Cleanup"
|
||||||
|
echo "============================="
|
||||||
|
bash "$DIR/cleanup.sh"
|
||||||
+22
-5
@@ -146,12 +146,29 @@ func handleUnauthenticatedMessage(ctx context.Context, client *Client, clientMes
|
|||||||
|
|
||||||
clientFromCache, err := CacheGetClientById(clientId)
|
clientFromCache, err := CacheGetClientById(clientId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var msg = map[string]any{
|
// Not in cache — load from database
|
||||||
"from": "server",
|
dbClient := &Client{Id: clientId}
|
||||||
"error": "invalid token",
|
err = DbSetClientByIdWithoutGroups(ctx, dbClient)
|
||||||
|
if err != nil {
|
||||||
|
var msg = map[string]any{
|
||||||
|
"from": "server",
|
||||||
|
"error": "invalid client data",
|
||||||
|
}
|
||||||
|
sendMessageCloseIfTimeout(client, &msg)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
sendMessageCloseIfTimeout(client, &msg)
|
err = DbSetClientGroups(ctx, dbClient)
|
||||||
return false
|
if err != nil {
|
||||||
|
var msg = map[string]any{
|
||||||
|
"from": "server",
|
||||||
|
"error": "invalid client data",
|
||||||
|
}
|
||||||
|
sendMessageCloseIfTimeout(client, &msg)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
dbClient.WsConn = client.WsConn
|
||||||
|
CacheSaveClient(dbClient)
|
||||||
|
clientFromCache = dbClient
|
||||||
}
|
}
|
||||||
|
|
||||||
*client = *clientFromCache
|
*client = *clientFromCache
|
||||||
|
|||||||
Reference in New Issue
Block a user