155 lines
5.5 KiB
JavaScript
155 lines
5.5 KiB
JavaScript
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()
|