From fd83e19ee72a72e734be591fe1fa4229201d5b46 Mon Sep 17 00:00:00 2001 From: Moritz Mahringer Date: Mon, 13 Sep 2021 15:23:53 +0200 Subject: [PATCH] Move visual tests to e2e --- .dockerignore | 2 +- .github/workflows/ci.yml | 16 +++--- .gitignore | 2 +- e2e/.dockerignore | 5 ++ e2e/.gitignore | 2 + e2e/Dockerfile | 14 +++++ .../basic.html => e2e/data/basic/index.html | 0 e2e/data/basic/reference.png | Bin 0 -> 18476 bytes e2e/data/basic/run.sh | 18 ++++++ .../fonts.html => e2e/data/fonts/index.html | 0 e2e/data/fonts/reference.png | Bin 0 -> 31567 bytes e2e/data/fonts/run.sh | 18 ++++++ .../multipart-with-image/assets}/test.png | Bin .../data/multipart-with-image/index.html | 0 e2e/data/multipart-with-image/reference.png | Bin 0 -> 45078 bytes e2e/data/multipart-with-image/run.sh | 19 ++++++ e2e/docker-compose.yml | 8 +++ e2e/regenerate | 1 + e2e/run | 1 + e2e/scripts/clean.sh | 8 +++ e2e/scripts/convert.sh | 5 ++ e2e/scripts/create_reference_or_diff.sh | 29 ++++++++++ e2e/scripts/regenerate.sh | 9 +++ e2e/scripts/run.sh | 20 +++++++ test-data/basic_0001-1.png | Bin 20802 -> 0 bytes test-data/fonts_0001-1.png | Bin 54534 -> 0 bytes test-data/multipart-with-image_0001-1.png | Bin 41513 -> 0 bytes tests/test_visual.py | 54 ------------------ 28 files changed, 168 insertions(+), 63 deletions(-) create mode 100644 e2e/.dockerignore create mode 100644 e2e/.gitignore create mode 100644 e2e/Dockerfile rename test-data/basic.html => e2e/data/basic/index.html (100%) create mode 100644 e2e/data/basic/reference.png create mode 100755 e2e/data/basic/run.sh rename test-data/fonts.html => e2e/data/fonts/index.html (100%) create mode 100644 e2e/data/fonts/reference.png create mode 100755 e2e/data/fonts/run.sh rename {test-data/multipart-with-image => e2e/data/multipart-with-image/assets}/test.png (100%) rename test-data/multipart-with-image.html => e2e/data/multipart-with-image/index.html (100%) create mode 100644 e2e/data/multipart-with-image/reference.png create mode 100755 e2e/data/multipart-with-image/run.sh create mode 100644 e2e/docker-compose.yml create mode 120000 e2e/regenerate create mode 120000 e2e/run create mode 100755 e2e/scripts/clean.sh create mode 100755 e2e/scripts/convert.sh create mode 100755 e2e/scripts/create_reference_or_diff.sh create mode 100755 e2e/scripts/regenerate.sh create mode 100755 e2e/scripts/run.sh delete mode 100644 test-data/basic_0001-1.png delete mode 100644 test-data/fonts_0001-1.png delete mode 100644 test-data/multipart-with-image_0001-1.png delete mode 100644 tests/test_visual.py diff --git a/.dockerignore b/.dockerignore index 69022fec..5301570a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -277,5 +277,5 @@ dmypy.json # End of https://www.toptal.com/developers/gitignore/api/python,intellij+all,macos,linux -test-data/*.pdf +e2e .github diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 49beb8a8..f5ca3032 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -134,15 +134,17 @@ jobs: runs-on: ubuntu-20.04 needs: - build - services: - pdf: - image: mormahr/pdf-service:sha-${{ github.sha }} - ports: - - 8080:8080 steps: - - name: "Generate basic PDF without returning invalid status code" - run: curl -f --data "

Hello World

" http://localhost:8080/generate > test.pdf + - name: Checkout code + uses: actions/checkout@v2 + + - name: Run visual tests + run: | + cd e2e + export TAG="sha-$GITHUB_SHA" + docker-compose up --build test + tag: runs-on: ubuntu-20.04 if: github.ref == 'refs/heads/main' diff --git a/.gitignore b/.gitignore index 32b6baaf..e1d2553d 100644 --- a/.gitignore +++ b/.gitignore @@ -277,5 +277,5 @@ dmypy.json # End of https://www.toptal.com/developers/gitignore/api/python,intellij+all,macos,linux -test-data/*.pdf +e2e/data/**/*.pdf coverage diff --git a/e2e/.dockerignore b/e2e/.dockerignore new file mode 100644 index 00000000..951594b9 --- /dev/null +++ b/e2e/.dockerignore @@ -0,0 +1,5 @@ +.gitignore +docker-compose.yml +Dockerfile +diffs +data/**/generated.* diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 00000000..b004263e --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1,2 @@ +diffs +data/**/generated.* diff --git a/e2e/Dockerfile b/e2e/Dockerfile new file mode 100644 index 00000000..dfc141de --- /dev/null +++ b/e2e/Dockerfile @@ -0,0 +1,14 @@ +FROM alpine:3.14 + +WORKDIR /root +ENV PDF_SERVICE_URL=http://pdf:8080 +VOLUME /root/diffs + +RUN apk add --no-cache \ + bash \ + curl \ + imagemagick + +ADD . . + +CMD [ "/bin/bash", "./scripts/run.sh" ] diff --git a/test-data/basic.html b/e2e/data/basic/index.html similarity index 100% rename from test-data/basic.html rename to e2e/data/basic/index.html diff --git a/e2e/data/basic/reference.png b/e2e/data/basic/reference.png new file mode 100644 index 0000000000000000000000000000000000000000..19f814ce5bd532d2856d933b72b3604abc57d6c5 GIT binary patch literal 18476 zcmeI3`%{xw9>!C=(lx{_3Mi1sXbIazE-C~u5UW*W(asIrQuS_H6&r1l8A`NGE^W!3;_{B2#|&la@!OCh5oWLdtPR8X7ax0yytz+ z_jx{tnK#$pB}O1$-~BoQfj~x{dgpxvVlxeaaNN7q0esU^|Kb(`5uuBG=j{*a;|miL z)ZJs>6~33H_AWerU;`z9RRE0uv*1s~p;hs>LfaL# zM7h46cc8+ztY4?g#BKyb5+C~pdzbc2`(`>3_-b2Mceh!RD4ZZGaxL-TNKC{yu~7@k z{xW}8S68)ueRXx!hz@6*@*gL+H~4@7?i|TyFtS`;mMowWPsug3FFkceMtF@)V=_Lv z(B0ADCV7IfR?q|!c|tV%V0ZaI%JAGD^m3JYE~_h!A5%YKGAwoH?l0>fNz;!rgswSj z%$%H@8citR!SfI3*K8?eIP0N`)8NWRvdL7u^F{03b;+y2#bQj}@W8-;f?0yRJ>OR& zV%fqg2c)QOT2-S)2@aD%+ds1sGIH+Rx!cF{$Uc{~#(iMQwqxWSU)ZQEV+%4KhR5T{ z{yP7`$G$EGgMrhVyf&!MvkaTUcxUQ{dy}b|nL3q>mxN_Yl7tDomJ!hXc~0qQVYG67 zK8+sOFt}9zcyLe*?)=y)5Q#)WVRkZ@`Pzn`d>&prQ1P`aD)-P%ES1R&uO_mMm;d?E z)%yB+3sXEs0;=Z;6MS7{Jf^9sH#x9!z_$;;wuiIt)q*T8E?$$Po!AHJmaB~n>-5lC&A(+Q4ZMRN{wPr{VOd{{k%E6~UH*glXk=vM#%R%z zlN2&}y}4jqPO{Hx2cFAqFDZMNkM6Q9Ev0vROqb@ZjNhHYpwW}%ueYD|IrfVmD(J~mqw7o#?sDi z%IM}(+T}=ha&YB9%E93KwZASHOi3cS(P%8)bx~VI(bt=dBSXlji(C_?EtHrcd2L&1 zThUV$?oL{<>OeKnq<7OsDXJKk0z{)IL>hxh8O1ip*muK>8X_4VTM+Y{5stzBe5GC9 z+yN%oL#aKm(zg7*aSng4IoTsR)E$q<7YEJu71svhg(0P%l0u^=G3{Tq)K7|QcqNNg zEAvqjr+2EC!qU`72T5gj$C4V)Jl)NjnaMcZa5QwAh8{W^>G%CpuF`6?YB-v@{16($ zwsIM}6n5kft-bKHNhjVTs#aHN<%hDEOsm=NK~mB9(t2O=O-W2?>^Eo5@?&b0fvFhu z1S#0v_RAQF>)PRQPdqTIQ-lRAl#$xy0)b$;D!Oi1s}Q4Zr<-_I#Xoy%k+?Elap5c(?nISpsOqNN^HTh_s3w+5U=Yc z&Z8RIg+1<>k1{XdcBM9Wij5k1yXyxJGCIxqv$?m2kPQtDMMzm^oaDUBF}X&@$#hh> z>9^o34y?}fm-YAeFW=7uMrScKk837G;mMlGe9VTgI09RJjSjkmY;Z zjMo^-jgf3?t^FBk*ye=tb&r#C4EwF0pTvQ#I2=wP zDyTf|4V>0|mhodmlO-}XHkP$#It*0}Mp-hQB2|rUneTfNFMV^BszV?RAr&t!DQ z@x%MRZ~IS?3#T`u)5GDry3Z|S*>%1-ZE@!&5F26pf{6>j)*C)S;@Cv*QqXaNjH?{j zUhBk`==FMM?0ghpGd^O&`e>Zi;KwOqqZgMIN5L7K6ps%LqfM`iw= z+}zRGnM%4=0Jk z)~Y8U`RkfM)T@r!msx!MH|eF~{UmyojRVa7?n5rt1sR=?f29;;S2z8QeBix_LUWK^-M!k1N@3*lj?b9?F}b+UrNs z9weD8*4~su)4aYYXATgd{KOqM1xD-USv;rdID~Ah8=flcV5bkfs5t+rjLug)K5!MC#R9d+E7eupA~3FjGUx z&Gcns48ZHuRC34djLvw!vi`s*WM(T^SyC`C?UBdFQ&UqVoTSG?qjjL3X#&qTKQTe^j7r~r8&EuuX8wmpuIMx*aAtn`^D21*cV%`DLw&AlkG zvTRjn9TKkffrn|2)?Sj)@s!10|2)kGRkV5hh3e?!>TvvsA)w;)z2P~Kvp=h%2Tv31 zp+^Th45BtYq!{JxzV`u8YVQw7=bJ!-ka~64Cm^O(?7P4USVO63*k3cd;qKpwK_~4~ zGu#{n4PsC8GmzE@#J*RR2pgybEC%QYJC$G-KnY+KKqJ5`fLkNDJA^cZG=wySG=wyS zG=wySG=wySG=wySG=wySG=wySG=wySG=wySG=wySG=wySG=wz#->0GNl8g&p9RxqU zF@AzdrX<0)U?>0)U?|xA0RMdeBEV1pBEV1p uBEV1pBEV3vivU9bhyX(Yi17ax3Jy21xBV95;uUryM4lkN({SwkXa5CBpp6p% literal 0 HcmV?d00001 diff --git a/e2e/data/basic/run.sh b/e2e/data/basic/run.sh new file mode 100755 index 00000000..6bb31d0c --- /dev/null +++ b/e2e/data/basic/run.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -e + +if [ "$PDF_SERVICE_URL" = "" ]; then + echo "\$PDF_SERVICE_URL has to be set." +fi + +cd "$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" + +curl \ + --fail \ + --silent \ + -F index.html=@index.html \ + "$PDF_SERVICE_URL/generate" \ + > generated.pdf + +../../scripts/create_reference_or_diff.sh diff --git a/test-data/fonts.html b/e2e/data/fonts/index.html similarity index 100% rename from test-data/fonts.html rename to e2e/data/fonts/index.html diff --git a/e2e/data/fonts/reference.png b/e2e/data/fonts/reference.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b352a31150f96039cf1cc93eb82caa7b9f53d1 GIT binary patch literal 31567 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

8_MOY=V;&+WO0BZ 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 RZGGicUBk generated.pdf + +../../scripts/create_reference_or_diff.sh diff --git a/test-data/multipart-with-image/test.png b/e2e/data/multipart-with-image/assets/test.png similarity index 100% rename from test-data/multipart-with-image/test.png rename to e2e/data/multipart-with-image/assets/test.png diff --git a/test-data/multipart-with-image.html b/e2e/data/multipart-with-image/index.html similarity index 100% rename from test-data/multipart-with-image.html rename to e2e/data/multipart-with-image/index.html diff --git a/e2e/data/multipart-with-image/reference.png b/e2e/data/multipart-with-image/reference.png new file mode 100644 index 0000000000000000000000000000000000000000..f289f1dbcbdfa8b17fe1b9e007fad48bd7968d90 GIT binary patch literal 45078 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 DQ~Vsb literal 0 HcmV?d00001 diff --git a/e2e/data/multipart-with-image/run.sh b/e2e/data/multipart-with-image/run.sh new file mode 100755 index 00000000..50bbf379 --- /dev/null +++ b/e2e/data/multipart-with-image/run.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -e + +if [ "$PDF_SERVICE_URL" = "" ]; then + echo "\$PDF_SERVICE_URL has to be set." +fi + +cd "$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" + +curl \ + --fail \ + --silent \ + -F index.html=@index.html \ + -F test.png=@assets/test.png \ + "$PDF_SERVICE_URL/generate" \ + > generated.pdf + +../../scripts/create_reference_or_diff.sh diff --git a/e2e/docker-compose.yml b/e2e/docker-compose.yml new file mode 100644 index 00000000..0bca7dc5 --- /dev/null +++ b/e2e/docker-compose.yml @@ -0,0 +1,8 @@ +version: "3.8" +services: + pdf: + image: "mormahr/pdf-service:${TAG}" + test: + build: . + links: + - "pdf:pdf" diff --git a/e2e/regenerate b/e2e/regenerate new file mode 120000 index 00000000..e9a240fb --- /dev/null +++ b/e2e/regenerate @@ -0,0 +1 @@ +scripts/regenerate.sh \ No newline at end of file diff --git a/e2e/run b/e2e/run new file mode 120000 index 00000000..8c48acdb --- /dev/null +++ b/e2e/run @@ -0,0 +1 @@ +scripts/run.sh \ No newline at end of file diff --git a/e2e/scripts/clean.sh b/e2e/scripts/clean.sh new file mode 100755 index 00000000..49a05570 --- /dev/null +++ b/e2e/scripts/clean.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -e + +cd "$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit; pwd -P )" || exit + +rm -f ../data/**/diff.png +rm -f ../data/**/generated.* diff --git a/e2e/scripts/convert.sh b/e2e/scripts/convert.sh new file mode 100755 index 00000000..1ee272f5 --- /dev/null +++ b/e2e/scripts/convert.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +set -e + +convert -density 200 -depth 8 -quality 100 generated.pdf -background white -flatten -strip PNG24:$1 diff --git a/e2e/scripts/create_reference_or_diff.sh b/e2e/scripts/create_reference_or_diff.sh new file mode 100755 index 00000000..8a6b10f8 --- /dev/null +++ b/e2e/scripts/create_reference_or_diff.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -e + +if [ ! -f reference.png ]; then + # Reference file doesn't exist yet -> create + echo "Generating for $(basename "$PWD")" + ../../scripts/convert.sh reference.png +else + ../../scripts/convert.sh generated.png + + # Remove old diffs + mkdir -p ../../diffs/ + rm -f "../../diffs/$(basename "$PWD").*" + + # Create diff image + # Ignore comparison errors here because we do a byte comparison later + compare reference.png generated.png -compose Src "../../diffs/$(basename "$PWD").png" || true + + # Generate animated GIF to illustrate differences + convert -delay 50 reference.png generated.png -loop 0 "../../diffs/$(basename "$PWD").gif" + + # Byte comparison of reference and current image + if ! cmp reference.png generated.png > /dev/null 2>&1 + then + echo "Reference and generated image differ for $(basename "$PWD")" + exit 1 + fi +fi diff --git a/e2e/scripts/regenerate.sh b/e2e/scripts/regenerate.sh new file mode 100755 index 00000000..52f52594 --- /dev/null +++ b/e2e/scripts/regenerate.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +cd "$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit; pwd -P )" || exit + +./clean.sh +rm -f ../data/**/reference.png +./run.sh diff --git a/e2e/scripts/run.sh b/e2e/scripts/run.sh new file mode 100755 index 00000000..ce2980c2 --- /dev/null +++ b/e2e/scripts/run.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +if [ "$PDF_SERVICE_URL" = "" ]; then + echo "\$PDF_SERVICE_URL has to be set." +fi + +# Wait for pdf service to become available. (1s retry, 30s timeout) +timeout 30 bash -c 'while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' $PDF_SERVICE_URL/health)" != "200" ]]; do sleep 1; done' || false + +cd "$( cd "$(dirname "${BASH_SOURCE[0]}")" || exit; pwd -P )" || exit + +for f in ../data/* +do + # Guard against empty directory + [ -e "$f" ] || continue + echo "Running $(basename "$f")" + + # Propagate errors because -e isn't set + "$f/run.sh" || exit 1 +done diff --git a/test-data/basic_0001-1.png b/test-data/basic_0001-1.png deleted file mode 100644 index 7150e1bf37effd3d4e37cf4fc09dfee7f22934b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20802 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 diff --git a/test-data/fonts_0001-1.png b/test-data/fonts_0001-1.png deleted file mode 100644 index f95126d3b56f82def298ec3c2802d9c5e9515bd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54534 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�~hPTN>W zb2j^x5o2|P@7OUZz8!F%*dY@@v&VuI1SM|Wu`>;A{3<(gNy*O|4w#Tm_@%ys-I4Pu z4!Z=*JVG9Vc&~6r^bqK%-EATUe2nigSqlk8EsgpqE*SZ_dVoj8-lBvC8h=Yr>lzt8g64{dnk|Z41nV zuG5&;@9TiaK<|(yDvp$apwJ;{*_9z5qLysbsw&W=9nsL}K*8rz%Q$}Ki~|&)*)k{; z+$`j>9euzZtfD*j9?>*(XLZd3V_!`K5N~>8JI8-eRlxd_^JekeffTrDR;6H4b6sAx z>uQBbG)>OMmhhu`LTh)BSJj+Pst1F{|K){D_oB%;@n{{|RKm7hUCnoo= z&eCn$x;0=cfUf({@@6$Lt?s;UW%WbyP6!+W0@qqfFQ|TzKe?z9@Lw-LbbLVbZpeuJ ziH8A{W@#O@+5-6A%FM=(fw`|I5y4G*Or)?8uEgTMiyA8|Ctw#kbEXg*hf_!9!y1AL zgh;w&K^OzqSeFHIICXeLXZcmt1gsV9Y4jNCu?l0{_j-8+TLh0C`|`$9KL2L{V0)@g zN$O)38F$T=bEFT@f+8a$5s&YiF34|$lstL)^18y6I~ZnNGe4j$5Oqrpm2$(UnXssQ zsxsaS6+`IHdD-#m^P~-69x;=y+>%&kAgO6kosfpszkq%c>0`IoXc_!rq14a~ChVYH~MeF8s6=rsGk4<*d%<2-$0Ksz+y7 z16vq;VGcTx4(43@&G|8%1;3@10yTj1>_)Mw;Wz!rCnp1x_yb83gmB0PK7elUxPb^v zmI&@i9-t6=o3IY=_Y0kQEtq0N6WFLxQ&%^I14Tg{j;r$xqQ9bW!l(0;&A96O9bofj zxA%NQLbz@QlbQ7XGhfmj6A7@v>{pTPXsb2M7{kMc%&tT*y#1JUI2H1yz+VU<`&+Qp%A4}zszELr*WQc=8T*W22j9%mpl zOZXl(mNq|}=d}L?r;i&IOr)rCroJg1%Ok{y!-Ec zB;LJ!i`M+%qN^97Twh|&$jk(THax25{qiNe?8UF2`&Gp%+yd_m=sJLtHG$a|DS52w ziNjOgmzL}$FvNYjgJSogNuYe|%`tc<*B?S0c~T-mtQdNLIc9z+oXGm2sVOD~hLF(E zgN%%iVQPOVu}Yjc%4kD@B~M;geY9t3v+Yye6RsB`=F1O2|_3^}`2UsE4RCaxyYFF`;(#Y6Wa1XYPF2uB6mFcxE3_bx1bJ97tx`hL#XwVLan~ zedj533aq3x8Ct@Y0W){drQ4`to%?E;B%K`mb7z305)%{Etqjcy37w@yJn#gDMM39V z07iqf*@7$yTPo}<&pW(}i#MQ2^lOXen5(IUxXR#~7Xe|Vx?p)$)g8k4=!-@q!^vYR zNF#G4r9d~g9e+=Xi)(m=`PU7J3JJ+UUesiT2m2+?KwFL6d~LhOmLG>TMRPM9hygi2 z7nh&I;j-peF{*nGoH$qDQIM0PEGz4+Gzhuni=J|_>Sy22+4Ia%@KSLK>^^H)e^hx8 zNVP`nki2}&VCTIrun+zEq2mU95EGAwP!IYkAx*%0AZ+k#tCHTzOTrMi7Ts_RvU}%* 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 diff --git a/tests/test_visual.py b/tests/test_visual.py deleted file mode 100644 index 2d30f7b8..00000000 --- a/tests/test_visual.py +++ /dev/null @@ -1,54 +0,0 @@ -import pytest - -from pdf_service import pdf_service -from pdf2image import convert_from_bytes -from pathlib import Path -import tempfile -from diffimg import diff - - -@pytest.fixture -def client(): - with pdf_service.test_client() as client: - yield client - - -def resolve_all_tests(): - base = Path(__file__).parent.joinpath("../test-data") - return [file.stem.replace(".html", "") for file in base.glob("*.html")] - - -@pytest.mark.parametrize("name", resolve_all_tests()) -def test_matches_visually(client, name): - base = Path(__file__).parent.joinpath("../test-data") - - if base.joinpath(name).exists(): - data = { - 'index.html': (base.joinpath(name + ".html").open('rb'), 'index.html', 'text/html'), - } - - for file in base.joinpath(name).iterdir(): - data[file.name] = (file.open('rb'), file.name, 'image/png') - - rv = client.post('/generate', data=data, content_type="multipart/form-data") - else: - html = base.joinpath(name + ".html").read_text() - rv = client.post('/generate', data=html, content_type="text/html") - - assert 200 == rv.status_code - - temp = tempfile.mkdtemp() - paths = convert_from_bytes(rv.data, - output_file=name + "_", - output_folder=temp, - fmt="png", - paths_only=True) - - original_files = base.glob(name + "_*.png") - assert sum(1 for _ in original_files) == len(paths), "Number of generated pages differs from " \ - "expected " - - for expected, actual in zip(base.glob(name + "_*.png"), paths): - percentage = diff(expected, actual, diff_img_file=tempfile.mktemp(".png")) * 100 - assert percentage == 0.0, "Rasterized page differs from expected result by more than the " \ - "allowed threshold "