diff --git a/Makefile b/Makefile index 3e663424..d413b307 100644 --- a/Makefile +++ b/Makefile @@ -160,9 +160,39 @@ test-unit: ## Run unit tests PLATFORM= NO_CONCURRENCY=false +# Available tags: +# chromium +# chromium-convert-html +# chromium-convert-markdown +# chromium-convert-url +# debug +# health +# libreoffice +# libreoffice-convert +# output-filename +# pdfengines +# pdfengines-convert +# pdfengines-embed +# embed +# pdfengines-encrypt +# encrypt +# pdfengines-flatten +# flatten +# pdfengines-merge +# merge +# pdfengines-metadata +# metadata +# pdfengines-split +# split +# prometheus-metrics +# root +# version +# webhook +# download-from +TAGS= .PHONY: test-integration -test-integration: ## Run integration tests, use TAGS environment variable to filter tests by tags +test-integration: ## Run integration tests go test -timeout 40m -tags=integration -v github.com/gotenberg/gotenberg/v8/test/integration -args \ --gotenberg-docker-repository=$(DOCKER_REPOSITORY) \ --gotenberg-version=$(GOTENBERG_VERSION) \ diff --git a/pkg/modules/chromium/routes.go b/pkg/modules/chromium/routes.go index a756bc1f..17f3a6c0 100644 --- a/pkg/modules/chromium/routes.go +++ b/pkg/modules/chromium/routes.go @@ -685,16 +685,16 @@ func convertUrl(ctx *api.Context, chromium Api, engine gotenberg.PdfEngine, url return fmt.Errorf("convert PDF(s): %w", err) } - err = pdfengines.WriteMetadataStub(ctx, engine, metadata, convertOutputPaths) - if err != nil { - return fmt.Errorf("write metadata: %w", err) - } - err = pdfengines.EmbedFilesStub(ctx, engine, embedPaths, convertOutputPaths) if err != nil { return fmt.Errorf("embed files into PDFs: %w", err) } + err = pdfengines.WriteMetadataStub(ctx, engine, metadata, convertOutputPaths) + if err != nil { + return fmt.Errorf("write metadata: %w", err) + } + err = pdfengines.EncryptPdfStub(ctx, engine, userPassword, ownerPassword, convertOutputPaths) if err != nil { return fmt.Errorf("encrypt PDFs: %w", err) diff --git a/pkg/modules/libreoffice/routes.go b/pkg/modules/libreoffice/routes.go index cc96a4da..854f347a 100644 --- a/pkg/modules/libreoffice/routes.go +++ b/pkg/modules/libreoffice/routes.go @@ -253,6 +253,11 @@ func convertRoute(libreOffice libreofficeapi.Uno, engine gotenberg.PdfEngine) ap } } + err = pdfengines.EmbedFilesStub(ctx, engine, embedPaths, outputPaths) + if err != nil { + return fmt.Errorf("embed files into PDFs: %w", err) + } + err = pdfengines.WriteMetadataStub(ctx, engine, metadata, outputPaths) if err != nil { return fmt.Errorf("write metadata: %w", err) @@ -265,11 +270,6 @@ func convertRoute(libreOffice libreofficeapi.Uno, engine gotenberg.PdfEngine) ap } } - err = pdfengines.EmbedFilesStub(ctx, engine, embedPaths, outputPaths) - if err != nil { - return fmt.Errorf("embed files into PDFs: %w", err) - } - err = pdfengines.EncryptPdfStub(ctx, engine, userPassword, ownerPassword, outputPaths) if err != nil { return fmt.Errorf("encrypt PDFs: %w", err) diff --git a/pkg/modules/pdfengines/routes.go b/pkg/modules/pdfengines/routes.go index 27e536cd..334678e7 100644 --- a/pkg/modules/pdfengines/routes.go +++ b/pkg/modules/pdfengines/routes.go @@ -337,6 +337,11 @@ func mergeRoute(engine gotenberg.PdfEngine) api.Route { return fmt.Errorf("convert PDF: %w", err) } + err = EmbedFilesStub(ctx, engine, embedPaths, outputPaths) + if err != nil { + return fmt.Errorf("embed files into PDFs: %w", err) + } + err = WriteMetadataStub(ctx, engine, metadata, outputPaths) if err != nil { return fmt.Errorf("write metadata: %w", err) @@ -349,11 +354,6 @@ func mergeRoute(engine gotenberg.PdfEngine) api.Route { } } - err = EmbedFilesStub(ctx, engine, embedPaths, outputPaths) - if err != nil { - return fmt.Errorf("embed files into PDFs: %w", err) - } - err = EncryptPdfStub(ctx, engine, userPassword, ownerPassword, outputPaths) if err != nil { return fmt.Errorf("encrypt PDFs: %w", err) @@ -405,6 +405,11 @@ func splitRoute(engine gotenberg.PdfEngine) api.Route { return fmt.Errorf("convert PDFs: %w", err) } + err = EmbedFilesStub(ctx, engine, embedPaths, convertOutputPaths) + if err != nil { + return fmt.Errorf("embed files into PDFs: %w", err) + } + err = WriteMetadataStub(ctx, engine, metadata, convertOutputPaths) if err != nil { return fmt.Errorf("write metadata: %w", err) @@ -417,11 +422,6 @@ func splitRoute(engine gotenberg.PdfEngine) api.Route { } } - err = EmbedFilesStub(ctx, engine, embedPaths, convertOutputPaths) - if err != nil { - return fmt.Errorf("embed files into PDFs: %w", err) - } - err = EncryptPdfStub(ctx, engine, userPassword, ownerPassword, convertOutputPaths) if err != nil { return fmt.Errorf("encrypt PDFs: %w", err) diff --git a/test/integration/features/chromium_convert_html.feature b/test/integration/features/chromium_convert_html.feature index 32eb2c0a..4655b241 100644 --- a/test/integration/features/chromium_convert_html.feature +++ b/test/integration/features/chromium_convert_html.feature @@ -1,6 +1,8 @@ # TODO: # 1. JavaScript disabled on some feature. +@chromium +@chromium-pdf-html Feature: /forms/chromium/convert/html Scenario: POST /forms/chromium/convert/html (Default) @@ -557,6 +559,7 @@ Feature: /forms/chromium/convert/html Invalid form data: form field 'metadata' is invalid (got 'foo', resulting to unmarshal metadata: invalid character 'o' in literal false (expecting 'a')) """ + @split Scenario: POST /forms/chromium/convert/html (Split Intervals) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -585,6 +588,8 @@ Feature: /forms/chromium/convert/html """ # See https://github.com/gotenberg/gotenberg/issues/1130. + @split + @output-filename Scenario: POST /forms/chromium/convert/html (Split Output Filename) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -614,6 +619,7 @@ Feature: /forms/chromium/convert/html Page 3 """ + @split Scenario: POST /forms/chromium/convert/html (Split Pages) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -637,6 +643,7 @@ Feature: /forms/chromium/convert/html Page 3 """ + @split Scenario: POST /forms/chromium/convert/html (Split Pages & Unify) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -660,6 +667,7 @@ Feature: /forms/chromium/convert/html Page 3 """ + @split Scenario: POST /forms/chromium/convert/html (Split Many PDFs - Lot of Pages) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -693,6 +701,7 @@ Feature: /forms/chromium/convert/html Page 12 """ + @convert Scenario: POST /forms/chromium/convert/html (PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -705,6 +714,8 @@ Feature: /forms/chromium/convert/html Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @convert + @split Scenario: POST /forms/chromium/convert/html (Split & PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -737,6 +748,9 @@ Feature: /forms/chromium/convert/html Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) # See https://github.com/gotenberg/gotenberg/issues/1130. + @convert + @split + @output-filename Scenario: POST /forms/chromium/convert/html (Split & PDF/A-1b & PDF/UA-1 & Output Filename) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -770,6 +784,7 @@ Feature: /forms/chromium/convert/html Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @metadata Scenario: POST /forms/chromium/convert/html (Metadata) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -805,6 +820,7 @@ Feature: /forms/chromium/convert/html } """ + @flatten Scenario: POST /forms/chromium/convert/html (Flatten) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -815,6 +831,7 @@ Feature: /forms/chromium/convert/html Then there should be 1 PDF(s) in the response Then the response PDF(s) should be flatten + @encrypt Scenario: POST /forms/chromium/convert/html (Encrypt - user password only) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -825,6 +842,7 @@ Feature: /forms/chromium/convert/html Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @encrypt Scenario: POST /forms/chromium/convert/html (Encrypt - both user and owner passwords) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): @@ -836,8 +854,28 @@ Feature: /forms/chromium/convert/html Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @embed + Scenario: POST /forms/chromium/convert/html (Embeds) + Given I have a default Gotenberg container + When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): + | files | testdata/page-1-html/index.html | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | Gotenberg-Output-Filename | foo | header | + Then the response status code should be 200 + Then the response header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the response + Then there should be the following file(s) in the response: + | foo.pdf | + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + # FIXME: once decrypt is done, add encrypt and check after the content of the PDF. - Scenario: POST /forms/chromium/convert/html (PDF/A-1b & PDF/UA-1 & Metadata & Flatten) + @convert + @metadata + @flatten + @embed + Scenario: POST /forms/chromium/convert/html (PDF/A-1b & PDF/UA-1 & Metadata & Flatten & Embeds) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): | files | testdata/page-1-html/index.html | file | @@ -845,15 +883,19 @@ Feature: /forms/chromium/convert/html | pdfua | true | field | | metadata | {"Author":"Julien Neuhart","Copyright":"Julien Neuhart","CreateDate":"2006-09-18T16:27:50-04:00","Creator":"Gotenberg","Keywords":["first","second"],"Marked":true,"ModDate":"2006-09-18T16:27:50-04:00","PDFVersion":1.7,"Producer":"Gotenberg","Subject":"Sample","Title":"Sample","Trapped":"Unknown"} | field | | flatten | true | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | | Gotenberg-Output-Filename | foo | header | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" Then there should be 1 PDF(s) in the response Then there should be the following file(s) in the response: | foo.pdf | - Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 7 failed rule(s) + Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 9 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 2 failed rule(s) Then the response PDF(s) should be flatten + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/read" endpoint with the following form data and header(s): | files | teststore/foo.pdf | file | Then the response status code should be 200 @@ -896,6 +938,7 @@ Feature: /forms/chromium/convert/html Then the Gotenberg container should log the following entries: | "trace":"forms_chromium_convert_html" | + @download-from Scenario: POST /forms/chromium/convert/html (Download From) Given I have a default Gotenberg container Given I have a static server @@ -905,6 +948,7 @@ Feature: /forms/chromium/convert/html Then the file request header "X-Foo" should be "bar" Then the response header "Content-Type" should be "application/pdf" + @webhook Scenario: POST /forms/chromium/convert/html (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -942,19 +986,3 @@ Feature: /forms/chromium/convert/html | files | testdata/page-1-html/index.html | file | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" - - @embed - Scenario: POST /forms/chromium/convert/html (Embeds) - Given I have a default Gotenberg container - When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/html" endpoint with the following form data and header(s): - | files | testdata/page-1-html/index.html | file | - | embeds | testdata/embed_1.xml | file | - | embeds | testdata/embed_2.xml | file | - | Gotenberg-Output-Filename | foo | header | - Then the response status code should be 200 - And the response header "Content-Type" should be "application/pdf" - And there should be 1 PDF(s) in the response - And there should be the following file(s) in the response: - | foo.pdf | - And the "foo.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "foo.pdf" PDF should have the "embed_2.xml" file embedded in it diff --git a/test/integration/features/chromium_convert_markdown.feature b/test/integration/features/chromium_convert_markdown.feature index e70eb85d..ca2ae42d 100644 --- a/test/integration/features/chromium_convert_markdown.feature +++ b/test/integration/features/chromium_convert_markdown.feature @@ -1,6 +1,8 @@ # TODO: # 1. JavaScript disabled on some feature. +@chromium +@chromium-convert-markdown Feature: /forms/chromium/convert/markdown Scenario: POST /forms/chromium/convert/markdown (Default) @@ -648,6 +650,7 @@ Feature: /forms/chromium/convert/markdown Invalid form data: form field 'metadata' is invalid (got 'foo', resulting to unmarshal metadata: invalid character 'o' in literal false (expecting 'a')) """ + @split Scenario: POST /forms/chromium/convert/markdown (Split Intervals) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -679,6 +682,8 @@ Feature: /forms/chromium/convert/markdown """ # See https://github.com/gotenberg/gotenberg/issues/1130. + @split + @output-filename Scenario: POST /forms/chromium/convert/markdown (Split Output Filename) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -711,6 +716,7 @@ Feature: /forms/chromium/convert/markdown Page 3 """ + @split Scenario: POST /forms/chromium/convert/markdown (Split Pages) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -737,6 +743,7 @@ Feature: /forms/chromium/convert/markdown Page 3 """ + @split Scenario: POST /forms/chromium/convert/markdown (Split Pages & Unify) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -763,6 +770,7 @@ Feature: /forms/chromium/convert/markdown Page 3 """ + @split Scenario: POST /forms/chromium/convert/markdown (Split Many PDFs - Lot of Pages) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -808,6 +816,7 @@ Feature: /forms/chromium/convert/markdown Page 12 """ + @convert Scenario: POST /forms/chromium/convert/markdown (PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -821,6 +830,8 @@ Feature: /forms/chromium/convert/markdown Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @convert + @split Scenario: POST /forms/chromium/convert/markdown (Split & PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -856,6 +867,9 @@ Feature: /forms/chromium/convert/markdown Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) # See https://github.com/gotenberg/gotenberg/issues/1130. + @convert + @split + @output-filename Scenario: POST /forms/chromium/convert/markdown (Split & PDF/A-1b & PDF/UA-1 & Output Filename) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -892,6 +906,7 @@ Feature: /forms/chromium/convert/markdown Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @metadata Scenario: POST /forms/chromium/convert/markdown (Metadata) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -928,6 +943,7 @@ Feature: /forms/chromium/convert/markdown } """ + @flatten Scenario: POST /forms/chromium/convert/markdown (Flatten) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -939,6 +955,7 @@ Feature: /forms/chromium/convert/markdown Then there should be 1 PDF(s) in the response Then the response PDF(s) should be flatten + @encrypt Scenario: POST /forms/chromium/convert/markdown (Encrypt - user password only) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -950,6 +967,7 @@ Feature: /forms/chromium/convert/markdown Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @encrypt Scenario: POST /forms/chromium/convert/markdown (Encrypt - both user and owner passwords) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): @@ -962,8 +980,29 @@ Feature: /forms/chromium/convert/markdown Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @embed + Scenario: POST /forms/chromium/convert/markdown (Embeds) + Given I have a default Gotenberg container + When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): + | files | testdata/page-1-markdown/index.html | file | + | files | testdata/page-1-markdown/page_1.md | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | Gotenberg-Output-Filename | foo | header | + Then the response status code should be 200 + Then the response header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the response + Then there should be the following file(s) in the response: + | foo.pdf | + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + # FIXME: once decrypt is done, add encrypt and check after the content of the PDF. - Scenario: POST /forms/chromium/convert/markdown (PDF/A-1b & PDF/UA-1 & Metadata & Flatten) + @convert + @metadata + @flatten + @embed + Scenario: POST /forms/chromium/convert/markdown (PDF/A-1b & PDF/UA-1 & Metadata & Flatten & Embeds) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): | files | testdata/page-1-markdown/index.html | file | @@ -972,15 +1011,19 @@ Feature: /forms/chromium/convert/markdown | pdfua | true | field | | metadata | {"Author":"Julien Neuhart","Copyright":"Julien Neuhart","CreateDate":"2006-09-18T16:27:50-04:00","Creator":"Gotenberg","Keywords":["first","second"],"Marked":true,"ModDate":"2006-09-18T16:27:50-04:00","PDFVersion":1.7,"Producer":"Gotenberg","Subject":"Sample","Title":"Sample","Trapped":"Unknown"} | field | | flatten | true | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | | Gotenberg-Output-Filename | foo | header | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" Then there should be 1 PDF(s) in the response Then there should be the following file(s) in the response: | foo.pdf | - Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 7 failed rule(s) + Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 9 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 2 failed rule(s) Then the response PDF(s) should be flatten + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/read" endpoint with the following form data and header(s): | files | teststore/foo.pdf | file | Then the response status code should be 200 @@ -1025,6 +1068,7 @@ Feature: /forms/chromium/convert/markdown Then the Gotenberg container should log the following entries: | "trace":"forms_chromium_convert_html" | + @download-from Scenario: POST /forms/chromium/convert/markdown (Download From) Given I have a default Gotenberg container Given I have a static server @@ -1035,6 +1079,7 @@ Feature: /forms/chromium/convert/markdown Then the file request header "X-Foo" should be "bar" Then the response header "Content-Type" should be "application/pdf" + @webhook Scenario: POST /forms/chromium/convert/markdown (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -1075,20 +1120,3 @@ Feature: /forms/chromium/convert/markdown | files | testdata/page-1-markdown/page_1.md | file | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" - - @embed - Scenario: POST /forms/chromium/convert/markdown (Embeds) - Given I have a default Gotenberg container - When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/markdown" endpoint with the following form data and header(s): - | files | testdata/page-1-markdown/index.html | file | - | files | testdata/page-1-markdown/page_1.md | file | - | embeds | testdata/embed_1.xml | file | - | embeds | testdata/embed_2.xml | file | - | Gotenberg-Output-Filename | foo | header | - Then the response status code should be 200 - And the response header "Content-Type" should be "application/pdf" - And there should be 1 PDF(s) in the response - And there should be the following file(s) in the response: - | foo.pdf | - And the "foo.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "foo.pdf" PDF should have the "embed_2.xml" file embedded in it diff --git a/test/integration/features/chromium_convert_url.feature b/test/integration/features/chromium_convert_url.feature index 786caa8b..bcb7013f 100644 --- a/test/integration/features/chromium_convert_url.feature +++ b/test/integration/features/chromium_convert_url.feature @@ -1,6 +1,8 @@ # TODO: # 1. JavaScript disabled on some feature. +@chromium +@chromium-convert-url Feature: /forms/chromium/convert/url Scenario: POST /forms/chromium/convert/url (Default) @@ -646,6 +648,7 @@ Feature: /forms/chromium/convert/url Invalid form data: form field 'metadata' is invalid (got 'foo', resulting to unmarshal metadata: invalid character 'o' in literal false (expecting 'a')) """ + @split Scenario: POST /forms/chromium/convert/url (Split Intervals) Given I have a default Gotenberg container Given I have a static server @@ -675,6 +678,8 @@ Feature: /forms/chromium/convert/url """ # See https://github.com/gotenberg/gotenberg/issues/1130. + @split + @output-filename Scenario: POST /forms/chromium/convert/url (Split Output Filename) Given I have a default Gotenberg container Given I have a static server @@ -705,6 +710,7 @@ Feature: /forms/chromium/convert/url Page 3 """ + @split Scenario: POST /forms/chromium/convert/url (Split Pages) Given I have a default Gotenberg container Given I have a static server @@ -729,6 +735,7 @@ Feature: /forms/chromium/convert/url Page 3 """ + @split Scenario: POST /forms/chromium/convert/url (Split Pages & Unify) Given I have a default Gotenberg container Given I have a static server @@ -753,6 +760,7 @@ Feature: /forms/chromium/convert/url Page 3 """ + @split Scenario: POST /forms/chromium/convert/url (Split Many PDFs - Lot of Pages) Given I have a default Gotenberg container Given I have a static server @@ -787,6 +795,7 @@ Feature: /forms/chromium/convert/url Page 12 """ + @convert Scenario: POST /forms/chromium/convert/url (PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container Given I have a static server @@ -833,6 +842,9 @@ Feature: /forms/chromium/convert/url Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) # See https://github.com/gotenberg/gotenberg/issues/1130. + @convert + @split + @output-filename Scenario: POST /forms/chromium/convert/url (Split & PDF/A-1b & PDF/UA-1 & Output Filename) Given I have a default Gotenberg container Given I have a static server @@ -867,6 +879,7 @@ Feature: /forms/chromium/convert/url Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @metadata Scenario: POST /forms/chromium/convert/url (Metadata) Given I have a default Gotenberg container Given I have a static server @@ -903,6 +916,7 @@ Feature: /forms/chromium/convert/url } """ + @flatten Scenario: POST /forms/chromium/convert/url (Flatten) Given I have a default Gotenberg container Given I have a static server @@ -914,6 +928,7 @@ Feature: /forms/chromium/convert/url Then there should be 1 PDF(s) in the response Then the response PDF(s) should be flatten + @encrypt Scenario: POST /forms/chromium/convert/url (Encrypt - user password only) Given I have a default Gotenberg container Given I have a static server @@ -925,6 +940,7 @@ Feature: /forms/chromium/convert/url Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @encrypt Scenario: POST /forms/chromium/convert/url (Encrypt - both user and owner passwords) Given I have a default Gotenberg container Given I have a static server @@ -937,7 +953,28 @@ Feature: /forms/chromium/convert/url Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @embed + Scenario: POST /foo/forms/chromium/convert/url (Embeds) + Given I have a default Gotenberg container + Given I have a static server + When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/url" endpoint with the following form data and header(s): + | url | http://host.docker.internal:%d/html/testdata/page-1-html/index.html | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | Gotenberg-Output-Filename | foo | header | + Then the response status code should be 200 + Then the response header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the response + Then there should be the following file(s) in the webhook request: + | foo.pdf | + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + # FIXME: once decrypt is done, add encrypt and check after the content of the PDF. + @convert + @metadata + @flatten + @embed Scenario: POST /forms/chromium/convert/url (PDF/A-1b & PDF/UA-1 & Metadata & Flatten) Given I have a default Gotenberg container Given I have a static server @@ -947,15 +984,19 @@ Feature: /forms/chromium/convert/url | pdfua | true | field | | metadata | {"Author":"Julien Neuhart","Copyright":"Julien Neuhart","CreateDate":"2006-09-18T16:27:50-04:00","Creator":"Gotenberg","Keywords":["first","second"],"Marked":true,"ModDate":"2006-09-18T16:27:50-04:00","PDFVersion":1.7,"Producer":"Gotenberg","Subject":"Sample","Title":"Sample","Trapped":"Unknown"} | field | | flatten | true | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | | Gotenberg-Output-Filename | foo | header | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" Then there should be 1 PDF(s) in the response Then there should be the following file(s) in the response: | foo.pdf | - Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 7 failed rule(s) + Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 9 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 2 failed rule(s) Then the response PDF(s) should be flatten + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/read" endpoint with the following form data and header(s): | files | teststore/foo.pdf | file | Then the response status code should be 200 @@ -1000,6 +1041,7 @@ Feature: /forms/chromium/convert/url Then the Gotenberg container should log the following entries: | "trace":"forms_chromium_convert_url" | + @webhook Scenario: POST /forms/chromium/convert/url (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -1039,20 +1081,3 @@ Feature: /forms/chromium/convert/url | url | http://host.docker.internal:%d/html/testdata/page-1-html/index.html | field | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" - - @embed - Scenario: POST /foo/forms/chromium/convert/url (Embeds) - Given I have a default Gotenberg container - And I have a static server - When I make a "POST" request to Gotenberg at the "/forms/chromium/convert/url" endpoint with the following form data and header(s): - | embeds | testdata/embed_1.xml | file | - | embeds | testdata/embed_2.xml | file | - | url | http://host.docker.internal:%d/html/testdata/page-1-html/index.html | field | - | Gotenberg-Output-Filename | foo | header | - Then the response status code should be 200 - And the response header "Content-Type" should be "application/pdf" - And there should be 1 PDF(s) in the response - And there should be the following file(s) in the webhook request: - | foo.pdf | - And the "foo.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "foo.pdf" PDF should have the "embed_2.xml" file embedded in it diff --git a/test/integration/features/debug.feature b/test/integration/features/debug.feature index 8bc0de34..b3f96604 100644 --- a/test/integration/features/debug.feature +++ b/test/integration/features/debug.feature @@ -1,3 +1,4 @@ +@debug Feature: /debug Scenario: GET /debug (Disabled) diff --git a/test/integration/features/health.feature b/test/integration/features/health.feature index 887808f8..81ae4b75 100644 --- a/test/integration/features/health.feature +++ b/test/integration/features/health.feature @@ -2,6 +2,7 @@ # 1. Check if down for each module. # 2. Restarting modules do not make health check fail. +@health Feature: /health Scenario: GET /health diff --git a/test/integration/features/libreoffice_convert.feature b/test/integration/features/libreoffice_convert.feature index 84ffb04d..13279a71 100644 --- a/test/integration/features/libreoffice_convert.feature +++ b/test/integration/features/libreoffice_convert.feature @@ -1,3 +1,5 @@ +@libreoffice +@libreoffice-convert Feature: /forms/libreoffice/convert Scenario: POST /forms/libreoffice/convert (Single Document) @@ -272,6 +274,7 @@ Feature: /forms/libreoffice/convert Invalid form data: form field 'metadata' is invalid (got 'foo', resulting to unmarshal metadata: invalid character 'o' in literal false (expecting 'a')) """ + @merge Scenario: POST /forms/libreoffice/convert (Merge) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -294,6 +297,8 @@ Feature: /forms/libreoffice/convert Page 2 """ + @merge + @split Scenario: POST /forms/libreoffice/convert (Merge & Split) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -319,6 +324,7 @@ Feature: /forms/libreoffice/convert Page 2 """ + @split Scenario: POST /forms/libreoffice/convert (Split Intervals) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -346,6 +352,7 @@ Feature: /forms/libreoffice/convert Page 3 """ + @split Scenario: POST /forms/libreoffice/convert (Split Pages) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -369,6 +376,7 @@ Feature: /forms/libreoffice/convert Page 3 """ + @split Scenario: POST /forms/libreoffice/convert (Split Pages & Unify) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -391,6 +399,7 @@ Feature: /forms/libreoffice/convert Page 3 """ + @split Scenario: POST /forms/libreoffice/convert (Split Many PDFs - Lot of Pages) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -438,6 +447,7 @@ Feature: /forms/libreoffice/convert Page 12 """ + @convert Scenario: POST /forms/libreoffice/convert (PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -450,6 +460,8 @@ Feature: /forms/libreoffice/convert Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @split + @convert Scenario: POST /forms/libreoffice/convert (Split & PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -481,6 +493,7 @@ Feature: /forms/libreoffice/convert Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @metadata Scenario: POST /forms/libreoffice/convert (Metadata) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -516,6 +529,7 @@ Feature: /forms/libreoffice/convert } """ + @flatten Scenario: POST /forms/libreoffice/convert (Flatten) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -526,6 +540,7 @@ Feature: /forms/libreoffice/convert Then there should be 1 PDF(s) in the response Then the response PDF(s) should be flatten + @encrypt Scenario: POST /forms/libreoffice/convert (Encrypt - user password only) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -536,6 +551,7 @@ Feature: /forms/libreoffice/convert Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @encrypt Scenario: POST /forms/libreoffice/convert (Encrypt - both user and owner passwords) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): @@ -547,23 +563,48 @@ Feature: /forms/libreoffice/convert Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @embed + Scenario: POST /forms/libreoffice/convert (Embeds) + Given I have a default Gotenberg container + When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): + | files | testdata/page_1.docx | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | Gotenberg-Output-Filename | foo | header | + Then the response status code should be 200 + Then the response header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the response + Then there should be the following file(s) in the response: + | foo.pdf | + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + # FIXME: once decrypt is done, add encrypt and check after the content of the PDF. - Scenario: POST /forms/libreoffice/convert (PDF/A-1b & PDF/UA-1 & Metadata & Flatten) + @convert + @metadata + @flatten + @embed + Scenario: POST /forms/libreoffice/convert (PDF/A-1b & PDF/UA-1 & Metadata & Flatten & Embeds) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): | files | testdata/page_1.docx | file | | pdfa | PDF/A-1b | field | | pdfua | true | field | | metadata | {"Author":"Julien Neuhart","Copyright":"Julien Neuhart","CreateDate":"2006-09-18T16:27:50-04:00","Creator":"Gotenberg","Keywords":["first","second"],"Marked":true,"ModDate":"2006-09-18T16:27:50-04:00","PDFVersion":1.7,"Producer":"Gotenberg","Subject":"Sample","Title":"Sample","Trapped":"Unknown"} | field | + | flatten | true | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | | Gotenberg-Output-Filename | foo | header | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" Then there should be 1 PDF(s) in the response Then there should be the following file(s) in the response: | foo.pdf | - Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 7 failed rule(s) + Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 10 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 2 failed rule(s) Then the response PDF(s) should be flatten + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/read" endpoint with the following form data and header(s): | files | teststore/foo.pdf | file | Then the response status code should be 200 @@ -606,6 +647,7 @@ Feature: /forms/libreoffice/convert Then the Gotenberg container should log the following entries: | "trace":"forms_libreoffice_convert" | + @download-from Scenario: POST /forms/libreoffice/convert (Download From) Given I have a default Gotenberg container Given I have a static server @@ -615,6 +657,7 @@ Feature: /forms/libreoffice/convert Then the file request header "X-Foo" should be "bar" Then the response header "Content-Type" should be "application/pdf" + @webhook Scenario: POST /forms/libreoffice/convert (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -652,19 +695,3 @@ Feature: /forms/libreoffice/convert | files | testdata/page_1.docx | file | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" - - @embed - Scenario: POST /forms/libreoffice/convert (Embeds) - Given I have a default Gotenberg container - When I make a "POST" request to Gotenberg at the "/forms/libreoffice/convert" endpoint with the following form data and header(s): - | files | testdata/page_1.docx | file | - | embeds | testdata/embed_1.xml | file | - | embeds | testdata/embed_2.xml | file | - | Gotenberg-Output-Filename | foo | header | - Then the response status code should be 200 - And the response header "Content-Type" should be "application/pdf" - And there should be 1 PDF(s) in the response - And there should be the following file(s) in the response: - | foo.pdf | - And the "foo.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "foo.pdf" PDF should have the "embed_2.xml" file embedded in it diff --git a/test/integration/features/output_filename.feature b/test/integration/features/output_filename.feature index f4f8b44c..63126786 100644 --- a/test/integration/features/output_filename.feature +++ b/test/integration/features/output_filename.feature @@ -1,3 +1,4 @@ +@output-filename Feature: Output Filename Scenario: Default (Single Output File) diff --git a/test/integration/features/pdfengines_convert.feature b/test/integration/features/pdfengines_convert.feature index 5ae0fd3e..e2157eb5 100644 --- a/test/integration/features/pdfengines_convert.feature +++ b/test/integration/features/pdfengines_convert.feature @@ -1,6 +1,8 @@ # TODO: # 1. PDF/UA-2. +@pdfengines +@pdfengines-convert Feature: /forms/pdfengines/convert Scenario: POST /forms/pdfengines/convert (Single PDF/A-1b) @@ -115,6 +117,7 @@ Feature: /forms/pdfengines/convert Then the Gotenberg container should log the following entries: | "trace":"forms_pdfengines_convert" | + @output-filename Scenario: POST /forms/pdfengines/convert (Output Filename - Single PDF) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/convert" endpoint with the following form data and header(s): @@ -126,6 +129,7 @@ Feature: /forms/pdfengines/convert Then there should be the following file(s) in the response: | foo.pdf | + @output-filename Scenario: POST /forms/pdfengines/convert (Output Filename - Many PDFs) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/convert" endpoint with the following form data and header(s): @@ -140,6 +144,7 @@ Feature: /forms/pdfengines/convert | page_1.pdf | | page_2.pdf | + @download-from Scenario: POST /forms/pdfengines/convert (Download From) Given I have a default Gotenberg container Given I have a static server @@ -150,6 +155,7 @@ Feature: /forms/pdfengines/convert Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" + @webhook Scenario: POST /forms/pdfengines/convert (Webhook) Given I have a default Gotenberg container Given I have a webhook server diff --git a/test/integration/features/pdfengines_embed.feature b/test/integration/features/pdfengines_embed.feature index 4ae4046d..4bf9ca7b 100644 --- a/test/integration/features/pdfengines_embed.feature +++ b/test/integration/features/pdfengines_embed.feature @@ -1,3 +1,5 @@ +@pdfengines +@pdfengines-embed @embed Feature: /forms/pdfengines/embed @@ -7,26 +9,64 @@ Feature: /forms/pdfengines/embed | files | testdata/page_1.pdf | file | | embeds | testdata/embed_1.xml | file | | embeds | testdata/embed_2.xml | file | - | embeds | testdata/page_2.pdf | file | Then the response status code should be 200 - And the response header "Content-Type" should be "application/pdf" - And there should be 1 PDF(s) in the response - And there should be the following file(s) in the response: + Then the response header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the response + Then there should be the following file(s) in the response: | page_1.pdf | - And the "page_1.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "page_1.pdf" PDF should have the "embed_2.xml" file embedded in it - And the "page_1.pdf" PDF should have the "page_2.pdf" file embedded in it + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + @download-from Scenario: POST /forms/pdfengines/embed with (Download From) Given I have a default Gotenberg container - And I have a static server + Given I have a static server When I make a "POST" request to Gotenberg at the "/forms/pdfengines/embed" endpoint with the following form data and header(s): - | files | testdata/page_1.pdf | file | - | downloadFrom | [{"url":"http://host.docker.internal:%d/static/testdata/embed_1.xml", "embedded": true},{"url":"http://host.docker.internal:%d/static/testdata/embed_2.xml", "embedded": false}] | field | + | files | testdata/page_1.pdf | file | + | downloadFrom | [{"url":"http://host.docker.internal:%d/static/testdata/embed_1.xml","embedded": true},{"url":"http://host.docker.internal:%d/static/testdata/embed_2.xml","embedded": false}] | field | Then the response status code should be 200 - And the response header "Content-Type" should be "application/pdf" - And there should be 1 PDF(s) in the response - And there should be the following file(s) in the response: + Then the response header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the response + Then there should be the following file(s) in the response: | page_1.pdf | - And the "page_1.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "page_1.pdf" PDF should NOT have the "embed_2.xml" file embedded in it + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should NOT have the "embed_2.xml" file embedded + + @webhook + Scenario: POST /forms/pdfengines/embed (Webhook) + Given I have a default Gotenberg container + Given I have a webhook server + When I make a "POST" request to Gotenberg at the "/forms/pdfengines/embed" endpoint with the following form data and header(s): + | files | testdata/page_1.pdf | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | Gotenberg-Webhook-Url | http://host.docker.internal:%d/webhook | header | + | Gotenberg-Webhook-Error-Url | http://host.docker.internal:%d/webhook/error | header | + Then the response status code should be 204 + When I wait for the asynchronous request to the webhook + Then the webhook request header "Content-Type" should be "application/pdf" + Then there should be 1 PDF(s) in the webhook request + Then the webhook request PDF(s) should have the "embed_1.xml" file embedded + Then the webhook request PDF(s) should have the "embed_2.xml" file embedded + + Scenario: POST /forms/pdfengines/embed (Basic Auth) + Given I have a Gotenberg container with the following environment variable(s): + | API_ENABLE_BASIC_AUTH | true | + | GOTENBERG_API_BASIC_AUTH_USERNAME | foo | + | GOTENBERG_API_BASIC_AUTH_PASSWORD | bar | + When I make a "POST" request to Gotenberg at the "/forms/pdfengines/embed" endpoint with the following form data and header(s): + | files | testdata/page_1.pdf | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + Then the response status code should be 401 + + Scenario: POST /foo/forms/pdfengines/embed (Root Path) + Given I have a Gotenberg container with the following environment variable(s): + | API_ENABLE_DEBUG_ROUTE | true | + | API_ROOT_PATH | /foo/ | + When I make a "POST" request to Gotenberg at the "/foo/forms/pdfengines/embed" endpoint with the following form data and header(s): + | files | testdata/page_1.pdf | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + Then the response status code should be 200 + Then the response header "Content-Type" should be "application/pdf" diff --git a/test/integration/features/pdfengines_encrypt.feature b/test/integration/features/pdfengines_encrypt.feature index 6ed48f12..0a072c7e 100644 --- a/test/integration/features/pdfengines_encrypt.feature +++ b/test/integration/features/pdfengines_encrypt.feature @@ -1,3 +1,6 @@ +@pdfengines +@pdfengines-encrypt +@encrypt Feature: /forms/pdfengines/encrypt Scenario: POST /forms/pdfengines/encrypt (default - user password only) @@ -132,6 +135,7 @@ Feature: /forms/pdfengines/encrypt Then the Gotenberg container should log the following entries: | "trace":"forms_pdfengines_encrypt" | + @download-from Scenario: POST /forms/pdfengines/encrypt (Download From) Given I have a default Gotenberg container Given I have a static server @@ -143,6 +147,7 @@ Feature: /forms/pdfengines/encrypt Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @webhook Scenario: POST /forms/pdfengines/encrypt (Webhook) Given I have a default Gotenberg container Given I have a webhook server diff --git a/test/integration/features/pdfengines_flatten.feature b/test/integration/features/pdfengines_flatten.feature index 96804dbd..11529a73 100644 --- a/test/integration/features/pdfengines_flatten.feature +++ b/test/integration/features/pdfengines_flatten.feature @@ -1,3 +1,6 @@ +@pdfengines +@pdfengines-flatten +@flatten Feature: /forms/pdfengines/flatten Scenario: POST /forms/pdfengines/flatten (Single PDF) @@ -48,6 +51,7 @@ Feature: /forms/pdfengines/flatten Then the Gotenberg container should log the following entries: | "trace":"forms_pdfengines_flatten" | + @output-filename Scenario: POST /forms/pdfengines/flatten (Output Filename - Single PDF) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/flatten" endpoint with the following form data and header(s): @@ -58,6 +62,7 @@ Feature: /forms/pdfengines/flatten Then there should be the following file(s) in the response: | foo.pdf | + @output-filename Scenario: POST /forms/pdfengines/flatten (Output Filename - Many PDFs) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/flatten" endpoint with the following form data and header(s): @@ -71,6 +76,7 @@ Feature: /forms/pdfengines/flatten | page_1.pdf | | page_2.pdf | + @download-from Scenario: POST /forms/pdfengines/flatten (Download From) Given I have a default Gotenberg container Given I have a static server @@ -81,6 +87,7 @@ Feature: /forms/pdfengines/flatten Then the response header "Content-Type" should be "application/pdf" Then the response PDF(s) should be flatten + @webhook Scenario: POST /forms/pdfengines/flatten (Webhook) Given I have a default Gotenberg container Given I have a webhook server diff --git a/test/integration/features/pdfengines_merge.feature b/test/integration/features/pdfengines_merge.feature index 25a61104..bb520c78 100644 --- a/test/integration/features/pdfengines_merge.feature +++ b/test/integration/features/pdfengines_merge.feature @@ -1,3 +1,6 @@ +@pdfengines +@pdfengines-encrypt +@merge Feature: /forms/pdfengines/merge Scenario: POST /forms/pdfengines/merge (default) @@ -128,6 +131,7 @@ Feature: /forms/pdfengines/merge Invalid form data: form field 'metadata' is invalid (got 'foo', resulting to unmarshal metadata: invalid character 'o' in literal false (expecting 'a')) """ + @convert Scenario: POST /forms/pdfengines/merge (PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): @@ -153,6 +157,7 @@ Feature: /forms/pdfengines/merge Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @metadata Scenario: POST /forms/pdfengines/merge (Metadata) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): @@ -198,6 +203,7 @@ Feature: /forms/pdfengines/merge } """ + @flatten Scenario: POST /forms/pdfengines/merge (Flatten) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): @@ -221,6 +227,7 @@ Feature: /forms/pdfengines/merge """ Then the response PDF(s) should be flatten + @encrypt Scenario: POST /forms/pdfengines/merge (Encrypt - user password only) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): @@ -232,6 +239,7 @@ Feature: /forms/pdfengines/merge Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @encrypt Scenario: POST /forms/pdfengines/merge (Encrypt - both user and owner passwords) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): @@ -244,8 +252,25 @@ Feature: /forms/pdfengines/merge Then there should be 1 PDF(s) in the response Then the response PDF(s) should be encrypted + @embed + Scenario: POST /foo/forms/pdfengines/merge (Embeds) + Given I have a default Gotenberg container + When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): + | files | testdata/page_1.pdf | file | + | files | testdata/page_2.pdf | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | Gotenberg-Output-Filename | foo | header | + Then the response status code should be 200 + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + # FIXME: once decrypt is done, add encrypt and check after the content of the PDF. - Scenario: POST /forms/pdfengines/merge (PDF/A-1b & PDF/UA-1 & Metadata & Flatten) + @convert + @metadata + @flatten + @embed + Scenario: POST /forms/pdfengines/merge (PDF/A-1b & PDF/UA-1 & Metadata & Flatten & Embeds) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): | files | testdata/page_1.pdf | file | @@ -254,6 +279,8 @@ Feature: /forms/pdfengines/merge | pdfua | true | field | | metadata | {"Author":"Julien Neuhart","Copyright":"Julien Neuhart","CreateDate":"2006-09-18T16:27:50-04:00","Creator":"Gotenberg","Keywords":["first","second"],"Marked":true,"ModDate":"2006-09-18T16:27:50-04:00","PDFVersion":1.7,"Producer":"Gotenberg","Subject":"Sample","Title":"Sample","Trapped":"Unknown"} | field | | flatten | true | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | | Gotenberg-Output-Filename | foo | header | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" @@ -269,9 +296,11 @@ Feature: /forms/pdfengines/merge """ Page 2 """ - Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 7 failed rule(s) + Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 10 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 2 failed rule(s) Then the response PDF(s) should be flatten + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/read" endpoint with the following form data and header(s): | files | teststore/foo.pdf | file | Then the response status code should be 200 @@ -316,6 +345,7 @@ Feature: /forms/pdfengines/merge Then the Gotenberg container should log the following entries: | "trace":"forms_pdfengines_merge" | + @download-from Scenario: POST /forms/pdfengines/merge (Download From) Given I have a default Gotenberg container Given I have a static server @@ -324,6 +354,7 @@ Feature: /forms/pdfengines/merge Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" + @webhook Scenario: POST /forms/pdfengines/merge (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -368,16 +399,3 @@ Feature: /forms/pdfengines/merge | files | testdata/page_2.pdf | file | Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" - - @embed - Scenario: POST /foo/forms/pdfengines/merge (Embeds) - Given I have a default Gotenberg container - When I make a "POST" request to Gotenberg at the "/forms/pdfengines/merge" endpoint with the following form data and header(s): - | files | testdata/page_1.pdf | file | - | files | testdata/page_2.pdf | file | - | embeds | testdata/embed_1.xml | file | - | embeds | testdata/embed_2.xml | file | - | Gotenberg-Output-Filename | foo | header | - Then the response status code should be 200 - And the "foo.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "foo.pdf" PDF should have the "embed_2.xml" file embedded in it diff --git a/test/integration/features/pdfengines_metadata.feature b/test/integration/features/pdfengines_metadata.feature index 9c75588d..336c3507 100644 --- a/test/integration/features/pdfengines_metadata.feature +++ b/test/integration/features/pdfengines_metadata.feature @@ -1,3 +1,6 @@ +@pdfengines +@pdfengines-metadata +@metadata Feature: /forms/pdfengines/{write|read} Scenario: POST /forms/pdfengines/metadata/{write|read} (Single PDF) @@ -151,6 +154,7 @@ Feature: /forms/pdfengines/{write|read} Then the Gotenberg container should log the following entries: | "trace":"forms_pdfengines_metadata_read" | + @output-filename Scenario: POST /forms/pdfengines/metadata/write (Output Filename - Single PDF) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/write" endpoint with the following form data and header(s): @@ -162,6 +166,7 @@ Feature: /forms/pdfengines/{write|read} Then there should be the following file(s) in the response: | foo.pdf | + @output-filename Scenario: POST /forms/pdfengines/metadata/write (Output Filename - Many PDFs) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/write" endpoint with the following form data and header(s): @@ -176,6 +181,7 @@ Feature: /forms/pdfengines/{write|read} | page_1.pdf | | page_2.pdf | + @download-from Scenario: POST /forms/pdfengines/metadata/write (Download From) Given I have a default Gotenberg container Given I have a static server @@ -187,6 +193,7 @@ Feature: /forms/pdfengines/{write|read} Then the response status code should be 200 Then the response header "Content-Type" should be "application/pdf" + @download-from Scenario: POST /forms/pdfengines/metadata/read (Download From) Given I have a default Gotenberg container Given I have a static server @@ -196,6 +203,7 @@ Feature: /forms/pdfengines/{write|read} Then the response status code should be 200 Then the response header "Content-Type" should be "application/json" + @webhook Scenario: POST /forms/pdfengines/metadata/write (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -233,6 +241,7 @@ Feature: /forms/pdfengines/{write|read} } """ + @webhook Scenario: POST /forms/pdfengines/metadata/read (Webhook) Given I have a default Gotenberg container Given I have a webhook server diff --git a/test/integration/features/pdfengines_split.feature b/test/integration/features/pdfengines_split.feature index d988510c..ae4dac4f 100644 --- a/test/integration/features/pdfengines_split.feature +++ b/test/integration/features/pdfengines_split.feature @@ -1,3 +1,6 @@ +@pdfengines +@pdfengines-split +@split Feature: /forms/pdfengines/split Scenario: POST /forms/pdfengines/split (Intervals - Default) @@ -314,6 +317,7 @@ Feature: /forms/pdfengines/split Invalid form data: form field 'metadata' is invalid (got 'foo', resulting to unmarshal metadata: invalid character 'o' in literal false (expecting 'a')) """ + @convert Scenario: POST /forms/pdfengines/split (PDF/A-1b & PDF/UA-1) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -345,6 +349,7 @@ Feature: /forms/pdfengines/split Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 1 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 3 failed rule(s) + @metadata Scenario: POST /forms/pdfengines/split (Metadata) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -411,6 +416,7 @@ Feature: /forms/pdfengines/split } """ + @flatten Scenario: POST /forms/pdfengines/split (Flatten) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -440,6 +446,7 @@ Feature: /forms/pdfengines/split """ Then the response PDF(s) should be flatten + @encrypt Scenario: POST /forms/pdfengines/split (Encrypt - user password only) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -452,6 +459,7 @@ Feature: /forms/pdfengines/split Then there should be 2 PDF(s) in the response Then the response PDF(s) should be encrypted + @encrypt Scenario: POST /forms/pdfengines/split (Encrypt - both user and owner passwords) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -465,8 +473,30 @@ Feature: /forms/pdfengines/split Then there should be 2 PDF(s) in the response Then the response PDF(s) should be encrypted + @embed + Scenario: POST /foo/forms/pdfengines/split (Embeds) + Given I have a default Gotenberg container + When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): + | files | testdata/pages_3.pdf | file | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | + | splitMode | intervals | field | + | splitSpan | 2 | field | + Then the response status code should be 200 + And the response header "Content-Type" should be "application/zip" + And there should be 2 PDF(s) in the response + And there should be the following file(s) in the response: + | pages_3_0.pdf | + | pages_3_1.pdf | + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded + # FIXME: once decrypt is done, add encrypt and check after the content of the PDFs. - Scenario: POST /forms/pdfengines/split (PDF/A-1b & PDF/UA-1 & Metadata & Flatten) + @convert + @metadata + @flatten + @embed + Scenario: POST /forms/pdfengines/split (PDF/A-1b & PDF/UA-1 & Metadata & Flatten & Embeds) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): | files | testdata/pages_3.pdf | file | @@ -476,6 +506,8 @@ Feature: /forms/pdfengines/split | pdfua | true | field | | metadata | {"Author":"Julien Neuhart","Copyright":"Julien Neuhart","CreateDate":"2006-09-18T16:27:50-04:00","Creator":"Gotenberg","Keywords":["first","second"],"Marked":true,"ModDate":"2006-09-18T16:27:50-04:00","PDFVersion":1.7,"Producer":"Gotenberg","Subject":"Sample","Title":"Sample","Trapped":"Unknown"} | field | | flatten | true | field | + | embeds | testdata/embed_1.xml | file | + | embeds | testdata/embed_2.xml | file | Then the response status code should be 200 Then the response header "Content-Type" should be "application/zip" Then there should be 2 PDF(s) in the response @@ -496,9 +528,11 @@ Feature: /forms/pdfengines/split """ Page 3 """ - Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 7 failed rule(s) + Then the response PDF(s) should be valid "PDF/A-1b" with a tolerance of 10 failed rule(s) Then the response PDF(s) should be valid "PDF/UA-1" with a tolerance of 2 failed rule(s) Then the response PDF(s) should be flatten + Then the response PDF(s) should have the "embed_1.xml" file embedded + Then the response PDF(s) should have the "embed_2.xml" file embedded When I make a "POST" request to Gotenberg at the "/forms/pdfengines/metadata/read" endpoint with the following form data and header(s): | files | teststore/pages_3_0.pdf | file | | files | teststore/pages_3_1.pdf | file | @@ -560,6 +594,7 @@ Feature: /forms/pdfengines/split Then the Gotenberg container should log the following entries: | "trace":"forms_pdfengines_split" | + @output-filename Scenario: POST /forms/pdfengines/split (Output Filename - Single PDF) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -573,6 +608,7 @@ Feature: /forms/pdfengines/split Then there should be the following file(s) in the response: | foo.pdf | + @output-filename Scenario: POST /forms/pdfengines/split (Output Filename - Many PDFs) Given I have a default Gotenberg container When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): @@ -587,6 +623,7 @@ Feature: /forms/pdfengines/split | pages_3_0.pdf | | pages_3_1.pdf | + @download-from Scenario: POST /forms/pdfengines/split (Download From) Given I have a default Gotenberg container Given I have a static server @@ -598,6 +635,7 @@ Feature: /forms/pdfengines/split Then the file request header "X-Foo" should be "bar" Then the response header "Content-Type" should be "application/zip" + @webhook Scenario: POST /forms/pdfengines/split (Webhook) Given I have a default Gotenberg container Given I have a webhook server @@ -650,23 +688,3 @@ Feature: /forms/pdfengines/split | splitSpan | 2 | field | Then the response status code should be 200 Then the response header "Content-Type" should be "application/zip" - - @embed - Scenario: POST /foo/forms/pdfengines/split (Embeds) - Given I have a default Gotenberg container - When I make a "POST" request to Gotenberg at the "/forms/pdfengines/split" endpoint with the following form data and header(s): - | files | testdata/pages_3.pdf | file | - | embeds | testdata/embed_1.xml | file | - | embeds | testdata/embed_2.xml | file | - | splitMode | intervals | field | - | splitSpan | 2 | field | - Then the response status code should be 200 - And the response header "Content-Type" should be "application/zip" - And there should be 2 PDF(s) in the response - And there should be the following file(s) in the response: - | pages_3_0.pdf | - | pages_3_1.pdf | - And the "pages_3_0.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "pages_3_0.pdf" PDF should have the "embed_2.xml" file embedded in it - And the "pages_3_1.pdf" PDF should have the "embed_1.xml" file embedded in it - And the "pages_3_1.pdf" PDF should have the "embed_2.xml" file embedded in it diff --git a/test/integration/features/prometheus_metrics.feature b/test/integration/features/prometheus_metrics.feature index e42c3d78..5a12402f 100644 --- a/test/integration/features/prometheus_metrics.feature +++ b/test/integration/features/prometheus_metrics.feature @@ -2,6 +2,7 @@ # 1. Count restarts. # 2. Count queue size. +@prometheus-metrics Feature: /prometheus/metrics Scenario: GET /prometheus/metrics (Enabled) diff --git a/test/integration/features/root.feature b/test/integration/features/root.feature index 9ebf0e17..a1c6f506 100644 --- a/test/integration/features/root.feature +++ b/test/integration/features/root.feature @@ -1,3 +1,4 @@ +@root Feature: / Scenario: GET / diff --git a/test/integration/features/version.feature b/test/integration/features/version.feature index b9d9ae93..02975505 100644 --- a/test/integration/features/version.feature +++ b/test/integration/features/version.feature @@ -1,3 +1,4 @@ +@version Feature: /version Scenario: GET /version diff --git a/test/integration/features/webhook.feature b/test/integration/features/webhook.feature index fa9691c7..072800eb 100644 --- a/test/integration/features/webhook.feature +++ b/test/integration/features/webhook.feature @@ -2,6 +2,7 @@ # 1. Other HTTP Methods # 2. Errors +@webhook Feature: Webhook Scenario: Default diff --git a/test/integration/scenario/scenario.go b/test/integration/scenario/scenario.go index 222bd587..64f3df11 100644 --- a/test/integration/scenario/scenario.go +++ b/test/integration/scenario/scenario.go @@ -735,41 +735,6 @@ func (s *scenario) thePdfShouldBeSetToLandscapeOrientation(ctx context.Context, return nil } -func (s *scenario) thePdfShouldHaveTheFollowingEmbedsInIt(ctx context.Context, name, should string, embed string) error { - path, err := s.getPath(name) - if err != nil { - return fmt.Errorf("get path %q: %w", name, err) - } - invert := should == "should NOT" - - cmd := []string{ - "verapdf", - "--off", - "--loglevel", - "0", - "--extract", - "embeddedFile", - name, - } - - output, err := execCommandInIntegrationToolsContainer(ctx, cmd, path) - if err != nil { - return fmt.Errorf("exec %q: %w", cmd, err) - } - - found := strings.Contains(output, fmt.Sprintf("%s", embed)) - - if invert && found { - return fmt.Errorf("embed %q found", embed) - } - - if !invert && !found { - return fmt.Errorf("embed %q not found", embed) - } - - return nil -} - func (s *scenario) thePdfShouldHaveTheFollowingContentAtPage(ctx context.Context, name, kind string, page int, expected *godog.DocString) error { var path string if !strings.HasPrefix(name, "*_") { @@ -926,6 +891,60 @@ 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")) + + _, err := os.Stat(dirPath) + if os.IsNotExist(err) { + return fmt.Errorf("directory %q does not exist", dirPath) + } + + var paths []string + err = filepath.Walk(dirPath, func(path string, info os.FileInfo, pathErr error) error { + if pathErr != nil { + return pathErr + } + if strings.EqualFold(filepath.Ext(info.Name()), ".pdf") { + paths = append(paths, path) + } + return nil + }) + if err != nil { + return fmt.Errorf("walk %q: %w", dirPath, err) + } + + invert := should == "should NOT" + + for _, path := range paths { + cmd := []string{ + "verapdf", + "--off", + "--loglevel", + "0", + "--extract", + "embeddedFile", + filepath.Base(path), + } + + output, err := execCommandInIntegrationToolsContainer(ctx, cmd, path) + if err != nil { + return fmt.Errorf("exec %q: %w", cmd, err) + } + + found := strings.Contains(output, fmt.Sprintf("%s", embed)) + + if invert && found { + return fmt.Errorf("embed %q found", embed) + } + + if !invert && !found { + return fmt.Errorf("embed %q not found", embed) + } + } + + return nil +} + func InitializeScenario(ctx *godog.ScenarioContext) { s := &scenario{} ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { @@ -959,10 +978,10 @@ 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 "([^"]*)" 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) - ctx.Then(`^the "([^"]*)" PDF (should|should NOT) have the "([^"]*)" file embedded in it$`, s.thePdfShouldHaveTheFollowingEmbedsInIt) ctx.After(func(ctx context.Context, sc *godog.Scenario, err error) (context.Context, error) { if s.gotenbergContainer != nil { errTerminate := s.gotenbergContainer.Terminate(ctx, testcontainers.StopTimeout(0))