package onlyoffice
import (
"archive/zip"
"bytes"
"io"
"strings"
"testing"
)
// buildTestDocx returns a minimal valid .docx with two paragraphs.
func buildTestDocx(t *testing.T) []byte {
t.Helper()
const (
contentTypes = ``
document = `The term is two years, ending 8 October 2028.Nothing relevant here.`
rels = ``
)
var buf bytes.Buffer
zw := zip.NewWriter(&buf)
for name, body := range map[string]string{
"[Content_Types].xml": contentTypes,
"word/document.xml": document,
"word/_rels/document.xml.rels": rels,
} {
w, err := zw.Create(name)
if err != nil {
t.Fatalf("zip create: %v", err)
}
if _, err := w.Write([]byte(body)); err != nil {
t.Fatalf("zip write: %v", err)
}
}
if err := zw.Close(); err != nil {
t.Fatalf("zip close: %v", err)
}
return buf.Bytes()
}
func unzipPart(t *testing.T, data []byte, name string) string {
t.Helper()
zr, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
if err != nil {
t.Fatalf("zip reader: %v", err)
}
for _, f := range zr.File {
if f.Name != name {
continue
}
rc, err := f.Open()
if err != nil {
t.Fatalf("open part: %v", err)
}
defer rc.Close()
b, err := io.ReadAll(rc)
if err != nil {
t.Fatalf("read part: %v", err)
}
return string(b)
}
t.Fatalf("part %s not found", name)
return ""
}
func TestInjectDocxComments(t *testing.T) {
src := buildTestDocx(t)
comments := []DocxComment{
{Anchor: "8 October 2028", Text: "Change to two years."},
{Anchor: "two years", Text: "second anchor, same paragraph"},
{Anchor: "no such text anywhere", Text: "skipped"},
}
// First anchor matches the first paragraph; the second also matches that
// paragraph but must be skipped (one comment per paragraph).
out, applied, err := InjectDocxComments(src, "Andriy Oblivantsev", comments)
if err != nil {
t.Fatalf("inject: %v", err)
}
if applied != 1 {
t.Fatalf("applied = %d, want 1", applied)
}
doc := unzipPart(t, out, "word/document.xml")
for _, want := range []string{"commentRangeStart", "commentRangeEnd", "commentReference"} {
if !strings.Contains(doc, want) {
t.Errorf("document.xml missing %s", want)
}
}
if strings.Contains(doc, `