From e739dc33f07f131d30f2524f543d063b5f20c30f Mon Sep 17 00:00:00 2001 From: Denny Septian Panggabean Date: Wed, 14 Aug 2024 10:43:40 +0700 Subject: [PATCH] tests: added provider any excel version --- .github/workflows/test-phpunit.yml | 2 +- .gitignore | 2 + tests/SecureTest.php | 73 +++++++++++++++++++++++++--- tests/_support/.gitkeep | 0 tests/_support/csvunknown.csv | 20 ++++++++ tests/_support/csvutf8.csv | 20 ++++++++ tests/_support/excel2024.xlsx | Bin 0 -> 8632 bytes tests/_support/excel2024strict.xlsx | Bin 0 -> 8738 bytes tests/_support/excel95.xls | Bin 0 -> 18432 bytes tests/_support/excel97.xls | Bin 0 -> 26624 bytes tests/_support/excelbinary.xlsb | Bin 0 -> 8076 bytes tests/_support/excelmacro.xlsm | Bin 0 -> 8648 bytes 12 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 tests/_support/.gitkeep create mode 100644 tests/_support/csvunknown.csv create mode 100644 tests/_support/csvutf8.csv create mode 100644 tests/_support/excel2024.xlsx create mode 100644 tests/_support/excel2024strict.xlsx create mode 100644 tests/_support/excel95.xls create mode 100644 tests/_support/excel97.xls create mode 100644 tests/_support/excelbinary.xlsb create mode 100644 tests/_support/excelmacro.xlsm diff --git a/.github/workflows/test-phpunit.yml b/.github/workflows/test-phpunit.yml index 94ffde1..db17e8c 100644 --- a/.github/workflows/test-phpunit.yml +++ b/.github/workflows/test-phpunit.yml @@ -68,7 +68,7 @@ jobs: fi - name: Test with PHPUnit - run: vendor/bin/phpunit tests/ --coverage-text --coverage-clover build/logs/clover.xml --coverage-php build/cov/coverage.cov --testsuite main + run: vendor/bin/phpunit --coverage-text --coverage-clover build/logs/clover.xml --coverage-php build/cov/coverage.cov --testsuite main env: TERM: xterm-256color TACHYCARDIA_MONITOR_GA: enabled diff --git a/.gitignore b/.gitignore index b29f218..4f1868a 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,8 @@ tests/coverage* # Don't save phpunit under version control. phpunit +tests/_support/result/* +!tests/_support/result/.gitkeep #------------------------- # Composer diff --git a/tests/SecureTest.php b/tests/SecureTest.php index c979868..b9ded25 100644 --- a/tests/SecureTest.php +++ b/tests/SecureTest.php @@ -11,7 +11,9 @@ namespace Tests; +use DateTimeImmutable; use PHPDevsr\Spreadsheet\Secure; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; /** @@ -24,20 +26,79 @@ final class SecureTest extends TestCase */ private static string $folderSupport = ''; + /** + * Result of Test + */ + private static string $folderSupportResult = ''; + protected function setUp(): void { - self::$folderSupport = './tests/_support/'; + self::$folderSupport = './tests/_support/'; + self::$folderSupportResult = self::$folderSupport . 'result/'; + + if ($handlePath = opendir(self::$folderSupportResult)) { + $date = new DateTimeImmutable(); + + while (false !== ($file = readdir($handlePath))) { + if ($file === '.' || $file === '..' || $file === '.gitkeep') { + continue; + } - if (file_exists(self::$folderSupport . 'bb.xlsx')) { - unlink(self::$folderSupport . 'bb.xlsx'); + $fileLastModified = filemtime(self::$folderSupportResult . $file); + + if ($date->getTimestamp() > $fileLastModified && is_file(self::$folderSupportResult . $file)) { + unlink(self::$folderSupportResult . $file); + } + } + + closedir($handlePath); } } - public static function testEncryptor(): void + public static function dataProviderExcel(): iterable + { + yield from [ + 'Excel 2024' => [ + 'checkFiles' => 'excel2024.xlsx', + 'expectedFiles' => 'excel2024_result.xlsx', + ], + 'Excel 2024 - Strict' => [ + 'checkFiles' => 'excel2024strict.xlsx', + 'expectedFiles' => 'excel2024strict_result.xlsx', + ], + 'Excel Macro' => [ + 'checkFiles' => 'excelmacro.xlsm', + 'expectedFiles' => 'excelmacro_result.xlsm', + ], + 'Excel Binary' => [ + 'checkFiles' => 'excelbinary.xlsb', + 'expectedFiles' => 'excelbinary_result.xlsb', + ], + 'Excel 97-2003' => [ + 'checkFiles' => 'excel97.xls', + 'expectedFiles' => 'excel97_result.xls', + ], + 'Excel 95' => [ + 'checkFiles' => 'excel95.xls', + 'expectedFiles' => 'excel95_result.xls', + ], + 'CSV UTF-8' => [ + 'checkFiles' => 'csvutf8.csv', + 'expectedFiles' => 'csvutf8_result.csv', + ], + 'CSV Unknown' => [ + 'checkFiles' => 'csvunknown.csv', + 'expectedFiles' => 'csvunknown_result.csv', + ], + ]; + } + + #[DataProvider('dataProviderExcel')] + public static function testEncryptor(string $checkFiles = '', string $expectedFiles = ''): void { - (new Secure())->setFile(self::$folderSupport . 'Book1.xlsx')->setPassword('111')->output(self::$folderSupport . 'bb.xlsx'); + (new Secure())->setFile(self::$folderSupport . $checkFiles)->setPassword('111')->output(self::$folderSupportResult . $expectedFiles); - self::assertFileExists(self::$folderSupport . 'bb.xlsx'); + self::assertFileExists(self::$folderSupportResult . $expectedFiles); } public static function testEncryptorWithBinaryData(): void diff --git a/tests/_support/.gitkeep b/tests/_support/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/_support/csvunknown.csv b/tests/_support/csvunknown.csv new file mode 100644 index 0000000..fc05e53 --- /dev/null +++ b/tests/_support/csvunknown.csv @@ -0,0 +1,20 @@ +1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20 +2;2;;;;;;;;;;;;;;;;;; +3;;3;;;;;;;;;;;;;;;;; +4;;;4;;;;;;;;;;;;;;;; +5;;;;5;;;;;;;;;;;;;;; +6;;;;;6;;;;;;;;;;;;;; +7;;;;;;7;;;;;;;;;;;;; +8;;;;;;;8;;;;;;;;;;;; +9;;;;;;;;9;;;;;;;;;;; +10;;;;;;;;;10;;;;;;;;;; +11;;;;;;;;;;11;;;;;;;;; +12;;;;;;;;;;;12;;;;;;;; +13;;;;;;;;;;;;13;;;;;;; +14;;;;;;;;;;;;;14;;;;;; +15;;;;;;;;;;;;;;15;;;;; +16;;;;;;;;;;;;;;;16;;;; +17;;;;;;;;;;;;;;;;17;;; +18;;;;;;;;;;;;;;;;;18;; +19;;;;;;;;;;;;;;;;;;19; +20;;;;;;;;;;;;;;;;;;;20 diff --git a/tests/_support/csvutf8.csv b/tests/_support/csvutf8.csv new file mode 100644 index 0000000..c62fade --- /dev/null +++ b/tests/_support/csvutf8.csv @@ -0,0 +1,20 @@ +1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20 +2;2;;;;;;;;;;;;;;;;;; +3;;3;;;;;;;;;;;;;;;;; +4;;;4;;;;;;;;;;;;;;;; +5;;;;5;;;;;;;;;;;;;;; +6;;;;;6;;;;;;;;;;;;;; +7;;;;;;7;;;;;;;;;;;;; +8;;;;;;;8;;;;;;;;;;;; +9;;;;;;;;9;;;;;;;;;;; +10;;;;;;;;;10;;;;;;;;;; +11;;;;;;;;;;11;;;;;;;;; +12;;;;;;;;;;;12;;;;;;;; +13;;;;;;;;;;;;13;;;;;;; +14;;;;;;;;;;;;;14;;;;;; +15;;;;;;;;;;;;;;15;;;;; +16;;;;;;;;;;;;;;;16;;;; +17;;;;;;;;;;;;;;;;17;;; +18;;;;;;;;;;;;;;;;;18;; +19;;;;;;;;;;;;;;;;;;19; +20;;;;;;;;;;;;;;;;;;;20 diff --git a/tests/_support/excel2024.xlsx b/tests/_support/excel2024.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eb0d0238790d4bcbb0e77b1dc578b5f1079fabc5 GIT binary patch literal 8632 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 M7$Vb}Q~mt+Kl=s`cK`qY literal 0 HcmV?d00001 diff --git a/tests/_support/excel2024strict.xlsx b/tests/_support/excel2024strict.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9a31da58668344b4495cca7e6f6985fb7b771759 GIT binary patch literal 8738 zcmeHMg;$j8_8z(gX^@s~hwdD@rBlF>W+JB;=Xmb# zFSz%ewcdBFneW-_`)2QF@BKYnO%VYRAAk%%1pollfZXTZBPwtJ04gE?fCoT@H;{tZ zyMXOoOf=mcz|KbOZg#d*9}wXgvjOn1>;Jd@i~oVrgh7=~P8`ss+z+WWwupslaa5lD zfL`22M#>i}@@7*U?(^gKB6yco;yDD?d{t&6^Ufk%Szmdf_%>mMEhRH4vAS^O7Ya>v zX73~GPvQtta-Wa8p%Bc$SARRZcvU@v+!jzxu3f6gB#h?&8bzDt5{@jBTU0-Fi?5ER z&x6ST=knuNU}1~mvPP;07H?*=_){Hvf{G`zivr;<-V%&7wPk5NBMBJ$q_n14nt20a zx#Cd?vT0dXKz!Dq6^`&ce6>%y+fw51Ao8-d{Z#yrmOk11^vAMVCul zdw`4J$)pgADiP$MN6k(wpM zFNd0w*F=@OfWwUa0{1d@wnsf);_~7pDk8`dg}+Bd)b}3TlwP3T;tBq!QLD*#6QlULnPs``?V%XrU zQdDF;$(Yfr!=~O1n%qRvRL)t?ZI2L0dK!NTqKCU@uezo_EnS9Z(?oCShESwR zzAyK^Tes#|yUWD6B;?=H46!b|opijB;N_BdB8ca-i3+DJdmbOBFcoE``zgqE>oZHz zL!+u~eMYs$Xbw2@4XsTWa!T<=OPX-)*`DNB+9&BD=@CKxH!Lp|xmn?471!=Y=QL|Y zK7U@tnvRXxY^1K%Pg~p*r0zFD_)hNdf}GZn`bQN;AYUe8KA-HT427I7?UA-m&Rw_6 zh9lkOfya@R*dvar*$?RqlyYv%^g0%rKre>kqdg2=;)Im6w_SwWBOW`z_qQX6ca6d%}i1R4M%41*Z|y7JFHN2LA(?IoS*y54cS~;i5fc zare_Cg{mg`A~Zz!3KO(jZ$ zSGlA_Ex$)^yE>(?&M2c8i@bkW%krs9HNi^QF9@G>X@_L&Pu0BrIxgt7X+(EHQeA~I zCfsUxAiL^nyiJ<8C6g_^d$q^cq7chv8H>=&sE6c(8_dgo+IAsDCS~o_H~GQv288?d)ZO;Pyp?Dh?)GpO z%YKEn_mwqsn`*(~s6Oc!T(P3ujO%Hive%r^Fq}q)+nc=+5zp_*i@>mV>(#_`&H-n~ z$YR>-Nc53V=^X?4EfFvEFO_x@_+htw$EZ+oig1^Fx$*~CxA^x0#=7e1yA5L^8mxek z0#M;#jQmFp`!g^9RnOpH?Ig^~fA@mrbL(IEJg_Bj%v*iDo%o{)hxzDkA4MDg0OgKu zkJH@xzD4yIJLjA2?xUK~OL@zt+l&lB^~AWAkYYxOxcd2+*6E|MW)b1Q_?KQbWS--k z32o)AU*=j9xS06*Ig!;+4t z9<=T4wep)qjiMF1*30fswd*}b$gqJpc_p_ebe}cZ5teuS&WT|D{d=HD;6G9Bgr#mh zEC7HQcEvwax3eV}?BdMv>v;AvhiAkaM9y*I1TSISVM`v?c_}v9tgtE)PI$BI*BwR( zt4O;z(g_eLJb3mF&oZ$kR=)_O9r4=Sa?{4PDC>Kikqp)3j>c1HL!FbWDcPD%7Hs_3 zgjA%xOQQsP+9 zz@gQ2r)xy&sBG7K+dQfy~u3qM**tW-%99h73?Jfy}vEEv* ze%t|QiDP-IJpc6)l=f(!NR0|UTTY>$v%naVFZQ@2(DY zl1dQMd7ve89^)mwa5rmm2yBO1SGKB@5(gJ>!9;EorkVpACy2(NU*ha57e!2bE zmiSKIK2RJ7RAJ`mCvJK~8-@R5q|kniLRg-se<6E*>~LLr1FBMq>6&z**KS;T9)k$E7ftNiPl_2ArRH^fLV&Y-Lt6r zD&mbfeN2P{))2Hy!p<<1NYkE=-JEOvW+^9M`Ms33r)BS*4{~vL%n~mV9au>;sKc}Z=;J-nQG_L!5y_LX%@L1^mEzDPbm+E7;hJ5zawSKf zqj|^xDh|ntaL%*>S|5v}V&qDSpAS#4w)yc8QWW~sG+m$f1*~QO>`Y!Hx$x1j^(Dm^THW~aD0Ryh=$%IB*UCMa5t*#BV zThfxucnpjWYfh$Ct*-d{)5(12cQ>*;lpu@bnr>e& zJ8u{dA0B?Ws+vhoN%dTrRbk{Si*}#9GE0>faFk0&gK)!woB5gA|4#e^88tsnSifdR^;2p1 zMSK@aupOA=*Zzz1dwN4QPh|1G5Z#EeVu%dr%QxL{#s!M5(%#c(YdDcr$jnw*xORQ* zi$V2|&+uTvA0JoDsi#n|%JvU2zUd{#ojr?%-AU4$Uea#ImBd>9kV>JOmRR@0Ay3GX zVbeWTF7(+(KxLs-GL&qtBW@&wmXvS5DbOd!-azt$Wf)_m!$g*;smapSS%QtF5i)-l z;i#+`InTcMK)**7f2vbskJnDcGf{RR@)x2|vP^)K8~WpLTNX*`%31R0u-Gz*uRV(? zTzl$n(YawnUIUljbabjYm7O0oqHwsza^?kPYOMmpsD((DQO4^SadCYtXJc+Gi1^A0 z#yk|H*U@Lmj7;tnw>1L3tLycztp*0GO`p$O+q9d&6&m)OTenzOG%gna`Yufi!r28! z^cz<5XUG`cxsMK@jY;t#BgYl2+w&(YVptX8Xuhs!ONXv)5v0ccxXtxJm$T7tbT(n% zw>Ab<2$Yo@OkA<3iOajx2EA#v&f{9zhXAo3ISt@FKIDTJ}l_)zVC?l|= z%P}g=%GQ0O+p+nQCjEkK*?NE^ca!`1oH zlCSCA`7Uv*hLw&_<}50*#5}JTbbRm6Cfi!N$0R63 zsi+B|k3_2uDsgx%M=2?fBGobBrMc1Z0T6`UEKKg@VN7+r^61xii>q(JN^MUjq?D)c z{8Z_l$+eOPkvgP5n|(EJ={HwZnh}gLVQEV^T;M)W9u%WoEyOrZHlMCS)q;yRsN%=N zbIBM%OS+1x$Z{V|ZfZNT;4R7BWRLfrt6gTiQMHtpMkWEX&!13^WQ-oIor5bOVA*v2^~khy=M#5G)g8VMx3NIEBc9T3b7Ibx$lNQl4XI@oj+p>CfrS4y3F zVn(gR-9&bg?tEj{$N8!rGND)aw1HNZKFc7iO1OG3Mi362K_*ikf31qI`*9Fs^+gJI zdwr^p0)~ygcO~}x* zWvSY$ZwWC~8bc#Bvt4Mh8qFS}PaEROgCM=t;;mw;w5Jx)UcE%cuuNEKeI)?0f1DG% zCrVL6aAP|%Oq)d#A=#zlxCmEalY^l(oTA`b8KCM6+$rG0!gMLYAYtv{+x^G%Y zJ1DSQT+*;(z4zd)Q?tWrat_pK`KrZXesgm})uIG#6}L!GcAxypU?^}x@>t<=J!*w5 zCtno4)iT6eS96t-C&4fZzyK$lk3f&bw;?yCo6$cKj(LH=?LVd_kHy(b0~R5K2BD=8 zd*?%g!y8D2l{@Wtm1HvWaI>{c3FKat#3Yw@gelPXSu3-(FA_yfF}jo@mpXr23=ZPx z+Uj6Y?6Bz{7wAwN2FpQM^9+{D9VSwkvwbY*spEr0D^2<`s@%yvOTUI+gb#jK1K*M1^A_LoHA zRL^P@==!O#!@K4`(Av(Pf4$vpHis04v}sHi8EELzik_W(ini_T=Pfy zJolP0OWya1}D&Tlfr_5J9ei2^9GIPoSW5f*gcL7UWcR}KHsA+ znh~wtbL(i#z1y5JpIaFd^CYdrr)wUu*6_wpB9B=y0uBv2oY9B6Ezz}<(1)g7g4v5o zBW*XeK1Pq9LFTWUv>mdAo}@Wmysr;nZk!r=b5D~-PA2KI)seK6sE{*{ys8_MeXPii zmGBj?x$LhrC+Jq4pTWH!8Z+%A1g?1Quwz`YtZi7JcB!8vIe5yPm!;#>xPS7LzZi(B zXzWz77;1nbsCWpSx>@ltN;0H{c3gK4q>XgYJa^p&4pBpuSs49d@-`z$l zd^BR?W-jw-->=&ZmMNHJcPYu#uV31CJC}KgvmS0Bf#)cGk`=?zUj( zUy_LCTueGAj(5eRZ{-gaOk24GR9&8QkbY4a^S<^@2?Bi;l;~x8V(rcsSImaDb=G+c zL@6Y(BN+_>E&I9Rp08M^nLEd5yTXbzbPVmdeykUvZV>CqYJq~aSvyf)9oyYsC|fT` zRQ8gaKY|OYCRr4iW<|5oe@fqozb>85Hb$xvZio3X>3lI;et>|&o(=5YYB@-rFsb6w ziEmi^DQ?mqoiRRbvkpyx?a9tn2*$x9+DDxvGS!Bnwn@A$PyLLEl&!)WEnk^UraphW zcq2>JulTX7d;!rRyxhjPdMQOR3`q}1-}o)y8Z4(S*>S~uIoyn6rGPo-yadcB_@q7j zL8E>^0>QtKqy0p08&Z5EyU6dhUUV08q3K80L943BRx9zS_)*d>TZ96y+q`-^Ux;UY zngaWyK!J;pR&`mi{+x?NIpNsVkq$ccu2ii(G(T$99PbzsEx&-6lZhPvBlLV5zwNvG z)fS#JobLWD_-%xZZJBiR{A-Qa1T;$_Ycfu7aX`fcmKWcwfTd5Cc82|@4;>c37a2%> z`7b4fZ~PzhO(a}-G|E_WJqv-DC95_LxYV&9`IoUGdMQ6*%~XVdjJ%_U4!sA`DIaStr{E*?}9mBXfNa;=0N;T)2E3x$&i@UtJ3N^L^83tyyC>FBkF;o zp57at`yOGKCTrMUP0nLqdtYSUzA$ZEj@9qv`mySBZeP{PvGRhVe53s=gsz=NuPpGT zN4gyhaNQAmB^1Qsyk&Xp_FQ z5-OQg$(LdeNdKvG4656{7Kb&JMzG+14AT}~Ld?~iAP&wP<`5_FKPOcGlN4Z#kBV1U z?Bv7`UP5}1>i0~qWdTageW&+y;&k|MMHt`2Hj_&o{^s^Ff4?;8nre;iGQ;a~UNNFu zerk+Cm*I)g2X1Oc_@O7%=Q+|NO|OMz<4%<@wE0LCT#!Qvr}mZGvDTx5%j__9Iod(~ zx#a8l(z1tG-808e88_mWMUjx9h;ga&%#)*SjUDr|Fg3Er?aZvE?>&l{Z@mIMVnX zqtrL`CqM&{J!s*8+`HbF6b08YUm4{)-FHbJJeGo=pzn;|KXhemd<(k5Dn$1>r!M}- zE9>twnVs!9G;dhgUBSW*=g(nh>frFdsDp*uKUZSBsv^QOobJPbCDZ?sfs)V8-pEO`nqGz303reyq^4~LTkB2IZ3JwwiuieW;mGB1RUU7Kuy##b z7sKC42=C$5W0FHcxooZ)g>Jp}6DE|!su?~X59}v66lO)=hGB^HdV-Ebh9~k<%C!7| zcFUXxQc}Ws^2l>RO3;C_>>n3D2-DU%nqpZ)`2v41t9tIABZ~R(UH>~%!ojlv{=a$t zzg+aM^FK`Y)fE3~;IEU&e*u48^d_+OLOpW#o){{;VM3R6==g82rf+QUAgurxRPv$F*JA4t$l A$N&HU literal 0 HcmV?d00001 diff --git a/tests/_support/excel95.xls b/tests/_support/excel95.xls new file mode 100644 index 0000000000000000000000000000000000000000..fcf601ccee5a19ac2c85f3ab2f62221d7cc8354c GIT binary patch literal 18432 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 cqH+n)_y;T3;KUI6)yb$0-KO^t^fc4 literal 0 HcmV?d00001 diff --git a/tests/_support/excel97.xls b/tests/_support/excel97.xls new file mode 100644 index 0000000000000000000000000000000000000000..a2631a7e35b3d6087bdff8f25d0c11943435cf8f GIT binary patch literal 26624 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 Rpl$N>{4ccM78y73{})L)0{Q>| literal 0 HcmV?d00001 diff --git a/tests/_support/excelbinary.xlsb b/tests/_support/excelbinary.xlsb new file mode 100644 index 0000000000000000000000000000000000000000..767147e970410a8312b28765245e5d92b5f6c94b GIT binary patch literal 8076 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 Y;Y?W$33fIB04nSw49m1GWIw