206 lines
6.2 KiB
Bash
206 lines
6.2 KiB
Bash
#!/bin/bash
|
||
|
||
# Sales Chat Plugin 集成测试
|
||
# 测试业务闭环:创建邀请 → 用户加入 → 统计更新
|
||
|
||
set -e
|
||
|
||
BASE_URL="${BASE_URL:-http://localhost:11000}"
|
||
API_URL="$BASE_URL/api/plugin/com.msgbyte.saleschat"
|
||
|
||
echo "🧪 Sales Chat Plugin 集成测试"
|
||
echo "================================"
|
||
echo "API URL: $API_URL"
|
||
echo ""
|
||
|
||
# 颜色定义
|
||
GREEN='\033[0;32m'
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 测试计数器
|
||
TOTAL_TESTS=0
|
||
PASSED_TESTS=0
|
||
FAILED_TESTS=0
|
||
|
||
# 测试函数
|
||
test_case() {
|
||
local name="$1"
|
||
local cmd="$2"
|
||
|
||
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
||
echo -n "测试 $TOTAL_TESTS: $name ... "
|
||
|
||
if eval "$cmd" > /tmp/test_output.txt 2>&1; then
|
||
echo -e "${GREEN}✓ PASS${NC}"
|
||
PASSED_TESTS=$((PASSED_TESTS + 1))
|
||
else
|
||
echo -e "${RED}✗ FAIL${NC}"
|
||
FAILED_TESTS=$((FAILED_TESTS + 1))
|
||
echo " 错误信息:"
|
||
cat /tmp/test_output.txt | sed 's/^/ /'
|
||
fi
|
||
}
|
||
|
||
# 等待服务启动
|
||
wait_for_service() {
|
||
echo -n "等待服务启动..."
|
||
for i in {1..30}; do
|
||
if curl -s "$BASE_URL/health" > /dev/null 2>&1; then
|
||
echo -e " ${GREEN}✓${NC}"
|
||
return 0
|
||
fi
|
||
sleep 1
|
||
echo -n "."
|
||
done
|
||
echo -e " ${RED}✗${NC}"
|
||
echo "服务未启动"
|
||
exit 1
|
||
}
|
||
|
||
# 主测试流程
|
||
main() {
|
||
# 1. 健康检查
|
||
echo ""
|
||
echo "📋 Phase 1: 健康检查"
|
||
echo "-------------------"
|
||
wait_for_service
|
||
|
||
test_case "插件加载状态" \
|
||
"curl -s '$BASE_URL/api/plugin/list' | grep -q 'com.msgbyte.saleschat'"
|
||
|
||
# 2. 用户认证
|
||
echo ""
|
||
echo "📋 Phase 2: 用户认证"
|
||
echo "-------------------"
|
||
|
||
# 登录获取 Token
|
||
TOKEN=$(curl -s -X POST "$BASE_URL/api/user/login" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"admin","password":"admin123"}' | jq -r '.data.token')
|
||
|
||
if [ -z "$TOKEN" ] || [ "$TOKEN" = "null" ]; then
|
||
echo -e "${RED}✗ 无法获取认证 Token${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
test_case "用户登录" "[ -n '$TOKEN' ] && [ '$TOKEN' != 'null' ]"
|
||
|
||
# 3. 邀请管理
|
||
echo ""
|
||
echo "📋 Phase 3: 邀请管理"
|
||
echo "-------------------"
|
||
|
||
# 创建邀请
|
||
INVITE_RESPONSE=$(curl -s -X POST "$API_URL/invite/create" \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer $TOKEN" \
|
||
-d '{"groupId":"test-group","expiresIn":7}')
|
||
|
||
INVITE_CODE=$(echo "$INVITE_RESPONSE" | jq -r '.code')
|
||
|
||
test_case "创建邀请" "[ -n '$INVITE_CODE' ] && [ '$INVITE_CODE' != 'null' ]"
|
||
|
||
# 获取邀请列表
|
||
test_case "获取我的邀请列表" \
|
||
"curl -s '$API_URL/invite/my' -H 'Authorization: Bearer $TOKEN' | jq -e '. | length > 0'"
|
||
|
||
# 获取邀请详情
|
||
test_case "获取邀请详情" \
|
||
"curl -s '$API_URL/invite/$INVITE_CODE' | jq -e '.code == \"$INVITE_CODE\"'"
|
||
|
||
# 获取邀请统计
|
||
test_case "获取邀请统计" \
|
||
"curl -s '$API_URL/invite/$INVITE_CODE/stats' -H 'Authorization: Bearer $TOKEN' | jq -e '.stats'"
|
||
|
||
# 4. 统计功能
|
||
echo ""
|
||
echo "📋 Phase 4: 统计功能"
|
||
echo "-------------------"
|
||
|
||
test_case "获取我的统计" \
|
||
"curl -s '$API_URL/stats/my' -H 'Authorization: Bearer $TOKEN' | jq -e '.total'"
|
||
|
||
test_case "获取排行榜" \
|
||
"curl -s '$API_URL/stats/ranking' -H 'Authorization: Bearer $TOKEN' | jq -e '. | length >= 0'"
|
||
|
||
# 5. 管理功能(需要管理员权限)
|
||
echo ""
|
||
echo "📋 Phase 5: 管理功能"
|
||
echo "-------------------"
|
||
|
||
test_case "获取用户列表" \
|
||
"curl -s '$API_URL/admin/users' -H 'Authorization: Bearer $TOKEN' | jq -e '. | length >= 0'"
|
||
|
||
test_case "获取群组列表" \
|
||
"curl -s '$API_URL/admin/groups' -H 'Authorization: Bearer $TOKEN' | jq -e '. | length >= 0'"
|
||
|
||
# 6. 业务闭环测试
|
||
echo ""
|
||
echo "📋 Phase 6: 业务闭环测试"
|
||
echo "------------------------"
|
||
|
||
# 创建第二个用户
|
||
USER2_TOKEN=$(curl -s -X POST "$BASE_URL/api/user/register" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"testuser2","password":"test123","nickname":"Test User 2"}' | jq -r '.data.token')
|
||
|
||
if [ -z "$USER2_TOKEN" ] || [ "$USER2_TOKEN" = "null" ]; then
|
||
# 如果注册失败,尝试登录
|
||
USER2_TOKEN=$(curl -s -X POST "$BASE_URL/api/user/login" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"testuser2","password":"test123"}' | jq -r '.data.token')
|
||
fi
|
||
|
||
# 通过邀请加入群组
|
||
test_case "通过邀请加入群组" \
|
||
"curl -s -X POST '$API_URL/invite/join' \
|
||
-H 'Content-Type: application/json' \
|
||
-H 'Authorization: Bearer $USER2_TOKEN' \
|
||
-d '{\"code\":\"$INVITE_CODE\"}' | jq -e '.message == \"加入成功\"'"
|
||
|
||
# 验证统计更新
|
||
sleep 2 # 等待异步更新
|
||
|
||
test_case "验证统计更新(join +1)" \
|
||
"curl -s '$API_URL/stats/my' -H 'Authorization: Bearer $TOKEN' | jq -e '.total.totalJoins > 0'"
|
||
|
||
# 停用邀请
|
||
test_case "停用邀请" \
|
||
"curl -s -X POST '$API_URL/invite/$INVITE_CODE/deactivate' \
|
||
-H 'Authorization: Bearer $TOKEN' | jq -e '.message == \"邀请已停用\"'"
|
||
|
||
# 验证邀请已停用
|
||
test_case "验证邀请已停用" \
|
||
"! curl -s -X POST '$API_URL/invite/join' \
|
||
-H 'Content-Type: application/json' \
|
||
-H 'Authorization: Bearer $USER2_TOKEN' \
|
||
-d '{\"code\":\"$INVITE_CODE\"}' | jq -e '.message == \"加入成功\"'"
|
||
|
||
# 7. 清理
|
||
echo ""
|
||
echo "🧹 清理测试数据..."
|
||
# 这里可以添加清理逻辑
|
||
|
||
# 测试结果
|
||
echo ""
|
||
echo "================================"
|
||
echo "测试结果汇总"
|
||
echo "================================"
|
||
echo -e "总测试数: $TOTAL_TESTS"
|
||
echo -e "通过: ${GREEN}$PASSED_TESTS${NC}"
|
||
echo -e "失败: ${RED}$FAILED_TESTS${NC}"
|
||
|
||
if [ $FAILED_TESTS -eq 0 ]; then
|
||
echo -e "\n${GREEN}✅ 所有测试通过!${NC}"
|
||
exit 0
|
||
else
|
||
echo -e "\n${RED}❌ 有 $FAILED_TESTS 个测试失败${NC}"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 运行主函数
|
||
main "$@"
|