This commit is contained in:
2026-04-25 16:36:34 +08:00
commit db90e7579b
1876 changed files with 189777 additions and 0 deletions

205
tests/integration_test.sh Normal file
View File

@@ -0,0 +1,205 @@
#!/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 "$@"

123
tests/test_sales_module.sh Executable file
View File

@@ -0,0 +1,123 @@
#!/bin/bash
# ============================================
# Tailchat Sales 销售模块验证脚本
# ============================================
set -e
echo "🔍 [验证] Tailchat Sales 模块状态检查"
echo "================================"
# ==================== 1. 检查 Docker 服务 ====================
echo ""
echo "1⃣ 检查 Docker 服务状态..."
if docker ps &>/dev/null; then
if docker ps | grep -q "tailchat"; then
echo "✅ Tailchat 服务运行中"
docker ps | grep "tailchat" | awk '{print $1, $2}'
else
echo "⚠️ Tailchat 服务未运行"
echo "启动命令: cd /Users/sion/Desktop/projects/tailchat-sales && docker-compose up -d"
fi
else
echo "❌ Docker 未运行"
exit 1
fi
# ==================== 2. 检查 MongoDB 连接 ====================
echo ""
echo "2⃣ 检查 MongoDB 连接..."
MONGO_CONTAINER=$(docker ps | grep mongo | awk '{print $1}' | head -1)
if [ -n "$MONGO_CONTAINER" ]; then
echo "✅ MongoDB 容器运行中: $MONGO_CONTAINER"
# 检查 sales_invites 表
if docker exec $MONGO_CONTAINER mongo tailchat --eval "db.sales_invites.count()" 2>/dev/null | grep -q "[0-9]"; then
COUNT=$(docker exec $MONGO_CONTAINER mongo tailchat --eval "db.sales_invites.count()" 2>/dev/null | tail -1)
echo "✅ sales_invites 表存在,记录数: $COUNT"
else
echo "⚠️ sales_invites 表不存在或为空"
fi
# 检查 sales_stats 表
if docker exec $MONGO_CONTAINER mongo tailchat --eval "db.sales_stats.count()" 2>/dev/null | grep -q "[0-9]"; then
COUNT=$(docker exec $MONGO_CONTAINER mongo tailchat --eval "db.sales_stats.count()" 2>/dev/null | tail -1)
echo "✅ sales_stats 表存在,记录数: $COUNT"
else
echo "⚠️ sales_stats 表不存在或为空"
fi
else
echo "❌ MongoDB 容器未运行"
fi
# ==================== 3. 检查 Redis 连接 ====================
echo ""
echo "3⃣ 检查 Redis 连接..."
REDIS_CONTAINER=$(docker ps | grep redis | awk '{print $1}' | head -1)
if [ -n "$REDIS_CONTAINER" ]; then
echo "✅ Redis 容器运行中: $REDIS_CONTAINER"
# 测试 Redis 连接
if docker exec $REDIS_CONTAINER redis-cli ping 2>/dev/null | grep -q "PONG"; then
echo "✅ Redis 连接正常"
else
echo "❌ Redis 连接失败"
fi
else
echo "❌ Redis 容器未运行"
fi
# ==================== 4. 检查销售模块 API ====================
echo ""
echo "4⃣ 检查销售模块 API..."
TAILCHAT_URL="http://localhost:11000"
# 检查服务健康状态
if curl -s "$TAILCHAT_URL/health" | grep -q "ok"; then
echo "✅ Tailchat 服务健康"
else
echo "⚠️ Tailchat 服务未响应: $TAILCHAT_URL"
fi
# 测试邀请 API (需要 token)
# echo "测试邀请 API: POST $TAILCHAT_URL/api/plugin/com.msgbyte.saleschat/invite/create"
# ==================== 5. 检查用户表关联 ====================
echo ""
echo "5⃣ 检查用户表关联..."
if [ -n "$MONGO_CONTAINER" ]; then
# 检查 Tailchat 用户表
USER_COUNT=$(docker exec $MONGO_CONTAINER mongo tailchat --eval "db.users.count()" 2>/dev/null | tail -1)
if [[ "$USER_COUNT" =~ ^[0-9]+$ ]]; then
echo "✅ Tailchat 用户表存在,用户数: $USER_COUNT"
else
echo "⚠️ Tailchat 用户表不存在或为空"
fi
# 检查 sales_invites 是否引用了有效用户
if docker exec $MONGO_CONTAINER mongo tailchat --eval "db.sales_invites.findOne()" 2>/dev/null | grep -q "salesId"; then
echo "✅ sales_invites 表有数据且包含 salesId 字段"
else
echo "⚠️ sales_invites 表无数据或缺少 salesId 字段"
fi
fi
# ==================== 6. 检查插件加载状态 ====================
echo ""
echo "6⃣ 检查插件加载状态..."
PLUGIN_DIR="/Users/sion/Desktop/projects/tailchat-sales/server/plugins/com.msgbyte.saleschat"
if [ -d "$PLUGIN_DIR" ]; then
echo "✅ 销售插件目录存在"
echo " 路径: $PLUGIN_DIR"
# 检查关键文件
[ -f "$PLUGIN_DIR/services/index.ts" ] && echo " ✅ services/index.ts"
[ -f "$PLUGIN_DIR/services/invite.service.ts" ] && echo " ✅ invite.service.ts"
[ -f "$PLUGIN_DIR/services/stats.service.ts" ] && echo " ✅ stats.service.ts"
[ -f "$PLUGIN_DIR/services/admin.service.ts" ] && echo " ✅ admin.service.ts"
else
echo "❌ 销售插件目录不存在"
fi
echo ""
echo "================================"
echo "🏁 验证完成"