Compare commits

...

17 Commits

Author SHA1 Message Date
cliphouse 74da813832 Add logging to phpunit.xml 2026-06-25 19:08:57 +09:00
cliphouse 8c7e2782ae DB IO PgSQL supress warnings if we cannot connect 2026-06-25 18:22:13 +09:00
cliphouse 7bc7674021 Cleaned up all warnings for phpunit tests 2026-06-25 18:10:18 +09:00
cliphouse 3f02bee643 Test updates with skip for DB, URL check skip and lookup fix
curl fix for printing out response, we just want true/false if connect worked
skip curl tests where we need a base url
skip any DB tests if there is no DB
update the caller method list test
2026-06-25 17:24:45 +09:00
cliphouse e3306a096f Tests updates: DB try catch for the ACL test, curl setup fix
curl init alone is not enought to validate a url.

for DB conneciton use try/catch to get errors and skip test
2026-06-25 16:40:10 +09:00
cliphouse d66fce374c Update tests for fsetFolder 2026-06-25 16:26:15 +09:00
cliphouse 7e01886ad8 Test updates: add timezone, some fixes for debug callers 2026-06-25 15:52:53 +09:00
cliphouse e1109e925b phpstan fixes 2026-06-25 14:12:47 +09:00
cliphouse 6c67ab6259 Update for humanReadableByteFormat, update edit.jq.js
edit.jq.js: remove deprecated function decodeHtmlEntities, use utils.js instead

update for humanReadableByteFormat to return non numeric first and then proceed with
the convert
2026-05-27 09:00:48 +09:00
cliphouse c467ed326c Logger Level returns self 2026-05-20 18:46:57 +09:00
cliphouse 40cd64f667 Update JS Utils to v1.1.0, back add html entities convert to Javascript 2026-05-20 18:45:54 +09:00
Clemens Schwaighofer 05dae1031a Locale files test update, L10n PHPdoc typo fix 2026-05-12 14:49:07 +09:00
Clemens Schwaighofer 82ba2a189a L10n update for PHPdoc array descriptions
Make the PHPdoc array description detailed for the parseLocale method
2026-05-12 11:39:19 +09:00
Clemens Schwaighofer a8755c8c0f phpstan check fixes 2026-05-11 15:31:59 +09:00
Clemens Schwaighofer 85f7e114b0 Add throw exception to get mime info if there is no mime type found
Instead of returning empty
2026-05-11 13:38:17 +09:00
Clemens Schwaighofer 6b1261b157 Update dotenv to v3 2026-04-20 16:19:19 +09:00
Clemens Schwaighofer b695c3ffdc phive updates 2026-04-20 10:36:53 +09:00
50 changed files with 462 additions and 288 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ node_modules/
**/composer.lock **/composer.lock
**/vendor/ **/vendor/
tools/ tools/
**/.env **/configs/.env
**/.target **/.target
package-lock.json package-lock.json
build/ build/
+4 -4
View File
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phive xmlns="https://phar.io/phive"> <phive xmlns="https://phar.io/phive">
<phar name="phpunit" version="~9.6" installed="9.6.31" location="./tools/phpunit" copy="false"/> <phar name="phpunit" version="~9.6" installed="9.6.34" location="./tools/phpunit" copy="false"/>
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/> <phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/> <phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
<phar name="phpstan" version="^2.0" installed="2.1.33" location="./tools/phpstan" copy="false"/> <phar name="phpstan" version="^2.0" installed="2.2.2" location="./tools/phpstan" copy="false"/>
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/> <phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/> <phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/>
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/> <phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
<phar name="phpdocumentor" version="^3.4.2" installed="3.9.1" location="./tools/phpDocumentor" copy="false"/> <phar name="phpdocumentor" version="^3.4.2" installed="3.10.0" location="./tools/phpDocumentor" copy="false"/>
<phar name="php-cs-fixer" version="^3.34.1" installed="3.92.4" location="./tools/php-cs-fixer" copy="false"/> <phar name="php-cs-fixer" version="^3.34.1" installed="3.95.10" location="./tools/php-cs-fixer" copy="false"/>
</phive> </phive>
+3 -3
View File
@@ -8,11 +8,11 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n" "Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n" "Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n" "POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.co\n" "Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n" "Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: en\n" "Language: en\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
+3 -3
View File
@@ -8,11 +8,11 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n" "Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n" "Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n" "POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.co\n" "Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n" "Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: en\n" "Language: en\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
+3 -3
View File
@@ -8,11 +8,11 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n" "Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n" "Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n" "POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.com\n" "Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n" "Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: ja\n" "Language: ja\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
+3 -3
View File
@@ -8,11 +8,11 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n" "Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n" "Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
"POT-Creation-Date: 2018-03-28 10:40+0900\n" "POT-Creation-Date: 2018-03-28 10:40+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: clemens.schwaighofer@egplusww.com\n" "Last-Translator: clemens.schwaighofer@omc.com\n"
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n" "Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
"Language: ja\n" "Language: ja\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -12,6 +12,8 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsAAASetupDataTest extends TestCase final class CoreLibsAAASetupDataTest extends TestCase
{ {
public const TIME_ZONE = 'Asia/Tokyo';
/** /**
* Covers nothing * Covers nothing
* *
@@ -34,6 +36,9 @@ final class CoreLibsAAASetupDataTest extends TestCase
BASE, BASE,
'BASE Path set check' 'BASE Path set check'
); );
// if time zone is not set, errors can happen
ini_set('date.timezone', self::TIME_ZONE);
} }
} }
+6
View File
@@ -80,6 +80,7 @@ final class CoreLibsACLLoginTest extends TestCase
'log_file_id' => 'CoreLibs-ACL-Login-Test', 'log_file_id' => 'CoreLibs-ACL-Login-Test',
]); ]);
// test database we need to connect do, if not possible this test is skipped // test database we need to connect do, if not possible this test is skipped
try {
self::$db = new \CoreLibs\DB\IO( self::$db = new \CoreLibs\DB\IO(
[ [
'db_name' => $db_name, 'db_name' => $db_name,
@@ -95,6 +96,11 @@ final class CoreLibsACLLoginTest extends TestCase
], ],
self::$log self::$log
); );
} catch (\Exception $e) {
self::markTestSkipped(
'Cannot connect to Test DB for ACL\Login test: ' . $e->getMessage()
);
}
// ALWAYS drop DB and RECREATE DB // ALWAYS drop DB and RECREATE DB
// dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test // dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test
// createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test; // createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test;
@@ -15,6 +15,12 @@ if [ ! -f "${load_sql}" ]; then
echo 1; echo 1;
exit 1; exit 1;
fi; fi;
# if we have no dropdb, createdb, psql, exit with 6
if ! command -v dropdb &> /dev/null || ! command -v createdb &> /dev/null || ! command -v psql &> /dev/null; then
echo 6;
exit 6;
fi;
db_user="${2}"; db_user="${2}";
db_name="${3}"; db_name="${3}";
db_host="${4}"; db_host="${4}";
@@ -24,25 +30,25 @@ if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
exit 2; exit 2;
fi; fi;
# drop database, on error exit with 3 # drop database, on error exit with 3
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1; dropdb -U "${db_user}" -h "${db_host}" "${db_name}" 2>&1;
if [ $? -ne 0 ]; then if [ ! $? ]; then
echo 3; echo 3;
exit 3; exit 3;
fi; fi;
# create database, on error exit with 4 # create database, on error exit with 4
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1; createdb -U "${db_user}" -O "${db_user}" -h "${db_host}" -E utf8 "${db_name}" 2>&1;
if [ $? -ne 0 ]; then if [ ! $? ]; then
echo 4; echo 4;
exit 4; exit 4;
fi; fi;
# if error 5 thrown, test with enabled below # if error 5 thrown, test with enabled below
if [ ! -z "${5}" ]; then if [ -n "${5}" ]; then
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name}; psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}";
else else
# load data (redirect ALL error to null), on error exit with 5 # load data (redirect ALL error to null), on error exit with 5
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null; psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}" 2>&1 1>/dev/null 2>/dev/null;
fi; fi;
if [ $? -ne 0 ]; then if [ ! $? ]; then
echo 5; echo 5;
exit 5; exit 5;
fi; fi;
@@ -1266,7 +1266,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::arrayGetPrevKey, ::arrayGetNextKey * @covers ::arrayGetPrevKey
* @covers ::arrayGetNextKey
* @dataProvider providerArrayGetNextPrevKey * @dataProvider providerArrayGetNextPrevKey
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName] * @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
* *
@@ -1,4 +1,4 @@
<?php <?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1); declare(strict_types=1);
@@ -71,15 +71,16 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
* *
* @covers ::dateStringFormat * @covers ::dateStringFormat
* @dataProvider timestampProvider * @dataProvider timestampProvider
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName] * @testdox dateStringFormat $input (mt $flag_show_micro, float mt $flag_micro_as_float) will be $expected [$_dataName]
* *
* @param int|float $input * @param int|float $input
* @param bool $flag * @param bool $flag_show_micro
* @param bool $flag_micro_as_float
* @param string $expected * @param string $expected
* @return void * @return void
*/ */
public function testDateStringFormat( public function testDateStringFormat(
$input, int|float $input,
bool $flag_show_micro, bool $flag_show_micro,
bool $flag_micro_as_float, bool $flag_micro_as_float,
string $expected string $expected
@@ -101,7 +101,7 @@ final class CoreLibsConvertColorTest extends TestCase
* @covers ::rgbToHwb * @covers ::rgbToHwb
* @covers ::hsbToRgb * @covers ::hsbToRgb
* @covers ::hslToRgb * @covers ::hslToRgb
* @covers ::hwebToRgb * @covers ::hwbToRgb
* @testdox Convert from and to RGB via HSL, HWB, HSB/V * @testdox Convert from and to RGB via HSL, HWB, HSB/V
* *
* @return void * @return void
@@ -298,7 +298,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::returnAsHex()
* @testdox Convert from and to RGB via hex * @testdox Convert from and to RGB via hex
* *
* @return void * @return void
@@ -342,8 +341,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* linear RGB conversion tests * linear RGB conversion tests
* *
* @covers ::fromLinear
* @covers ::toLinear
* @testdox Convert from and to RGB linear conversion check * @testdox Convert from and to RGB linear conversion check
* *
* @return void * @return void
@@ -933,7 +930,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::__get
* @testdox Exception handling for RGB general calls * @testdox Exception handling for RGB general calls
* *
* @return void * @return void
@@ -958,7 +954,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::setFromHex
* @testdox Exception handling for RGB setFromHex failues * @testdox Exception handling for RGB setFromHex failues
* *
* @return void * @return void
@@ -1086,7 +1081,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::__get
* @testdox Exception handling for Lab general calls * @testdox Exception handling for Lab general calls
* *
* @return void * @return void
@@ -1120,7 +1114,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::__get
* @testdox Exception handling for LCH general calls * @testdox Exception handling for LCH general calls
* *
* @return void * @return void
@@ -1155,7 +1148,6 @@ final class CoreLibsConvertColorTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::__get
* @testdox Exception handling for XYZ general calls * @testdox Exception handling for XYZ general calls
* *
* @return void * @return void
@@ -277,6 +277,38 @@ final class CoreLibsConvertJsonTest extends TestCase
); );
} }
/**
* Check if invalid flag throws exception
*
* @covers ::jsonValidate
* @testdox jsonValidate test exception thrown on invalid flag
*
* @return void
*/
public function testJsonValidateInvalidFlag(): void
{
$this->expectException("\InvalidArgumentException");
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 5);
}
/**
* Check if valid flag throws no exception
*
* @covers ::jsonValidate
* @testdox jsonValidate test no exception on valid flag
*
* @return void
*/
public function testJsonValidateValidflag(): void
{
$this->assertTrue(
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 0)
);
$this->assertTrue(
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', JSON_INVALID_UTF8_IGNORE)
);
}
/** /**
* Undocumented function * Undocumented function
* *
@@ -671,7 +671,7 @@ final class CoreLibsConvertStringsTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::isValidRegexSimple * @covers ::isValidRegex
* @dataProvider isValidRegexSimpleProvider * @dataProvider isValidRegexSimpleProvider
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName] * @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
* *
@@ -87,7 +87,7 @@ final class CoreLibsCreateRandomKeyTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::randomKeyGeyn * @covers ::randomKeyGen
* @dataProvider randomKeyGenProvider * @dataProvider randomKeyGenProvider
* @testdox randomKeyGen use $input key length $expected [$_dataName] * @testdox randomKeyGen use $input key length $expected [$_dataName]
* *
@@ -78,7 +78,6 @@ final class CoreLibsCreateSessionTest extends TestCase
/** /**
* Test session start * Test session start
* *
* @covers ::startSession
* @dataProvider sessionProvider * @dataProvider sessionProvider
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName] * @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
* *
@@ -121,7 +121,6 @@ final class CoreLibsCreateUidsTest extends TestCase
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e * must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
* *
* @covers ::uuidv4 * @covers ::uuidv4
* @covers ::validateUuidv4
* @testdox uuidv4 check that return is matching regex [$_dataName] * @testdox uuidv4 check that return is matching regex [$_dataName]
* *
* @return void * @return void
+6 -4
View File
@@ -123,10 +123,16 @@ final class CoreLibsDBIOTest extends TestCase
'log_file_id' => 'CoreLibs-DB-IO-Test', 'log_file_id' => 'CoreLibs-DB-IO-Test',
]); ]);
// will be true, default logging is true // will be true, default logging is true
try {
$db = new \CoreLibs\DB\IO( $db = new \CoreLibs\DB\IO(
self::$db_config['valid'], self::$db_config['valid'],
self::$log self::$log
); );
} catch (\Exception $e) {
self::markTestSkipped(
'Cannot connect to Test DB for DB\IO test: ' . $e->getMessage()
);
}
if (!$db->dbGetConnectionStatus()) { if (!$db->dbGetConnectionStatus()) {
self::markTestSkipped( self::markTestSkipped(
'Cannot connect to valid Test DB for DB\IO test.' 'Cannot connect to valid Test DB for DB\IO test.'
@@ -543,8 +549,6 @@ final class CoreLibsDBIOTest extends TestCase
/** /**
* Test dbSetDbug, dbGetDebug * Test dbSetDbug, dbGetDebug
* *
* @covers ::dbGetDbug
* @covers ::dbSetDebug
* @testdox Set and Get Debug flag * @testdox Set and Get Debug flag
* *
* @return void * @return void
@@ -3021,8 +3025,6 @@ final class CoreLibsDBIOTest extends TestCase
* @covers ::dbReturnParams * @covers ::dbReturnParams
* @covers ::dbCacheReset * @covers ::dbCacheReset
* @covers ::dbGetCursorExt * @covers ::dbGetCursorExt
* @covers ::dbCursorPos
* @covers ::dbCursorNumRows
* @dataProvider dbReturnProvider * @dataProvider dbReturnProvider
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName] * @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
* *
@@ -13,29 +13,6 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsDebugFileWriterTest extends TestCase final class CoreLibsDebugFileWriterTest extends TestCase
{ {
/**
* Undocumented function
*
* @return array
*/
public function fsetFolderProvider(): array
{
return [
'valid log folder name' => [
0 => '/tmp/',
1 => true,
],
'invalid log folder name' => [
0 => 'some name',
1 => false,
],
'not writeable log folder name' => [
0 => '/opt',
1 => false,
]
];
}
/** /**
* Undocumented function * Undocumented function
* *
@@ -85,18 +62,59 @@ final class CoreLibsDebugFileWriterTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @dataProvider fsetFolderProvider * @testdox fsetFolder test correct return code
* @testdox fsetFolder $input will match $expected [$_dataName]
* *
* @param string $input
* @param boolean $expected
* @return void * @return void
*/ */
public function testFsetFolder(string $input, bool $expected): void public function testFsetFolder(): void
{ {
// check the following
// - valid folder, writeable
// - valid folder, not writeable
// - invalid folder (eg file)
// - invalid folder name (eg contains spaces), must match ^[\w\-\/]+
// if we have no /tmp/ folder, we cannot test this, so skip the test
if (!is_dir('/tmp')) {
$this->markTestSkipped('No /tmp folder found, cannot test fsetFolder');
}
// TEST 3:
// create a file in /tmp/ to test invalid folder (eg file)
$test_file = '/tmp/somefile.txt';
if (!is_file($test_file)) {
touch($test_file);
}
$this->assertEquals( $this->assertEquals(
$expected, false,
\CoreLibs\Debug\FileWriter::fsetFolder($input) \CoreLibs\Debug\FileWriter::fsetFolder($test_file)
);
// TEST 4:
// test invalid folder name (eg contains spaces), must match ^[\w\-\/]+
$this->assertEquals(
false,
\CoreLibs\Debug\FileWriter::fsetFolder('some name')
);
// TEST 1:
// create a folder in /tmp/ to test valid folder, writeable
$test_folder = '/tmp/somefolder';
if (!is_dir($test_folder)) {
mkdir($test_folder);
}
$this->assertEquals(
true,
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
);
// TEST 2:
// create a folder in /tmp/ to test valid folder, not writeable
$test_folder = '/tmp/somefolder2';
if (!is_dir($test_folder)) {
mkdir($test_folder);
}
// remove all write permissions for the folder
chmod($test_folder, 0555);
$this->assertEquals(
false,
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
); );
} }
+22 -9
View File
@@ -48,8 +48,8 @@ final class CoreLibsDebugSupportTest extends TestCase
* @dataProvider printTimeProvider * @dataProvider printTimeProvider
* @testdox printTime test with $microtime and match to regex [$_dataName] * @testdox printTime test with $microtime and match to regex [$_dataName]
* *
* @param int|null $mircrotime * @param ?int $microtime
* @param string $expected * @param string $regex
* @return void * @return void
*/ */
public function testPrintTime(?int $microtime, string $regex): void public function testPrintTime(?int $microtime, string $regex): void
@@ -460,10 +460,8 @@ final class CoreLibsDebugSupportTest extends TestCase
* Undocumented function * Undocumented function
* *
* @cover ::getCallerFileLine * @cover ::getCallerFileLine
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:6434","phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php:6434"]
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName] * @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
* *
* @param string $expected
* @return void * @return void
*/ */
public function testGetCallerFileLine(): void public function testGetCallerFileLine(): void
@@ -471,15 +469,19 @@ final class CoreLibsDebugSupportTest extends TestCase
// regex prefix with path "/../" and then fixed vendor + \d+ // regex prefix with path "/../" and then fixed vendor + \d+
// or phar start if phiev installed // or phar start if phiev installed
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php // phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
// phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php
$regex = "/^(" $regex = "/^("
. "\/.*\/vendor\/phpunit\/phpunit\/src" . "\/.*\/vendor\/phpunit\/phpunit\/src"
. "|" . "|"
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit" . "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
. "|"
. "phar:\/\/\/usr\/local\/bin\/phpunit\/phpunit"
. ")" . ")"
. "\/Framework\/TestCase.php:\d+$/"; . "\/Framework\/TestCase.php:\d+$/";
$this->assertMatchesRegularExpression( $this->assertMatchesRegularExpression(
$regex, $regex,
Support::getCallerFileLine() Support::getCallerFileLine(),
'Failed for: ' . Support::getCallerFileLine()
); );
} }
@@ -522,7 +524,7 @@ final class CoreLibsDebugSupportTest extends TestCase
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$compare, $compare,
'assert expected 10' 'assert expected 10: ' . print_r($compare, true)
); );
break; break;
case 11: case 11:
@@ -545,10 +547,20 @@ final class CoreLibsDebugSupportTest extends TestCase
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$compare, $compare,
'assert expected 11' 'assert expected 11: ' . print_r($compare, true)
); );
break; break;
case 12: case 12:
// if compare starts with "main"
if ($compare[0] == 'main') {
// add two more run after main
array_splice(
$expected,
1,
0,
['run', 'run']
);
} else {
// add two "run" before "runBare" // add two "run" before "runBare"
array_splice( array_splice(
$expected, $expected,
@@ -562,10 +574,11 @@ final class CoreLibsDebugSupportTest extends TestCase
0, 0,
['include'] ['include']
); );
}
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$compare, $compare,
'assert expected 12' 'assert expected 12: ' . print_r($compare, true)
); );
break; break;
default: default:
@@ -589,7 +602,7 @@ final class CoreLibsDebugSupportTest extends TestCase
if ($call_stack < 8) { if ($call_stack < 8) {
$this->assertFalse(true, 'getCallStack too low: 8'); $this->assertFalse(true, 'getCallStack too low: 8');
} else { } else {
$this->assertTrue(true, 'getCallSteck ok'); $this->assertTrue(true, 'getCallStack ok');
} }
// just test top entry // just test top entry
$first = array_shift($call_stack); $first = array_shift($call_stack);
+1
View File
@@ -0,0 +1 @@
test.env
@@ -442,7 +442,6 @@ final class CoreLibsLanguageL10nTest extends TestCase
* init check and connected change translation * init check and connected change translation
* *
* @covers ::getTranslator * @covers ::getTranslator
* @covers ::l10nReloadMOfile
* @dataProvider getTranslatorProvider * @dataProvider getTranslatorProvider
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName] * @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
* *
@@ -639,7 +638,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
* plural and plural context * plural and plural context
* *
* @covers ::__n * @covers ::__n
* @covers ::__pn * @covers ::__np
* @dataProvider ngettextProvider * @dataProvider ngettextProvider
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName] * @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
* *
@@ -865,6 +864,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
string $value, string $value,
string $expected string $expected
): void { ): void {
$old_value = null;
switch ($type) { switch ($type) {
case 'global': case 'global':
$GLOBALS[$var] = $value; $GLOBALS[$var] = $value;
@@ -1101,11 +1101,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
* fuctions check * fuctions check
* TODO: others d/dn/dp/dnp gettext functions * TODO: others d/dn/dp/dnp gettext functions
* *
* @covers __setlocale * @covers _setlocale
* @covers __bindtextdomain * @covers _bindtextdomain
* @covers __bind_textdomain_codeset * @covers _bind_textdomain_codeset
* @covers __textdomain * @covers _textdomain
* @covers __gettext * @covers _gettext
* @covers __ * @covers __
* @dataProvider functionsProvider * @dataProvider functionsProvider
* @testdox check functions with locale $locale and domain $domain [$_dataName] * @testdox check functions with locale $locale and domain $domain [$_dataName]
@@ -514,7 +514,6 @@ final class CoreLibsLoggingLoggingTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers Logger\Flag
* @testdox Logger\Flag enum test * @testdox Logger\Flag enum test
* *
* @return void * @return void
@@ -828,6 +827,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
// clean all data in folder first // clean all data in folder first
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log')); array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
$log_status = false;
switch ($level->value) { switch ($level->value) {
case 200: case 200:
$log_status = $log->info($message); $log_status = $log->info($message);
@@ -851,7 +851,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
$log_status = $log->emergency($message); $log_status = $log->emergency($message);
break; break;
} }
$this->assertTrue($log_status, 'log write successful'); $this->assertTrue($log_status, 'log write unsuccessful for level: ' . $level->getName());
$file_content = file_get_contents( $file_content = file_get_contents(
$log->getLogFolder() . $log->getLogFile() $log->getLogFolder() . $log->getLogFile()
) ?: ''; ) ?: '';
@@ -334,7 +334,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -370,7 +369,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -397,7 +395,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -424,7 +421,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -469,7 +465,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* Test decryption with wrong key * Test decryption with wrong key
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptFailed * @dataProvider providerEncryptFailed
@@ -496,7 +491,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* Test decryption with wrong key * Test decryption with wrong key
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptFailed * @dataProvider providerEncryptFailed
@@ -521,7 +515,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
/** /**
* Test decryption with wrong key * Test decryption with wrong key
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptFailed * @dataProvider providerEncryptFailed
@@ -104,7 +104,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -132,7 +131,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -158,7 +156,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/** /**
* test encrypt/decrypt produce correct output * test encrypt/decrypt produce correct output
* *
* @covers ::generateRandomKey
* @covers ::encryptKey * @covers ::encryptKey
* @covers ::decryptKey * @covers ::decryptKey
* @dataProvider providerEncryptDecryptSuccess * @dataProvider providerEncryptDecryptSuccess
@@ -202,7 +199,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/** /**
* Test decryption with wrong key * Test decryption with wrong key
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptFailed * @dataProvider providerEncryptFailed
@@ -228,7 +224,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/** /**
* Test decryption with wrong key * Test decryption with wrong key
* *
* @covers ::generateRandomKey
* @covers ::encrypt * @covers ::encrypt
* @covers ::decrypt * @covers ::decrypt
* @dataProvider providerEncryptFailed * @dataProvider providerEncryptFailed
@@ -252,7 +247,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
/** /**
* Test decryption with wrong key * Test decryption with wrong key
* *
* @covers ::generateRandomKey
* @covers ::encryptKey * @covers ::encryptKey
* @covers ::decryptKey * @covers ::decryptKey
* @dataProvider providerEncryptFailed * @dataProvider providerEncryptFailed
@@ -42,7 +42,6 @@ final class CoreLibsTemplateHtmlBuilderElementTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @covers ::Element
* @covers ::buildHtml * @covers ::buildHtml
* @covers ::getTag * @covers ::getTag
* @covers ::getId * @covers ::getId
@@ -58,6 +58,11 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
if ($handle === false) { if ($handle === false) {
continue; continue;
} }
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$status = curl_exec($handle);
if ($status === false) {
continue;
}
$this->url_basic = $url; $this->url_basic = $url;
// print "Open: $url\n"; // print "Open: $url\n";
break; break;
@@ -459,15 +464,14 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
/** /**
* set setup + header, base uri change * set setup + header, base uri change
* *
* @covers ::Curl
* @covers ::setBaseUri * @covers ::setBaseUri
* @covers ::addHeader * @covers ::setHeaders
* @covers ::removeHEader * @covers ::removeHeaders
* @dataProvider providerUrlRequestsCurlSetup * @dataProvider providerUrlRequestsCurlSetup
* @testdox UrlRequests\Curl Class setup tasks [$_dataName] * @testdox UrlRequests\Curl Class setup tasks [$_dataName]
* *
* @param null|array $config * @param null|array $config
* @param array $expected * @param array<string,mixed> $expected_set
* @param null|string $new_base_uri * @param null|string $new_base_uri
* @param null|array $set_header * @param null|array $set_header
* @param null|bool $set_header_add * @param null|bool $set_header_add
@@ -492,10 +496,18 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
}; };
// if ($new_base_uri === null && $set_header === null && $remove_header === null) { // if ($new_base_uri === null && $set_header === null && $remove_header === null) {
// } // }
$this->assertEquals($expected_set, $curl->getConfig(), 'Class setup config mismatch'); $this->assertEquals(
$expected_set,
$curl->getConfig(),
'Class setup config mismatch'
);
if ($new_base_uri !== null) { if ($new_base_uri !== null) {
$curl->setBaseUri($new_base_uri); $curl->setBaseUri($new_base_uri);
$this->assertEquals($expected_change, $curl->getConfig(), 'new base_uri not matching'); $this->assertEquals(
$expected_change,
$curl->getConfig(),
'new base_uri not matching'
);
} }
if ($set_header !== null) { if ($set_header !== null) {
if ($set_header_add !== null) { if ($set_header_add !== null) {
@@ -503,11 +515,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
} else { } else {
$curl->setHeaders($set_header); $curl->setHeaders($set_header);
} }
$this->assertEquals($expected_change, $curl->getConfig(), 'new headers not matching'); $this->assertEquals(
$expected_change,
$curl->getConfig(),
'new headers not matching'
);
} }
if ($remove_header !== null) { if ($remove_header !== null) {
$curl->removeHeaders($remove_header); $curl->removeHeaders($remove_header);
$this->assertEquals($expected_change, $curl->getConfig(), 'removed headers not matching'); $this->assertEquals(
$expected_change,
$curl->getConfig(),
'removed headers not matching'
);
} }
} }
@@ -877,7 +897,7 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
string $return_content string $return_content
) { ) {
if (!$this->url_basic) { if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing: GET'); $this->markTestSkipped('No backend interface setup for testing');
} }
$curl = new \CoreLibs\UrlRequests\Curl(); $curl = new \CoreLibs\UrlRequests\Curl();
// options // options
@@ -960,6 +980,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testUrlRequestsCurlRequestMultiple() public function testUrlRequestsCurlRequestMultiple()
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(); $curl = new \CoreLibs\UrlRequests\Curl();
// get // get
$response = $curl->get($this->url_basic, [ $response = $curl->get($this->url_basic, [
@@ -1051,6 +1074,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testUrlRequestsCurlAuthHeader() public function testUrlRequestsCurlAuthHeader()
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl([ $curl = new \CoreLibs\UrlRequests\Curl([
"auth" => ["user", "pass", "basic"], "auth" => ["user", "pass", "basic"],
"http_errors" => false, "http_errors" => false,
@@ -1117,6 +1143,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testExceptionInvalidHeaderKey(): void public function testExceptionInvalidHeaderKey(): void
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(); $curl = new \CoreLibs\UrlRequests\Curl();
$this->expectException(\RuntimeException::class); $this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/InvalidHeaderKey/"); $this->expectExceptionMessageMatches("/InvalidHeaderKey/");
@@ -1137,6 +1166,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testExceptionInvalidHeaderValue(): void public function testExceptionInvalidHeaderValue(): void
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(); $curl = new \CoreLibs\UrlRequests\Curl();
$this->expectException(\RuntimeException::class); $this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/InvalidHeaderValue/"); $this->expectExceptionMessageMatches("/InvalidHeaderValue/");
@@ -1186,6 +1218,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testExceptionBadRequest(): void public function testExceptionBadRequest(): void
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]); $curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
$this->expectException(\RuntimeException::class); $this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/ClientError/"); $this->expectExceptionMessageMatches("/ClientError/");
@@ -1207,6 +1242,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testExceptionBadRequestEnable(): void public function testExceptionBadRequestEnable(): void
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]); $curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
$this->expectException(\RuntimeException::class); $this->expectException(\RuntimeException::class);
$this->expectExceptionMessageMatches("/ClientError/"); $this->expectExceptionMessageMatches("/ClientError/");
@@ -1229,6 +1267,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
*/ */
public function testExceptionBadRequestUnset(): void public function testExceptionBadRequestUnset(): void
{ {
if (!$this->url_basic) {
$this->markTestSkipped('No backend interface setup for testing');
}
// if true, with false it has to be off // if true, with false it has to be off
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]); $curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
$response = $curl->request('get', $this->url_basic, [ $response = $curl->request('get', $this->url_basic, [
+6
View File
@@ -23,4 +23,10 @@
<directory>./www/lib/CoreLibs</directory> <directory>./www/lib/CoreLibs</directory>
</include> </include>
</source> --> </source> -->
<logging>
<!-- JUnit XML log (Most Common for CI/CD) -->
<junit outputFile="build/logs/junit.xml"/>
<!-- TestDox HTML log -->
<testdoxHtml outputFile="build/testdox.html"/>
</logging>
</phpunit> </phpunit>
+19
View File
@@ -38,6 +38,25 @@ print "GETFILENAMEENDING: $file: " . File::getFilenameEnding($file) . "<br>";
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php'; $file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>"; print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>";
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>"; print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
try {
print "MIMEINFO: does_not_exists.txt " . File::getMimeType("does_not_exists.txt") . "<br>";
} catch (\Exception $e) {
print "Error: " . get_class($e) . ": " . $e->getMessage() . "<br>";
}
$files = [
'layout/css/edit.css',
'layout/javascript/edit.jq.js',
'class_test.file.php',
getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php',
];
foreach ($files as $file) {
try {
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
} catch (\Exception $e) {
print "Error: " . get_class($e) . ": " . $e->getMessage() . "<br>";
}
}
print "</body></html>"; print "</body></html>";
+13
View File
@@ -1598,4 +1598,17 @@ function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-lin
} }
} }
/**
* HTML decode &something; entrie
* @param {string} str
* @returns string
* @deprecated use utils.js
*/
function decodeHtmlEntities(str) // eslint-disable-line no-unused-vars
{
const parser = new DOMParser();
const doc = parser.parseFromString(str, 'text/html');
return doc.documentElement.textContent;
}
/* END */ /* END */
+16 -7
View File
@@ -135,7 +135,7 @@ var HtmlElementCreator = class {
* @param {String} tag must set tag (div, span, etc) * @param {String} tag must set tag (div, span, etc)
* @param {String} [id=''] optional set for id, if input, select will be used for name * @param {String} [id=''] optional set for id, if input, select will be used for name
* @param {String} [content=''] text content inside, is skipped if sub elements exist * @param {String} [content=''] text content inside, is skipped if sub elements exist
* @param {Array} [css=[]] array for css tags * @param {Array<String>} [css=[]] array for css tags
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style) * @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
* @return {Object} created element as an object * @return {Object} created element as an object
*/ */
@@ -509,6 +509,11 @@ function numberWithCommas(number) {
function convertLBtoBR(string) { function convertLBtoBR(string) {
return string.replace(/(?:\r\n|\r|\n)/g, "<br>"); return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
} }
function decodeHtmlEntities(str) {
const parser = new DOMParser();
const doc = parser.parseFromString(str, "text/html");
return doc.documentElement.textContent;
}
// src/utils/DateTimeHelpers.mjs // src/utils/DateTimeHelpers.mjs
function getTimestamp() { function getTimestamp() {
@@ -660,18 +665,19 @@ function getQueryStringParam(search = "", query = "", single = false) {
if (search) { if (search) {
let _params = url.searchParams.getAll(search); let _params = url.searchParams.getAll(search);
if (_params.length == 1 || single === true) { if (_params.length == 1 || single === true) {
param = _params[0]; return _params[0];
} else if (_params.length > 1) { } else if (_params.length > 1) {
param = _params; return _params;
} }
} else { } else {
param = {}; let param2 = {};
for (const [key] of url.searchParams.entries()) { for (const [key] of url.searchParams.entries()) {
if (typeof param[key] === "undefined") { if (typeof param2[key] === "undefined") {
let _params = url.searchParams.getAll(key); let _params = url.searchParams.getAll(key);
param[key] = _params.length < 2 || single === true ? _params[0] : _params; param2[key] = _params.length < 2 || single === true ? _params[0] : _params;
} }
} }
return param2;
} }
return param; return param;
} }
@@ -1425,6 +1431,9 @@ function numberWithCommas2(x) {
function convertLBtoBR2(string) { function convertLBtoBR2(string) {
return convertLBtoBR(string); return convertLBtoBR(string);
} }
function decodeHtmlEntities2(string) {
return decodeHtmlEntities(string);
}
function getTimestamp2() { function getTimestamp2() {
return getTimestamp(); return getTimestamp();
} }
@@ -1549,7 +1558,7 @@ function acssel(_element, css) {
return hec.acssel(_element, css); return hec.acssel(_element, css);
} }
function scssel(_element, rcss, acss) { function scssel(_element, rcss, acss) {
hec.scssel(_element, rcss, acss); return hec.scssel(_element, rcss, acss);
} }
function phfo(tree) { function phfo(tree) {
return hec.phfo(tree); return hec.phfo(tree);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -23,7 +23,7 @@
"require": { "require": {
"egrajp/smarty-extended": "^5.4", "egrajp/smarty-extended": "^5.4",
"php": ">=8.1", "php": ">=8.1",
"gullevek/dotenv": "^2.0", "gullevek/dotenv": "^3.0",
"psr/log": "^2.0 || ^3.0", "psr/log": "^2.0 || ^3.0",
"php-privacy/openpgp": "^2.1" "php-privacy/openpgp": "^2.1"
} }
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+9 -3
View File
@@ -58,15 +58,21 @@ class File
* else returns '' for any other finfo read problem * else returns '' for any other finfo read problem
* *
* @param string $read_file File to read, relative or absolute path * @param string $read_file File to read, relative or absolute path
* @return string * @return string mime type
* @throws \UnexpectedValueException if file cannot be read or is not a file
* @throws \RangeException if we cannot get a mime type and throw exception is on
*/ */
public static function getMimeType(string $read_file): string public static function getMimeType(string $read_file): string
{ {
$finfo = new \finfo(FILEINFO_MIME_TYPE); $finfo = new \finfo(FILEINFO_MIME_TYPE);
if (!is_file($read_file)) { if (!is_file($read_file) || !is_readable($read_file)) {
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file); throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
} }
return $finfo->file($read_file) ?: ''; $mime_type = $finfo->file($read_file);
if ($mime_type === false) {
throw new \RangeException('[getMimeType] Cannot get mime type for: ' . $read_file);
}
return $mime_type;
} }
} }
+2 -2
View File
@@ -133,7 +133,7 @@ class DateTime
} else { } else {
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) { for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
$output = floor((float)$timestamp / $timegroups[$i]); $output = floor((float)$timestamp / $timegroups[$i]);
$timestamp = (float)$timestamp % $timegroups[$i]; $timestamp = $timestamp % $timegroups[$i];
// output has days|hours|min|sec // output has days|hours|min|sec
if ($output || $time_string) { if ($output || $time_string) {
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : ''); $time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
@@ -453,7 +453,7 @@ class DateTime
} }
if (isset($matches[11]) && is_numeric($matches[11])) { if (isset($matches[11]) && is_numeric($matches[11])) {
// for milliseconds, we need to divide by 1000 and add them // for milliseconds, we need to divide by 1000 and add them
$timestamp += (float)($matches[11] / 1000); $timestamp += ((float)$matches[11] / 1000);
} }
if ($negative) { if ($negative) {
// cast to float so we can do a negative multiplication // cast to float so we can do a negative multiplication
+5 -6
View File
@@ -43,7 +43,10 @@ class Byte
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
{ {
// if not numeric, return as is // if not numeric, return as is
if (is_numeric($bytes)) { if (!is_numeric($bytes)) {
// if anything other return as string
return (string)$bytes;
}
// flags bit wise check // flags bit wise check
// remove space between number and suffix // remove space between number and suffix
if ($flags & self::BYTE_FORMAT_NOSPACE) { if ($flags & self::BYTE_FORMAT_NOSPACE) {
@@ -104,10 +107,6 @@ class Byte
} else { } else {
return round($bytes_calc, 2) . $pre; return round($bytes_calc, 2) . $pre;
} }
} else {
// if anything other return as string
return (string)$bytes;
}
} }
/** /**
@@ -154,7 +153,7 @@ class Byte
if (!empty($matches[1])) { if (!empty($matches[1])) {
$number_negative = true; $number_negative = true;
} }
if (isset($matches[2]) && isset($matches[3])) { if (isset($matches[2])) {
// remove all non valid characters from the number // remove all non valid characters from the number
$number = preg_replace('/[^0-9\.]/', '', $matches[2]); $number = preg_replace('/[^0-9\.]/', '', $matches[2]);
// final clean up and convert to float // final clean up and convert to float
+6 -6
View File
@@ -957,9 +957,9 @@ class Color
* Undocumented function * Undocumented function
* *
* @param HWB $hwb * @param HWB $hwb
* @return Lch * @return LCH
*/ */
public static function hwbToLch(HWB $hwb): Lch public static function hwbToLch(HWB $hwb): LCH
{ {
return self::rgbToLch( return self::rgbToLch(
self::hwbToRgb($hwb) self::hwbToRgb($hwb)
@@ -1078,10 +1078,10 @@ class Color
/** /**
* OkLab to Lch (CIE) * OkLab to Lch (CIE)
* *
* @param LAB $lab * @param Lab $lab
* @return LCH * @return LCH
*/ */
public static function okLabToLch(LAB $lab): LCH public static function okLabToLch(Lab $lab): LCH
{ {
return self::labToLch( return self::labToLch(
self::okLabToLab($lab) self::okLabToLab($lab)
@@ -1092,9 +1092,9 @@ class Color
* Lch (CIE) to OkLab * Lch (CIE) to OkLab
* *
* @param LCH $lch * @param LCH $lch
* @return LAB * @return Lab
*/ */
public static function lchToOkLab(LCH $lch): LAB public static function lchToOkLab(LCH $lch): Lab
{ {
return self::labToOkLab( return self::labToOkLab(
self::lchToLab($lch) self::lchToLab($lch)
+4
View File
@@ -76,9 +76,13 @@ class Json
* @param string $json * @param string $json
* @param int $flags only JSON_INVALID_UTF8_IGNORE is currently allowed * @param int $flags only JSON_INVALID_UTF8_IGNORE is currently allowed
* @return bool * @return bool
* @throws \InvalidArgumentException if flags is invalid
*/ */
public static function jsonValidate(string $json, int $flags = 0): bool public static function jsonValidate(string $json, int $flags = 0): bool
{ {
if ($flags != 0 && $flags != JSON_INVALID_UTF8_IGNORE) {
throw new \InvalidArgumentException("For flag only 0 or JSON_INVALID_UTF8_IGNORE is allwed: " . $flags);
}
$json_valid = json_validate($json, flags:$flags); $json_valid = json_validate($json, flags:$flags);
self::$json_last_error = json_last_error(); self::$json_last_error = json_last_error();
return $json_valid; return $json_valid;
+15 -9
View File
@@ -2232,9 +2232,9 @@ class IO
$milliseconds = $matches[13] ?? ''; $milliseconds = $matches[13] ?? '';
// clean up, hide entries that have 00 in the time group // clean up, hide entries that have 00 in the time group
$hour = $hour != '00' ? preg_replace('/^0/', '', $hour) : ''; $hour = !empty($hour) ? preg_replace('/^0/', '', $hour) : '';
$minutes = $minutes != '00' ? preg_replace('/^0/', '', $minutes) : ''; $minutes = !empty($minutes) ? preg_replace('/^0/', '', $minutes) : '';
$seconds = $seconds != '00' ? preg_replace('/^0/', '', $seconds) : ''; $seconds = !empty($seconds) ? preg_replace('/^0/', '', $seconds) : '';
// strip any leading or trailing spaces // strip any leading or trailing spaces
$time_string = trim( $time_string = trim(
@@ -2562,21 +2562,27 @@ class IO
// set field names // set field names
$this->cursor_ext[$query_hash]['field_names'] = []; $this->cursor_ext[$query_hash]['field_names'] = [];
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) { for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
$this->cursor_ext[$query_hash]['field_names'][] = if (
$this->db_functions->__dbFieldName( ($field_name = $this->db_functions->__dbFieldName(
$this->cursor_ext[$query_hash]['cursor'], $this->cursor_ext[$query_hash]['cursor'],
$i $i
); )) !== false
) {
$this->cursor_ext[$query_hash]['field_names'][] = $field_name;
}
} }
$this->field_names = $this->cursor_ext[$query_hash]['field_names']; $this->field_names = $this->cursor_ext[$query_hash]['field_names'];
// field types // field types
$this->cursor_ext[$query_hash]['field_types'] = []; $this->cursor_ext[$query_hash]['field_types'] = [];
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) { for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
$this->cursor_ext[$query_hash]['field_types'][] = if (
$this->db_functions->__dbFieldType( ($field_type = $this->db_functions->__dbFieldType(
$this->cursor_ext[$query_hash]['cursor'], $this->cursor_ext[$query_hash]['cursor'],
$i $i
); )) !== false
) {
$this->cursor_ext[$query_hash]['field_types'][] = $field_type;
}
} }
$this->field_types = $this->cursor_ext[$query_hash]['field_types']; $this->field_types = $this->cursor_ext[$query_hash]['field_types'];
// combined name => type // combined name => type
+1 -1
View File
@@ -536,7 +536,7 @@ class PgSQL implements Interface\SqlFunctions
$connection_string[] = 'sslmode=' . $db_ssl; $connection_string[] = 'sslmode=' . $db_ssl;
} }
// connect // connect
$this->dbh = pg_connect(join(' ', $connection_string)); $this->dbh = @pg_connect(join(' ', $connection_string));
return $this->dbh; return $this->dbh;
} }
+4 -4
View File
@@ -32,11 +32,11 @@ class FileWriter
if (!is_writeable($folder)) { if (!is_writeable($folder)) {
return false; return false;
} }
// if last is not / then add if (!is_dir($folder)) {
if (substr($folder, -1, 1) != DIRECTORY_SEPARATOR) { return false;
$folder .= DIRECTORY_SEPARATOR;
} }
self::$debug_folder = $folder; // if last is not / then add
self::$debug_folder = rtrim($folder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
return true; return true;
} }
+3 -3
View File
@@ -146,7 +146,7 @@ class L10n
* @param string $locale language name, if not set, try previous set * @param string $locale language name, if not set, try previous set
* @param string $domain set name for mo file, if not set, try previous set * @param string $domain set name for mo file, if not set, try previous set
* @param string $path path, if not set try to get from paths array, else self * @param string $path path, if not set try to get from paths array, else self
* @param string $override_encoding if locale does not env encoding set, use this one * @param string $override_encoding if locale does not have encoding set, use this one
* @return GetTextReader the main gettext reader object * @return GetTextReader the main gettext reader object
*/ */
public function getTranslator( public function getTranslator(
@@ -301,7 +301,7 @@ class L10n
* Get the local as array same to the GetLocale::setLocale return * Get the local as array same to the GetLocale::setLocale return
* This does not set from outside, but only what is set in the l10n class * This does not set from outside, but only what is set in the l10n class
* *
* @return array{locale: string, lang: string, lang_short: string, domain: string, encoding: string, path: string} * @return array{locale:string,lang:string,lang_short:string,domain:string,encoding:string,path:string}
*/ */
public function getLocaleAsArray(): array public function getLocaleAsArray(): array
{ {
@@ -321,7 +321,7 @@ class L10n
* parse the locale string for further processing * parse the locale string for further processing
* *
* @param string $locale Locale to parse * @param string $locale Locale to parse
* @return array<string,string|null> array with lang, country, charset, modifier * @return array{lang:string|null,country:string|null,charset:string|null,modifier:string|null} parsed locale
*/ */
public static function parseLocale(string $locale = ''): array public static function parseLocale(string $locale = ''): array
{ {
+2 -2
View File
@@ -86,7 +86,7 @@ enum Level: int
/** /**
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name * @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
* @return static * @return self
*/ */
public static function fromName(string $name): self public static function fromName(string $name): self
{ {
@@ -104,7 +104,7 @@ enum Level: int
/** /**
* @param value-of<self::VALUES> $value * @param value-of<self::VALUES> $value
* @return static * @return self
*/ */
public static function fromValue(int $value): self public static function fromValue(int $value): self
{ {
+25 -18
View File
@@ -178,11 +178,11 @@ class Elements
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/", "/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) { function ($matches) {
return self::createUrl( return self::createUrl(
$matches[1] ?? '', $matches[1],
$matches[2] ?? '', $matches[2],
$matches[3] ?? '', $matches[3],
$matches[4] ?? '', $matches[4],
$matches[5] ?? '', $matches[5],
$matches[7] ?? '', $matches[7] ?? '',
$matches[9] ?? '' $matches[9] ?? ''
); );
@@ -232,8 +232,15 @@ class Elements
* @param string $class style sheet * @param string $class style sheet
* @return string correct string for url href process * @return string correct string for url href process
*/ */
private static function createUrl($href, $atag, $_1, $_2, $_3, $name, $class): string private static function createUrl(
{ string $href,
string $atag,
string $_1,
string $_2,
string $_3,
string $name,
string $class
): string {
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class"); // $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link) // if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) { if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
@@ -250,11 +257,8 @@ class Elements
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##"; . "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
} elseif ($href && !$atag) { } elseif ($href && !$atag) {
return "href=##QUOT##$_1$_2$_3##QUOT##"; return "href=##QUOT##$_1$_2$_3##QUOT##";
} elseif ($atag) {
return $atag . $_2 . $_3;
} else {
return $href;
} }
return $atag . $_2 . $_3;
} }
/** /**
@@ -269,8 +273,15 @@ class Elements
* @param string $class style sheet * @param string $class style sheet
* @return string created html email a href string * @return string created html email a href string
*/ */
private static function createEmail($mailto, $atag, $_1, $_2, $_3, $title, $class) private static function createEmail(
{ string $mailto,
string $atag,
string $_1,
string $_2,
string $_3,
string $title,
string $class
): string {
$email = $_1 . "@" . $_2 . "." . $_3; $email = $_1 . "@" . $_2 . "." . $_3;
if (!$mailto && !$atag) { if (!$mailto && !$atag) {
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##" return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
@@ -278,12 +289,8 @@ class Elements
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##"; . "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
} elseif ($mailto && !$atag) { } elseif ($mailto && !$atag) {
return "mailto:" . $email; return "mailto:" . $email;
} elseif ($atag) {
return $atag . $email;
} else {
// else just return email as is
return $email;
} }
return $atag . $email;
} }
} }
+10 -7
View File
@@ -954,11 +954,10 @@ class Curl implements Interface\RequestsInterface
) )
) { ) {
unset($this->config['headers'][$header_key]); unset($this->config['headers'][$header_key]);
unset($this->headers_named[$header_key]); unset($this->headers_named[strtolower($header_key)]);
} elseif ( } elseif (
// string value, array keys = in // right side is array, and value is anything string or array
// or both array and not a full match in the one before // if right side is string, and we give value array, we do nothing
(is_string($value) || is_array($value)) &&
is_array($this->config['headers'][$header_key]) is_array($this->config['headers'][$header_key])
) { ) {
// part remove of key, value must be array // part remove of key, value must be array
@@ -966,10 +965,14 @@ class Curl implements Interface\RequestsInterface
$value = [$value]; $value = [$value];
} }
// array values so we rewrite the key pos // array values so we rewrite the key pos
$this->config['headers'][$header_key] = array_values(array_diff( /** @var array<int|string,string> $headers */
$this->config['headers'][$header_key], $headers = $this->config['headers'][$header_key];
$this->config['headers'][$header_key] = array_values(
array_diff(
$headers,
$value $value
)); )
);
} }
} }
} }