{
  "test_date": "2026-06-22 20:19:50",
  "module": "教材 (textbooks)",
  "version": "v1",
  "base_url": "http://localhost:3000",
  "summary": {
    "total": 4,
    "passed": 4,
    "failed": 0,
    "warnings": 0
  },
  "roles": {
    "admin": {
      "role": "admin",
      "login_success": true,
      "teacher_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/teacher/textbooks",
        "errors": [],
        "warnings": []
      },
      "student_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/admin/dashboard?from=%2Fstudent%2Flearning%2Ftextbooks&reason=forbidden",
        "errors": [],
        "warnings": []
      },
      "checks": [
        {
          "name": "admin 有权访问教师教材列表页",
          "passed": true,
          "detail": "HTTP 200"
        },
        {
          "name": "admin 访问学生端教材页被拦截（符合预期）",
          "passed": true,
          "detail": "重定向到 http://localhost:3000/admin/dashboard?from=%2Fstudent%2Flearning%2Ftextbooks&reason=forbidden"
        }
      ],
      "screenshots": [
        "access_admin_teacher_list.png",
        "access_admin_student_list.png"
      ]
    },
    "teacher": {
      "role": "teacher",
      "login_success": true,
      "teacher_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/teacher/textbooks",
        "errors": [],
        "warnings": []
      },
      "student_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/teacher/dashboard?from=%2Fstudent%2Flearning%2Ftextbooks&reason=forbidden",
        "errors": [],
        "warnings": []
      },
      "checks": [
        {
          "name": "teacher 有权访问教师教材列表页",
          "passed": true,
          "detail": "HTTP 200"
        },
        {
          "name": "teacher 访问学生端教材页被拦截（符合预期）",
          "passed": true,
          "detail": "重定向到 http://localhost:3000/teacher/dashboard?from=%2Fstudent%2Flearning%2Ftextbooks&reason=forbidden"
        }
      ],
      "screenshots": [
        "access_teacher_teacher_list.png",
        "access_teacher_student_list.png"
      ]
    },
    "student": {
      "role": "student",
      "login_success": true,
      "teacher_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/student/dashboard?from=%2Fteacher%2Ftextbooks&reason=forbidden",
        "errors": [],
        "warnings": []
      },
      "student_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/student/learning/textbooks",
        "errors": [],
        "warnings": []
      },
      "checks": [
        {
          "name": "student 无权限访问教师教材页被正确拦截",
          "passed": true,
          "detail": "重定向到 http://localhost:3000/student/dashboard?from=%2Fteacher%2Ftextbooks&reason=forbidden"
        },
        {
          "name": "学生有权访问学生端教材列表页",
          "passed": true,
          "detail": "HTTP 200"
        }
      ],
      "screenshots": [
        "access_student_teacher_list.png",
        "access_student_student_list.png"
      ]
    },
    "parent": {
      "role": "parent",
      "login_success": true,
      "teacher_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/parent/dashboard?from=%2Fteacher%2Ftextbooks&reason=forbidden",
        "errors": [],
        "warnings": []
      },
      "student_list_page": {
        "status": "passed",
        "http_status": 200,
        "final_url": "http://localhost:3000/parent/dashboard?from=%2Fstudent%2Flearning%2Ftextbooks&reason=forbidden",
        "errors": [],
        "warnings": []
      },
      "checks": [
        {
          "name": "parent 无权限访问教师教材页被正确拦截",
          "passed": true,
          "detail": "重定向到 http://localhost:3000/parent/dashboard?from=%2Fteacher%2Ftextbooks&reason=forbidden"
        },
        {
          "name": "parent 访问学生端教材页被拦截（符合预期）",
          "passed": true,
          "detail": "重定向到 http://localhost:3000/parent/dashboard?from=%2Fstudent%2Flearning%2Ftextbooks&reason=forbidden"
        }
      ],
      "screenshots": [
        "access_parent_teacher_list.png",
        "access_parent_student_list.png"
      ]
    }
  },
  "teacher_features": {
    "role": "teacher",
    "features": {
      "list": {
        "name": "列表页",
        "status": "passed",
        "checks": [
          {
            "name": "页面标题包含'教材'/'Textbook'",
            "passed": true,
            "detail": "body 长度 210341"
          },
          {
            "name": "存在'新建教材'按钮",
            "passed": true,
            "detail": "找到 1 个"
          },
          {
            "name": "存在筛选器",
            "passed": true,
            "detail": "找到 2 个 input/select"
          },
          {
            "name": "教材卡片或空状态",
            "passed": true,
            "detail": "找到 6 个教材链接"
          }
        ],
        "errors": []
      },
      "filter": {
        "name": "筛选",
        "status": "passed",
        "checks": [
          {
            "name": "搜索筛选触发 URL 参数更新",
            "passed": true,
            "detail": "URL=http://localhost:3000/teacher/textbooks?q=%E6%95%B0%E5%AD%A6"
          },
          {
            "name": "学科筛选下拉选项出现",
            "passed": true,
            "detail": "找到 9 个选项"
          }
        ],
        "errors": []
      },
      "create": {
        "name": "新建教材",
        "status": "passed",
        "checks": [
          {
            "name": "新建教材对话框打开",
            "passed": true,
            "detail": "找到 1 个对话框"
          },
          {
            "name": "教材创建成功（toast 或列表显示）",
            "passed": true,
            "detail": "toast=True, in_list=True"
          }
        ],
        "errors": []
      },
      "detail": {
        "name": "教材详情页",
        "status": "passed",
        "checks": [
          {
            "name": "详情页 HTTP 200",
            "passed": true,
            "detail": "HTTP 200"
          },
          {
            "name": "存在返回按钮",
            "passed": true,
            "detail": "找到 1 个"
          },
          {
            "name": "存在设置按钮",
            "passed": true,
            "detail": "找到 1 个"
          },
          {
            "name": "存在 Tab 切换（章节/知识点/图谱）",
            "passed": true,
            "detail": "找到 3 个 Tab"
          },
          {
            "name": "章节侧边栏渲染",
            "passed": true,
            "detail": "找到 0 个章节元素"
          }
        ],
        "errors": []
      },
      "chapter": {
        "name": "章节功能",
        "status": "passed",
        "checks": [
          {
            "name": "存在新建章节按钮",
            "passed": false,
            "detail": "找到 0 个"
          },
          {
            "name": "章节列表渲染",
            "passed": true,
            "detail": "找到 0 个章节元素"
          },
          {
            "name": "内容面板渲染",
            "passed": false,
            "detail": "找到 0 个内容元素"
          }
        ],
        "errors": []
      },
      "graph": {
        "name": "知识图谱",
        "status": "warning",
        "checks": [
          {
            "name": "图谱 Tab 可点击",
            "passed": false,
            "detail": "图谱 Tab 处于 disabled 状态（可能无章节可选）"
          }
        ],
        "errors": []
      },
      "settings": {
        "name": "设置对话框",
        "status": "passed",
        "checks": [
          {
            "name": "设置对话框打开",
            "passed": true,
            "detail": "找到 1 个对话框"
          },
          {
            "name": "标题输入框存在且有默认值",
            "passed": true,
            "detail": "找到 1 个"
          },
          {
            "name": "存在删除按钮",
            "passed": true,
            "detail": "找到 1 个"
          }
        ],
        "errors": []
      },
      "delete": {
        "name": "删除教材",
        "status": "passed",
        "checks": [
          {
            "name": "删除后跳转回列表页",
            "passed": false,
            "detail": "URL=http://localhost:3000/teacher/textbooks/bl9rs9g8r2qbker2vpi6mztp"
          }
        ],
        "errors": []
      }
    },
    "screenshots": [
      "teacher_feature_list.png",
      "teacher_feature_filter.png",
      "teacher_feature_create_form.png",
      "teacher_feature_detail.png",
      "teacher_feature_chapter.png",
      "teacher_feature_settings.png"
    ],
    "errors": [],
    "warnings": [],
    "created_textbook_id": "bl9rs9g8r2qbker2vpi6mztp"
  },
  "student_features": {
    "role": "student",
    "features": {
      "list": {
        "name": "学生列表页",
        "status": "passed",
        "checks": [
          {
            "name": "页面标题包含'教材'/'Textbook'",
            "passed": true,
            "detail": "body 长度 353764"
          },
          {
            "name": "学生端无'新建教材'按钮",
            "passed": true,
            "detail": "找到 0 个（应为 0）"
          },
          {
            "name": "存在筛选器",
            "passed": true,
            "detail": "找到 4 个筛选元素"
          },
          {
            "name": "教材卡片或空状态",
            "passed": true,
            "detail": "找到 7 个教材链接"
          }
        ],
        "errors": []
      },
      "filter": {
        "name": "学生筛选",
        "status": "passed",
        "checks": [
          {
            "name": "搜索筛选触发 URL 参数更新",
            "passed": true,
            "detail": "URL=http://localhost:3000/student/learning/textbooks?q=%E6%95%B0%E5%AD%A6"
          }
        ],
        "errors": []
      },
      "detail": {
        "name": "学生详情页",
        "status": "passed",
        "checks": [
          {
            "name": "详情页 HTTP 200",
            "passed": true,
            "detail": "HTTP 200"
          },
          {
            "name": "章节侧边栏渲染",
            "passed": true,
            "detail": "找到 0 个章节元素"
          },
          {
            "name": "存在 Tab 切换",
            "passed": false,
            "detail": "找到 0 个 Tab"
          },
          {
            "name": "学生端无编辑按钮",
            "passed": true,
            "detail": "找到 0 个（应为 0）"
          },
          {
            "name": "学生端无设置按钮",
            "passed": true,
            "detail": "找到 0 个（应为 0）"
          }
        ],
        "errors": []
      },
      "graph": {
        "name": "学生知识图谱",
        "status": "warning",
        "checks": [],
        "errors": [
          "未找到图谱 Tab"
        ]
      }
    },
    "screenshots": [
      "student_feature_list.png",
      "student_feature_detail.png"
    ],
    "errors": [],
    "warnings": []
  },
  "console_errors_global": []
}