excel export update
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"bytes"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/xuri/excelize/v2"
|
||||
)
|
||||
|
||||
func TestWriteAuditWorkbookCreatesSafeExcelFile(t *testing.T) {
|
||||
@@ -44,50 +44,38 @@ func TestWriteAuditWorkbookCreatesSafeExcelFile(t *testing.T) {
|
||||
t.Fatal("workbook is not a ZIP-based Excel file")
|
||||
}
|
||||
|
||||
archive, err := zip.NewReader(bytes.NewReader(output.Bytes()), int64(output.Len()))
|
||||
workbook, err := excelize.OpenReader(bytes.NewReader(output.Bytes()))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
required := map[string]bool{
|
||||
"[Content_Types].xml": false,
|
||||
"xl/workbook.xml": false,
|
||||
"xl/styles.xml": false,
|
||||
"xl/worksheets/sheet1.xml": false,
|
||||
"xl/_rels/workbook.xml.rels": false,
|
||||
}
|
||||
var worksheet string
|
||||
for _, file := range archive.File {
|
||||
if _, ok := required[file.Name]; ok {
|
||||
required[file.Name] = true
|
||||
defer func() {
|
||||
if err := workbook.Close(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if file.Name != "xl/worksheets/sheet1.xml" {
|
||||
continue
|
||||
}
|
||||
reader, err := file.Open()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
content, err := io.ReadAll(reader)
|
||||
_ = reader.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
worksheet = string(content)
|
||||
}()
|
||||
if sheets := workbook.GetSheetList(); len(sheets) != 1 || sheets[0] != "Audit Log" {
|
||||
t.Fatalf("sheets = %#v, want Audit Log", sheets)
|
||||
}
|
||||
for file, found := range required {
|
||||
if !found {
|
||||
t.Errorf("workbook is missing %s", file)
|
||||
}
|
||||
customer, err := workbook.GetCellValue("Audit Log", "C5")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !strings.Contains(worksheet, "Acme & Sons") {
|
||||
t.Fatal("worksheet text was not XML escaped")
|
||||
if customer != "Acme & Sons" {
|
||||
t.Fatalf("customer = %q, want Acme & Sons", customer)
|
||||
}
|
||||
if strings.Contains(worksheet, "<f>") {
|
||||
t.Fatal("untrusted audit text must not be written as a formula")
|
||||
hostname, err := workbook.GetCellValue("Audit Log", "E5")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !strings.Contains(worksheet, `t="inlineStr"`) ||
|
||||
!strings.Contains(worksheet, `=HYPERLINK`) {
|
||||
t.Fatal("formula-looking audit text was not preserved as a text cell")
|
||||
if hostname != `=HYPERLINK("https://invalid.example")` {
|
||||
t.Fatalf("hostname = %q, formula-looking text was not preserved", hostname)
|
||||
}
|
||||
formula, err := workbook.GetCellFormula("Audit Log", "E5")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if formula != "" {
|
||||
t.Fatalf("untrusted audit text was written as formula %q", formula)
|
||||
}
|
||||
|
||||
if samplePath := os.Getenv("TAPM_AUDIT_SAMPLE_PATH"); samplePath != "" {
|
||||
@@ -128,31 +116,26 @@ func TestAuditExportReturnsAllRowsAndRecordsDownload(t *testing.T) {
|
||||
t.Fatalf("content disposition = %q", disposition)
|
||||
}
|
||||
|
||||
archive, err := zip.NewReader(
|
||||
bytes.NewReader(response.Body.Bytes()),
|
||||
int64(response.Body.Len()),
|
||||
)
|
||||
workbook, err := excelize.OpenReader(bytes.NewReader(response.Body.Bytes()))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var worksheet string
|
||||
for _, file := range archive.File {
|
||||
if file.Name != "xl/worksheets/sheet1.xml" {
|
||||
continue
|
||||
defer func() {
|
||||
if err := workbook.Close(); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
reader, err := file.Open()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
content, err := io.ReadAll(reader)
|
||||
_ = reader.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
worksheet = string(content)
|
||||
}()
|
||||
rows, err := workbook.GetRows("Audit Log")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !strings.Contains(worksheet, "older_event") ||
|
||||
!strings.Contains(worksheet, "newer_event") {
|
||||
var exportedEvents []string
|
||||
for _, row := range rows {
|
||||
if len(row) > 1 && (row[1] == "older_event" || row[1] == "newer_event") {
|
||||
exportedEvents = append(exportedEvents, row[1])
|
||||
}
|
||||
}
|
||||
if len(exportedEvents) != 2 {
|
||||
t.Fatal("complete export did not contain all retained audit rows")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user