From 6a087cb1f7f2f86d72f3661c41a7914c31dd570c Mon Sep 17 00:00:00 2001 From: Julien Neuhart Date: Fri, 14 Aug 2026 11:49:46 +0200 Subject: [PATCH] test(libreoffice): cover OOXML PowerPoint show conversion (#1626) --- .../features/libreoffice_convert.feature | 27 ++++++++++++++++++ test/integration/testdata/slideshow.ppsm | Bin 0 -> 8150 bytes test/integration/testdata/slideshow.ppsx | Bin 0 -> 8150 bytes 3 files changed, 27 insertions(+) create mode 100644 test/integration/testdata/slideshow.ppsm create mode 100644 test/integration/testdata/slideshow.ppsx diff --git a/test/integration/features/libreoffice_convert.feature b/test/integration/features/libreoffice_convert.feature index 7ae189d7..7052e604 100644 --- a/test/integration/features/libreoffice_convert.feature +++ b/test/integration/features/libreoffice_convert.feature @@ -18,6 +18,33 @@ Feature: /forms/libreoffice/convert Page 1 """ + # LibreOffice detects OOXML PowerPoint shows from content and converts them + # like .pptx; only Gotenberg's extension allow list gated them out. + # See https://github.com/gotenberg/gotenberg/pull/1626. + Scenario: POST /forms/libreoffice/convert (PowerPoint Show .ppsx) + 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/slideshow.ppsx | 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 "foo.pdf" PDF should have 1 page(s) + + Scenario: POST /forms/libreoffice/convert (PowerPoint Show .ppsm) + 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/slideshow.ppsm | 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 "foo.pdf" PDF should have 1 page(s) + # A CSV becomes a single Calc sheet named after the input file, and Calc's # default page style prints that sheet name as a centered header. Uploads are # stored under a UUID-based filename, so the UUID must not leak into the PDF. diff --git a/test/integration/testdata/slideshow.ppsm b/test/integration/testdata/slideshow.ppsm new file mode 100644 index 0000000000000000000000000000000000000000..54fb68e7331b6721444f50059e2c0111bd573fba GIT binary patch literal 8150 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 i2k~7#{VANp|Cn7>H5KQzEAW& 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 i2k~7#{VANp|Cn7>