refactor(pdfengines): embeds => attachments

This commit is contained in:
Julien Neuhart
2026-03-08 15:49:09 +01:00
parent 7af3cd1ff5
commit cf9fd7eedc
92 changed files with 5763 additions and 3082 deletions

View File

@@ -18,7 +18,6 @@ import (
"time"
"github.com/cucumber/godog"
"github.com/google/uuid"
"github.com/mholt/archives"
"github.com/testcontainers/testcontainers-go"
)
@@ -163,7 +162,7 @@ func (s *scenario) iMakeARequestToGotenbergWithTheFollowingFormDataAndHeaders(ct
fields[name] = value
case "file":
if strings.Contains(value, "teststore") {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
return fmt.Errorf("directory %q does not exist", dirPath)
@@ -235,7 +234,7 @@ func (s *scenario) iMakeARequestToGotenbergWithTheFollowingFormDataAndHeaders(ct
return errors.New("no filename in Content-Disposition header")
}
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
err = os.MkdirAll(dirPath, 0o755)
if err != nil {
return fmt.Errorf("create working directory: %w", err)
@@ -361,7 +360,7 @@ func (s *scenario) iMakeConcurrentRequestsToGotenberg(ctx context.Context, count
_, params, parseErr := mime.ParseMediaType(cd)
if parseErr == nil {
if filename, ok := params["filename"]; ok {
traceID := resp.Header.Get("Gotenberg-Trace")
traceID := resp.Header.Get("X-Correlation-ID")
dirPath := fmt.Sprintf("%s/%s", s.workdir, traceID)
mu.Lock()
@@ -416,7 +415,7 @@ func (s *scenario) allConcurrentResponsesShouldHavePdfs(expected int) error {
}
for i, resp := range s.concurrentResps {
traceID := resp.Header().Get("Gotenberg-Trace")
traceID := resp.Header().Get("X-Correlation-ID")
dirPath := fmt.Sprintf("%s/%s", s.workdir, traceID)
_, err := os.Stat(dirPath)
@@ -637,7 +636,7 @@ func (s *scenario) theBodyShouldMatchJSON(kind string, expectedDoc *godog.DocStr
}
func (s *scenario) thereShouldBePdfs(expected int, kind string) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
@@ -666,7 +665,7 @@ func (s *scenario) thereShouldBePdfs(expected int, kind string) error {
}
func (s *scenario) thereShouldBeTheFollowingFiles(kind string, filesTable *godog.Table) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
@@ -708,7 +707,7 @@ func (s *scenario) thereShouldBeTheFollowingFiles(kind string, filesTable *godog
}
func (s *scenario) thePdfsShouldBeValidWithAToleranceOf(ctx context.Context, kind, validate string, tolerance int) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
@@ -780,7 +779,7 @@ func (s *scenario) thePdfsShouldBeValidWithAToleranceOf(ctx context.Context, kin
func (s *scenario) thePdfShouldHavePages(ctx context.Context, name string, pages int) error {
var path string
if !strings.HasPrefix(name, "*_") {
path = fmt.Sprintf("%s/%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"), name)
path = fmt.Sprintf("%s/%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"), name)
_, err := os.Stat(path)
if os.IsNotExist(err) {
@@ -788,7 +787,7 @@ func (s *scenario) thePdfShouldHavePages(ctx context.Context, name string, pages
}
} else {
substr := strings.ReplaceAll(name, "*_", "")
err := filepath.Walk(fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace")), func(currentPath string, info os.FileInfo, pathErr error) error {
err := filepath.Walk(fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID")), func(currentPath string, info os.FileInfo, pathErr error) error {
if pathErr != nil {
return pathErr
}
@@ -836,7 +835,7 @@ func (s *scenario) thePdfShouldHavePages(ctx context.Context, name string, pages
func (s *scenario) thePdfShouldBeSetToLandscapeOrientation(ctx context.Context, name string, kind string) error {
var path string
if !strings.HasPrefix(name, "*_") {
path = fmt.Sprintf("%s/%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"), name)
path = fmt.Sprintf("%s/%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"), name)
_, err := os.Stat(path)
if os.IsNotExist(err) {
@@ -844,7 +843,7 @@ func (s *scenario) thePdfShouldBeSetToLandscapeOrientation(ctx context.Context,
}
} else {
substr := strings.ReplaceAll(name, "*_", "")
err := filepath.Walk(fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace")), func(currentPath string, info os.FileInfo, pathErr error) error {
err := filepath.Walk(fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID")), func(currentPath string, info os.FileInfo, pathErr error) error {
if pathErr != nil {
return pathErr
}
@@ -903,7 +902,7 @@ func (s *scenario) thePdfShouldBeSetToLandscapeOrientation(ctx context.Context,
func (s *scenario) thePdfShouldHaveTheFollowingContentAtPage(ctx context.Context, name, kind string, page int, expected *godog.DocString) error {
var path string
if !strings.HasPrefix(name, "*_") {
path = fmt.Sprintf("%s/%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"), name)
path = fmt.Sprintf("%s/%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"), name)
_, err := os.Stat(path)
if os.IsNotExist(err) {
@@ -911,7 +910,7 @@ func (s *scenario) thePdfShouldHaveTheFollowingContentAtPage(ctx context.Context
}
} else {
substr := strings.ReplaceAll(name, "*_", "")
err := filepath.Walk(fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace")), func(currentPath string, info os.FileInfo, pathErr error) error {
err := filepath.Walk(fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID")), func(currentPath string, info os.FileInfo, pathErr error) error {
if pathErr != nil {
return pathErr
}
@@ -955,7 +954,7 @@ func (s *scenario) thePdfShouldHaveTheFollowingContentAtPage(ctx context.Context
}
func (s *scenario) thePdfsShouldBeFlatten(ctx context.Context, kind, should string) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
@@ -1005,7 +1004,7 @@ func (s *scenario) thePdfsShouldBeFlatten(ctx context.Context, kind, should stri
}
func (s *scenario) thePdfsShouldBeEncrypted(ctx context.Context, kind string, should string) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
@@ -1056,8 +1055,8 @@ func (s *scenario) thePdfsShouldBeEncrypted(ctx context.Context, kind string, sh
return nil
}
func (s *scenario) thePdfsShouldHaveEmbeddedFile(ctx context.Context, kind, should, embed string) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("Gotenberg-Trace"))
func (s *scenario) thePdfsShouldHaveAttachedFile(ctx context.Context, kind, should, attachments string) error {
dirPath := fmt.Sprintf("%s/%s", s.workdir, s.resp.Header().Get("X-Correlation-ID"))
_, err := os.Stat(dirPath)
if os.IsNotExist(err) {
@@ -1096,20 +1095,27 @@ func (s *scenario) thePdfsShouldHaveEmbeddedFile(ctx context.Context, kind, shou
return fmt.Errorf("exec %q: %w", cmd, err)
}
found := strings.Contains(output, fmt.Sprintf("<fileName>%s</fileName>", embed))
found := strings.Contains(output, fmt.Sprintf("<fileName>%s</fileName>", attachments))
if invert && found {
return fmt.Errorf("embed %q found", embed)
return fmt.Errorf("attachment %q found", attachments)
}
if !invert && !found {
return fmt.Errorf("embed %q not found", embed)
return fmt.Errorf("attachment %q not found", attachments)
}
}
return nil
}
var nonAlphanumericRegex = regexp.MustCompile(`[^a-zA-Z0-9]+`)
func sanitizeDirName(name string) string {
sanitized := nonAlphanumericRegex.ReplaceAllString(name, "_")
return strings.Trim(sanitized, "_")
}
func InitializeScenario(ctx *godog.ScenarioContext) {
s := &scenario{}
ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) {
@@ -1117,7 +1123,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) {
if err != nil {
return ctx, fmt.Errorf("get current directory: %w", err)
}
s.workdir = fmt.Sprintf("%s/teststore/%s", wd, uuid.NewString())
s.workdir = fmt.Sprintf("%s/teststore/%s_%s", wd, sanitizeDirName(sc.Name), sc.Id)
err = os.MkdirAll(s.workdir, 0o755)
if err != nil {
return ctx, fmt.Errorf("create working directory: %w", err)
@@ -1146,7 +1152,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) {
ctx.Then(`^the (response|webhook request) PDF\(s\) should be valid "([^"]*)" with a tolerance of (\d+) failed rule\(s\)$`, s.thePdfsShouldBeValidWithAToleranceOf)
ctx.Then(`^the (response|webhook request) PDF\(s\) (should|should NOT) be flatten$`, s.thePdfsShouldBeFlatten)
ctx.Then(`^the (response|webhook request) PDF\(s\) (should|should NOT) be encrypted`, s.thePdfsShouldBeEncrypted)
ctx.Then(`^the (response|webhook request) PDF\(s\) (should|should NOT) have the "([^"]*)" file embedded$`, s.thePdfsShouldHaveEmbeddedFile)
ctx.Then(`^the (response|webhook request) PDF\(s\) (should|should NOT) have the "([^"]*)" file attached$`, s.thePdfsShouldHaveAttachedFile)
ctx.Then(`^the "([^"]*)" PDF should have (\d+) page\(s\)$`, s.thePdfShouldHavePages)
ctx.Then(`^the "([^"]*)" PDF (should|should NOT) be set to landscape orientation$`, s.thePdfShouldBeSetToLandscapeOrientation)
ctx.Then(`^the "([^"]*)" PDF (should|should NOT) have the following content at page (\d+):$`, s.thePdfShouldHaveTheFollowingContentAtPage)

View File

@@ -78,7 +78,7 @@ func newServer(ctx context.Context, workdir string) (*server, error) {
}
}
dirPath := fmt.Sprintf("%s/%s", workdir, s.req.Header.Get("Gotenberg-Trace"))
dirPath := fmt.Sprintf("%s/%s", workdir, s.req.Header.Get("X-Correlation-ID"))
// #nosec
err = os.MkdirAll(dirPath, 0o755)
if err != nil {
@@ -148,7 +148,7 @@ func newServer(ctx context.Context, workdir string) (*server, error) {
s.req = c.Request()
path := c.Param("path")
if strings.Contains(path, "teststore") {
return c.Attachment(fmt.Sprintf("%s/%s/%s", workdir, s.req.Header.Get("Gotenberg-Trace"), filepath.Base(path)), filepath.Base(path))
return c.Attachment(fmt.Sprintf("%s/%s/%s", workdir, s.req.Header.Get("X-Correlation-ID"), filepath.Base(path)), filepath.Base(path))
}
return c.Attachment(fmt.Sprintf("%s/%s", wd, path), filepath.Base(path))
})