Bläddra i källkod

✨ feat(sdk-test): 集成RTC管理器并添加相关测试功能

- 导入IRtcManagerAdapter类型并添加RTC管理器状态
- 实现RTC频道加入、音视频轨道创建和流发布功能
- 更新SDK初始化流程,同时创建STT、RTM和RTC管理器
- 添加RTC相关UI控制按钮和状态显示
- 更新测试日志,反映RTC管理器的创建状态

✅ test(sdk-test): 添加RTC功能的E2E测试用例

- 新增RTC频道加入和音视频传输测试
- 添加STT与RTC集成的完整流程测试
- 验证RTC相关操作的成功日志输出
- 测试RTC与转录功能的协同工作流程
yourname 3 månader sedan
förälder
incheckning
98064f3acf
2 ändrade filer med 160 tillägg och 2 borttagningar
  1. 88 2
      src/pages/sdk-test/index.tsx
  2. 72 0
      tests/e2e/sdk-test.spec.ts

+ 88 - 2
src/pages/sdk-test/index.tsx

@@ -13,7 +13,11 @@ import styles from "./index.module.scss"
 
 // 导入SDK核心模块
 import { SttSdk } from "../../../packages/stt-sdk-core/src"
-import type { ISttManagerAdapter, IRtmManagerAdapter } from "../../../packages/stt-sdk-core/src"
+import type {
+  ISttManagerAdapter,
+  IRtmManagerAdapter,
+  IRtcManagerAdapter,
+} from "../../../packages/stt-sdk-core/src"
 
 const { Title, Text } = Typography
 
@@ -25,8 +29,10 @@ const SdkTestPage = () => {
   const [sdk, setSdk] = useState<SttSdk | null>(null)
   const [sttManager, setSttManager] = useState<ISttManagerAdapter | null>(null)
   const [rtmManager, setRtmManager] = useState<IRtmManagerAdapter | null>(null)
+  const [rtcManager, setRtcManager] = useState<IRtcManagerAdapter | null>(null)
   const [isSdkInitialized, setIsSdkInitialized] = useState(false)
   const [isSttManagerInitialized, setIsSttManagerInitialized] = useState(false)
+  const [isRtcManagerJoined, setIsRtcManagerJoined] = useState(false)
   const [isTranscriptionActive, setIsTranscriptionActive] = useState(false)
   const [transcriptionStatus, setTranscriptionStatus] = useState<string>("idle")
   const [testResults, setTestResults] = useState<string[]>([])
@@ -77,13 +83,15 @@ const SdkTestPage = () => {
       // 创建管理器 - 先创建RTM管理器,然后创建STT管理器并传入RTM管理器
       const rtmManager = newSdk.createRtmManager()
       const sttManager = newSdk.createSttManager(rtmManager)
+      const rtcManager = newSdk.createRtcManager()
 
       // 监听RTM管理器的事件
       rtmManager.on("sttDataChanged", onSttDataChanged)
 
       setSttManager(sttManager)
       setRtmManager(rtmManager)
-      addTestLog("✅ STT和RTM管理器创建成功")
+      setRtcManager(rtcManager)
+      addTestLog("✅ STT、RTM和RTC管理器创建成功")
 
       messageApi.success("SDK初始化成功")
     } catch (error) {
@@ -176,6 +184,60 @@ const SdkTestPage = () => {
     }
   }
 
+  // 加入RTC频道
+  const joinRtcChannel = async () => {
+    if (!rtcManager) return
+
+    try {
+      const values = form.getFieldsValue()
+      addTestLog("开始加入RTC频道...")
+
+      await rtcManager.join({
+        channel: values.channel,
+        userId: genRandomUserId(),
+      })
+
+      setIsRtcManagerJoined(true)
+      addTestLog("✅ RTC频道加入成功")
+      messageApi.success("RTC频道加入成功")
+    } catch (error) {
+      addTestLog(`❌ RTC频道加入失败: ${error}`)
+      messageApi.error(`RTC频道加入失败: ${error}`)
+    }
+  }
+
+  // 创建音视频轨道
+  const createRtcTracks = async () => {
+    if (!rtcManager) return
+
+    try {
+      addTestLog("开始创建音视频轨道...")
+
+      await rtcManager.createTracks()
+      addTestLog("✅ 音视频轨道创建成功")
+      messageApi.success("音视频轨道创建成功")
+    } catch (error) {
+      addTestLog(`❌ 音视频轨道创建失败: ${error}`)
+      messageApi.error(`音视频轨道创建失败: ${error}`)
+    }
+  }
+
+  // 发布音视频流
+  const publishRtcStream = async () => {
+    if (!rtcManager) return
+
+    try {
+      addTestLog("开始发布音视频流...")
+
+      await rtcManager.publish()
+      addTestLog("✅ 音视频流发布成功")
+      messageApi.success("音视频流发布成功")
+    } catch (error) {
+      addTestLog(`❌ 音视频流发布失败: ${error}`)
+      messageApi.error(`音视频流发布失败: ${error}`)
+    }
+  }
+
   // 清理资源
   const cleanup = async () => {
     try {
@@ -338,6 +400,29 @@ const SdkTestPage = () => {
               >
                 查询状态
               </Button>
+
+              <Divider />
+
+              <Button
+                onClick={joinRtcChannel}
+                disabled={!isSdkInitialized || isRtcManagerJoined}
+                block
+              >
+                {isRtcManagerJoined ? "✅ RTC频道已加入" : "加入RTC频道"}
+              </Button>
+
+              <Button onClick={createRtcTracks} disabled={!isRtcManagerJoined} block>
+                创建音视频轨道
+              </Button>
+
+              <Button
+                type="primary"
+                onClick={publishRtcStream}
+                disabled={!isRtcManagerJoined}
+                block
+              >
+                发布音视频流
+              </Button>
             </Space>
 
             <Divider />
@@ -418,6 +503,7 @@ const SdkTestPage = () => {
                 <li>点击"初始化 SDK"</li>
                 <li>初始化 STT 管理器和加入 RTM 频道</li>
                 <li>开始/停止转录测试</li>
+                <li>加入 RTC 频道并测试音频传输</li>
                 <li>查看测试日志了解详细结果</li>
               </ol>
 

+ 72 - 0
tests/e2e/sdk-test.spec.ts

@@ -109,6 +109,78 @@ test.describe("SDK Test Page E2E Tests", () => {
     await expect(page.locator(".logContainer")).toContainText("📊 转录状态查询结果")
   })
 
+  test("should join RTC channel and test audio transmission", async ({ page }) => {
+    // 先初始化SDK
+    await page.fill('input[placeholder="请输入 Agora App ID"]', "test-app-id")
+    await page.fill('input[placeholder="请输入 Agora Certificate"]', "test-certificate")
+    await page.click('button:has-text("初始化 SDK")')
+
+    // 点击加入RTC频道按钮
+    await page.click('button:has-text("加入RTC频道")')
+
+    // 验证RTC频道加入成功
+    await expect(page.locator('button:has-text("✅ RTC频道已加入")')).toBeVisible({
+      timeout: 10000,
+    })
+    await expect(page.locator(".logContainer")).toContainText("✅ RTC频道加入成功")
+
+    // 点击创建音视频轨道按钮
+    await page.click('button:has-text("创建音视频轨道")')
+
+    // 验证轨道创建成功
+    await expect(page.locator(".logContainer")).toContainText("✅ 音视频轨道创建成功", {
+      timeout: 10000,
+    })
+
+    // 点击发布音视频流按钮
+    await page.click('button:has-text("发布音视频流")')
+
+    // 验证流发布成功
+    await expect(page.locator(".logContainer")).toContainText("✅ 音视频流发布成功", {
+      timeout: 10000,
+    })
+  })
+
+  test("should test complete audio transcription with RTC integration", async ({ page }) => {
+    // 先初始化SDK
+    await page.fill('input[placeholder="请输入 Agora App ID"]', "test-app-id")
+    await page.fill('input[placeholder="请输入 Agora Certificate"]', "test-certificate")
+    await page.click('button:has-text("初始化 SDK")')
+
+    // 初始化STT管理器
+    await page.click('button:has-text("初始化STT管理器")')
+
+    // 加入RTC频道
+    await page.click('button:has-text("加入RTC频道")')
+
+    // 开始转录
+    await page.click('button:has-text("开始转录")')
+
+    // 验证转录状态
+    await expect(page.locator('button:has-text("转录进行中...")')).toBeVisible({ timeout: 10000 })
+
+    // 创建音视频轨道
+    await page.click('button:has-text("创建音视频轨道")')
+
+    // 发布音视频流
+    await page.click('button:has-text("发布音视频流")')
+
+    // 验证完整的流程日志
+    const logText = await page.locator(".logContainer").textContent()
+    expect(logText).toContain("✅ SDK初始化成功")
+    expect(logText).toContain("✅ STT管理器初始化成功")
+    expect(logText).toContain("✅ RTC频道加入成功")
+    expect(logText).toContain("✅ 语音转录已开始")
+    expect(logText).toContain("✅ 音视频轨道创建成功")
+    expect(logText).toContain("✅ 音视频流发布成功")
+
+    // 停止转录
+    await page.click('button:has-text("停止转录")')
+
+    // 验证转录停止
+    await expect(page.locator('button:has-text("开始转录")')).toBeVisible({ timeout: 10000 })
+  })
+
   test("should cleanup resources properly", async ({ page }) => {
     // 先完成所有初始化步骤
     await page.fill('input[placeholder="请输入 Agora App ID"]', "test-app-id")