# 链接状态接口测试文档

## 接口概览

新增了三个接口用于前端获取链接状态信息：

1. **获取链接状态** - `GET /api/link/{codeNo}/status`
2. **检查链接是否存在** - `GET /api/link/{codeNo}/exists`
3. **检查链接是否有效** - `GET /api/link/{codeNo}/valid`

## 测试步骤

### 1. 准备工作

首先需要生成一个链接用于测试：

```bash
# 1. 登录获取JWT令牌
curl -X POST http://localhost:18080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "username": "your_username",
    "password": "your_password"
  }'
```

从响应中获取JWT令牌，后续请求都需要在Header中带上：
```bash
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
```

### 2. 生成测试链接

```bash
# 2. 生成链接
curl -X POST http://localhost:18080/api/link/generate \
  -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "times": 5,
    "linkCount": 2
  }'
```

响应示例：
```json
{
    "batchId": 123,
    "deductPoints": 250,
    "expireAt": "2024-01-15T16:30:00",
    "codeNos": ["ABC12345", "DEF67890"]
}
```

记录其中一个 `codeNo`，比如 `ABC12345`，用于后续测试。

### 3. 测试获取链接状态接口

```bash
# 3. 获取链接状态
curl -X GET http://localhost:18080/api/link/ABC12345/status \
  -H "Accept: application/json"
```

**预期响应：**
```json
{
    "codeNo": "ABC12345",
    "batchId": 123,
    "status": "NEW",
    "statusDesc": "新建",
    "expireAt": "2024-01-15T16:30:00",
    "isExpired": false,
    "remainingSeconds": 7200,
    "quantity": 50,
    "times": 5,
    "totalPoints": 250,
    "region": null,
    "machineId": null,
    "loginAt": null,
    "createdAt": "2024-01-15T12:00:00",
    "updatedAt": "2024-01-15T12:00:00"
}
```

### 4. 测试检查链接是否存在接口

```bash
# 4. 检查链接是否存在
curl -X GET http://localhost:18080/api/link/ABC12345/exists \
  -H "Accept: application/json"
```

**预期响应：** `true`

### 5. 测试检查链接是否有效接口

```bash
# 5. 检查链接是否有效
curl -X GET http://localhost:18080/api/link/ABC12345/valid \
  -H "Accept: application/json"
```

**预期响应：** `true`

### 6. 测试错误情况

#### 6.1 测试不存在的链接

```bash
# 测试不存在的链接
curl -X GET http://localhost:18080/api/link/INVALID123/status \
  -H "Accept: application/json"
```

**预期响应：**
```json
{
    "timestamp": "2024-01-15T12:00:00.000+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "链接不存在: INVALID123",
    "path": "/api/link/INVALID123/status"
}
```

#### 6.2 测试空链接编号

```bash
# 测试空链接编号
curl -X GET http://localhost:18080/api/link//status \
  -H "Accept: application/json"
```

**预期响应：** 404 Not Found

## 状态值说明

### 链接状态 (status)
- `NEW` - 新建，未开始使用
- `USING` - 使用中，正在执行任务
- `LOGGED_IN` - 已登录，任务完成
- `REFUNDED` - 已退款
- `EXPIRED` - 已过期

### 区域 (region)
- `Q` - Q区
- `V` - V区
- `null` - 未分配区域

## 测试数据验证

### 1. 数值计算验证
- `totalPoints` = `quantity` × `times`
- `remainingSeconds` 应该大于0（如果未过期）
- `isExpired` 应该与当前时间和 `expireAt` 一致

### 2. 状态一致性验证
- 如果 `status` 是 `EXPIRED`，那么 `isExpired` 应该是 `true`
- 如果 `status` 是 `LOGGED_IN`，那么 `loginAt` 不应该为 `null`

### 3. 时间验证
- `createdAt` ≤ `updatedAt`
- `expireAt` > `createdAt`
- 如果 `loginAt` 不为空，那么 `loginAt` ≥ `createdAt`

## 性能测试

### 1. 响应时间测试
```bash
# 使用time命令测试响应时间
time curl -X GET http://localhost:18080/api/link/ABC12345/status
```

### 2. 并发测试
```bash
# 使用ab工具进行并发测试
ab -n 100 -c 10 http://localhost:18080/api/link/ABC12345/status
```

## 错误处理测试

### 1. 数据库连接异常
模拟数据库连接失败的情况，验证错误处理。

### 2. 网络超时
模拟网络延迟，验证超时处理。

### 3. 内存不足
模拟内存不足情况，验证系统稳定性。

## 安全测试

### 1. 权限验证
```bash
# 不带JWT令牌访问（应该被拦截）
curl -X GET http://localhost:18080/api/link/ABC12345/status
```

### 2. SQL注入防护
```bash
# 测试SQL注入
curl -X GET "http://localhost:18080/api/link/ABC12345'; DROP TABLE link_task; --/status"
```

### 3. XSS防护
```bash
# 测试XSS攻击
curl -X GET "http://localhost:18080/api/link/<script>alert('xss')</script>/status"
```

## 测试报告模板

### 测试结果记录

| 测试项目 | 测试结果 | 响应时间 | 备注 |
|---------|---------|---------|------|
| 获取链接状态 | ✅ 通过 | 45ms | 正常 |
| 检查链接存在 | ✅ 通过 | 23ms | 正常 |
| 检查链接有效 | ✅ 通过 | 28ms | 正常 |
| 错误处理 | ✅ 通过 | 15ms | 正常 |
| 性能测试 | ✅ 通过 | 平均35ms | 满足要求 |

### 问题记录

| 问题描述 | 严重程度 | 状态 | 备注 |
|---------|---------|------|------|
| 无 | - | - | - |

### 建议改进

1. 可以考虑添加缓存机制，减少数据库查询
2. 可以添加链接访问统计功能
3. 可以考虑添加链接状态变更通知功能

## 自动化测试

### 使用Postman Collection

可以创建Postman Collection来自动化测试这些接口：

1. 创建环境变量存储JWT令牌和链接编号
2. 设置测试脚本验证响应数据
3. 使用Postman Runner批量执行测试

### 使用JUnit测试

```java
@SpringBootTest
@AutoConfigureTestDatabase
class LinkStatusControllerTest {
    
    @Test
    void testGetLinkStatus() {
        // 测试获取链接状态
    }
    
    @Test
    void testLinkNotExists() {
        // 测试链接不存在的情况
    }
}
```

## 总结

这些接口为前端提供了完整的链接状态查询功能，支持：

1. **完整的状态信息** - 包括任务详情、过期时间、奖励点数等
2. **实时状态计算** - 自动计算是否过期、剩余时间等
3. **友好的错误处理** - 提供清晰的错误信息和状态码
4. **高性能查询** - 使用响应式编程，支持高并发访问

前端可以根据这些接口实现丰富的用户界面，提供良好的用户体验。
