package main
import (
"archive/zip"
"context"
"database/sql"
"os"
"path/filepath"
"testing"
_ "modernc.org/sqlite"
)
func TestParseDocumentXMLExtractsTableCells(t *testing.T) {
xml := `
报备表
序号
事件过程
1
起因处理经过
`
tables, err := parseDocumentXML([]byte(xml))
if err != nil {
t.Fatalf("parseDocumentXML returned error: %v", err)
}
if len(tables) != 1 {
t.Fatalf("got %d tables, want 1", len(tables))
}
if got := tables[0].Rows[0].Cells[0].Text; got != "报备表" {
t.Fatalf("title cell text = %q, want 报备表", got)
}
if got := tables[0].Rows[0].Cells[0].ColSpan; got != 2 {
t.Fatalf("title cell colspan = %d, want 2", got)
}
if got := tables[0].Rows[2].Cells[1].Text; got != "起因\n处理经过" {
t.Fatalf("multiline text = %q, want 起因\\n处理经过", got)
}
}
func TestInferHeaderFieldsSkipsTitleRow(t *testing.T) {
table := Table{
Rows: []Row{
{Cells: []Cell{{Text: "报备表", ColSpan: 2}}},
{Cells: []Cell{{Text: "序号", ColSpan: 1}, {Text: "事件过程", ColSpan: 1}}},
{Cells: []Cell{{Text: "1", ColSpan: 1}, {Text: "客户反映设备位置不合理", ColSpan: 1}}},
},
}
fields := inferFields(table)
if len(fields) != 2 {
t.Fatalf("got %d fields, want 2", len(fields))
}
if fields[0].Key != "序号" || fields[0].Value != "1" || fields[0].SourceKind != "header_row" {
t.Fatalf("unexpected first field: %#v", fields[0])
}
if fields[1].Key != "事件过程" || fields[1].Value != "客户反映设备位置不合理" {
t.Fatalf("unexpected second field: %#v", fields[1])
}
}
func TestImportDocumentWritesSQLiteTables(t *testing.T) {
dbPath := filepath.Join(t.TempDir(), "import.sqlite")
db, err := sql.Open("sqlite", dbPath)
if err != nil {
t.Fatalf("open sqlite: %v", err)
}
defer db.Close()
xml := `
报备表
序号事件过程
1客户反映设备位置不合理
`
docxPath := filepath.Join(t.TempDir(), "sample.docx")
if err := writeTestDocx(docxPath, []byte(xml)); err != nil {
t.Fatalf("write test docx: %v", err)
}
if err := importDocument(context.Background(), db, docxPath); err != nil {
t.Fatalf("importDocument: %v", err)
}
var cells int
if err := db.QueryRow(`SELECT COUNT(*) FROM cells`).Scan(&cells); err != nil {
t.Fatalf("count cells: %v", err)
}
if cells != 5 {
t.Fatalf("got %d cells, want 5", cells)
}
var value string
if err := db.QueryRow(`SELECT value FROM fields WHERE key = '事件过程'`).Scan(&value); err != nil {
t.Fatalf("query field: %v", err)
}
if value != "客户反映设备位置不合理" {
t.Fatalf("field value = %q", value)
}
}
func writeTestDocx(path string, documentXML []byte) error {
f, err := os.Create(path)
if err != nil {
return err
}
defer f.Close()
zw := zip.NewWriter(f)
defer zw.Close()
w, err := zw.Create("word/document.xml")
if err != nil {
return err
}
_, err = w.Write(documentXML)
return err
}