實作所有測驗結果與資料庫整合
This commit is contained in:
154
scripts/test-export-results.js
Normal file
154
scripts/test-export-results.js
Normal file
@@ -0,0 +1,154 @@
|
||||
const http = require('http')
|
||||
|
||||
const testExportResults = async () => {
|
||||
console.log('🔍 測試測驗結果匯出功能')
|
||||
console.log('=' .repeat(40))
|
||||
|
||||
try {
|
||||
// 測試基本匯出
|
||||
console.log('\n📊 測試基本匯出...')
|
||||
const basicResponse = await new Promise((resolve, reject) => {
|
||||
const req = http.get('http://localhost:3000/api/admin/test-results/export', (res) => {
|
||||
let data = ''
|
||||
res.on('data', chunk => data += chunk)
|
||||
res.on('end', () => resolve({
|
||||
status: res.statusCode,
|
||||
data: data
|
||||
}))
|
||||
})
|
||||
req.on('error', reject)
|
||||
})
|
||||
|
||||
if (basicResponse.status === 200) {
|
||||
const basicData = JSON.parse(basicResponse.data)
|
||||
if (basicData.success) {
|
||||
console.log('✅ 基本匯出成功')
|
||||
console.log(`📄 檔案名稱: ${basicData.filename}`)
|
||||
console.log(`📊 內容類型: ${basicData.contentType}`)
|
||||
console.log(`📏 資料大小: ${basicData.data.length} 字元`)
|
||||
|
||||
// 解碼並檢查 CSV 內容
|
||||
const binaryString = Buffer.from(basicData.data, 'base64').toString('binary')
|
||||
const csvContent = Buffer.from(binaryString, 'binary').toString('utf-8')
|
||||
|
||||
console.log('\n📋 CSV 內容預覽:')
|
||||
const lines = csvContent.split('\n')
|
||||
console.log(`總行數: ${lines.length}`)
|
||||
console.log('前 5 行內容:')
|
||||
lines.slice(0, 5).forEach((line, index) => {
|
||||
console.log(` ${index + 1}: ${line}`)
|
||||
})
|
||||
|
||||
// 檢查是否包含中文
|
||||
const hasChinese = /[\u4e00-\u9fff]/.test(csvContent)
|
||||
console.log(`✅ 包含中文字符: ${hasChinese ? '是' : '否'}`)
|
||||
|
||||
// 檢查 BOM
|
||||
const hasBOM = csvContent.startsWith('\uFEFF')
|
||||
console.log(`✅ 包含 UTF-8 BOM: ${hasBOM ? '是' : '否'}`)
|
||||
|
||||
} else {
|
||||
console.log('❌ 基本匯出失敗:', basicData.message)
|
||||
return
|
||||
}
|
||||
} else {
|
||||
console.log('❌ 基本匯出失敗,狀態碼:', basicResponse.status)
|
||||
return
|
||||
}
|
||||
|
||||
// 測試篩選匯出
|
||||
console.log('\n🔍 測試篩選匯出...')
|
||||
const filterResponse = await new Promise((resolve, reject) => {
|
||||
const req = http.get('http://localhost:3000/api/admin/test-results/export?testType=logic&department=人力資源部', (res) => {
|
||||
let data = ''
|
||||
res.on('data', chunk => data += chunk)
|
||||
res.on('end', () => resolve({
|
||||
status: res.statusCode,
|
||||
data: data
|
||||
}))
|
||||
})
|
||||
req.on('error', reject)
|
||||
})
|
||||
|
||||
if (filterResponse.status === 200) {
|
||||
const filterData = JSON.parse(filterResponse.data)
|
||||
if (filterData.success) {
|
||||
console.log('✅ 篩選匯出成功')
|
||||
|
||||
// 解碼並檢查篩選結果
|
||||
const binaryString = Buffer.from(filterData.data, 'base64').toString('binary')
|
||||
const csvContent = Buffer.from(binaryString, 'binary').toString('utf-8')
|
||||
const lines = csvContent.split('\n')
|
||||
|
||||
console.log(`📊 篩選後結果數量: ${lines.length - 1} 筆(扣除標題行)`)
|
||||
|
||||
// 檢查是否只包含邏輯測試
|
||||
const logicLines = lines.filter(line => line.includes('邏輯思維'))
|
||||
console.log(`🧠 邏輯思維測試數量: ${logicLines.length}`)
|
||||
|
||||
} else {
|
||||
console.log('❌ 篩選匯出失敗:', filterData.message)
|
||||
}
|
||||
}
|
||||
|
||||
// 測試搜尋匯出
|
||||
console.log('\n🔍 測試搜尋匯出...')
|
||||
const searchResponse = await new Promise((resolve, reject) => {
|
||||
const req = http.get('http://localhost:3000/api/admin/test-results/export?search=王', (res) => {
|
||||
let data = ''
|
||||
res.on('data', chunk => data += chunk)
|
||||
res.on('end', () => resolve({
|
||||
status: res.statusCode,
|
||||
data: data
|
||||
}))
|
||||
})
|
||||
req.on('error', reject)
|
||||
})
|
||||
|
||||
if (searchResponse.status === 200) {
|
||||
const searchData = JSON.parse(searchResponse.data)
|
||||
if (searchData.success) {
|
||||
console.log('✅ 搜尋匯出成功')
|
||||
|
||||
// 解碼並檢查搜尋結果
|
||||
const binaryString = Buffer.from(searchData.data, 'base64').toString('binary')
|
||||
const csvContent = Buffer.from(binaryString, 'binary').toString('utf-8')
|
||||
const lines = csvContent.split('\n')
|
||||
|
||||
console.log(`📊 搜尋結果數量: ${lines.length - 1} 筆(扣除標題行)`)
|
||||
|
||||
// 檢查是否只包含包含「王」的結果
|
||||
const wangLines = lines.filter(line => line.includes('王'))
|
||||
console.log(`👤 包含「王」的結果數量: ${wangLines.length}`)
|
||||
|
||||
} else {
|
||||
console.log('❌ 搜尋匯出失敗:', searchData.message)
|
||||
}
|
||||
}
|
||||
|
||||
console.log('\n🎯 匯出功能特點:')
|
||||
console.log('✅ 支援 CSV 格式匯出')
|
||||
console.log('✅ 包含 UTF-8 BOM,確保中文正確顯示')
|
||||
console.log('✅ 支援篩選條件匯出')
|
||||
console.log('✅ 包含詳細的測試結果資料')
|
||||
console.log('✅ 自動生成檔案名稱(包含日期)')
|
||||
console.log('✅ 支援搜尋、部門、測試類型篩選')
|
||||
|
||||
console.log('\n📊 匯出欄位:')
|
||||
console.log('✅ 用戶姓名')
|
||||
console.log('✅ 用戶郵箱')
|
||||
console.log('✅ 部門')
|
||||
console.log('✅ 測試類型')
|
||||
console.log('✅ 分數')
|
||||
console.log('✅ 等級')
|
||||
console.log('✅ 完成時間')
|
||||
console.log('✅ 詳細資料(根據測試類型不同)')
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 測試失敗:', error.message)
|
||||
} finally {
|
||||
console.log('\n✅ 測驗結果匯出功能測試完成')
|
||||
}
|
||||
}
|
||||
|
||||
testExportResults()
|
Reference in New Issue
Block a user