Compare commits
81 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f5daaca598 | ||
|
|
6b4f310cd2 | ||
|
|
7b5bddb529 | ||
|
|
0a6fdf1248 | ||
|
|
3220180d58 | ||
|
|
8c8f14ec74 | ||
|
|
643991c3fd | ||
|
|
c81c46d426 | ||
|
|
d97b173ee7 | ||
|
|
b61152f10e | ||
|
|
0c68ebe652 | ||
|
|
31d0cdb8ad | ||
|
|
0f823bd283 | ||
|
|
6385a48824 | ||
|
|
a754d897cf | ||
|
|
4600f8f7bf | ||
|
|
04e4fe46f2 | ||
|
|
c35d3c9324 | ||
|
|
e92a682a8c | ||
|
|
ea07e4b95b | ||
|
|
88178cb08d | ||
|
|
5d98be06be | ||
|
|
183cadb0fd | ||
|
|
2067a6fe1d | ||
|
|
f5b6c639fb | ||
|
|
cde29c0362 | ||
|
|
10234000b7 | ||
|
|
a63a50a412 | ||
|
|
59da10b649 | ||
|
|
b714de498f | ||
|
|
aa11937ab2 | ||
|
|
d64d5f081c | ||
|
|
3085b52714 | ||
|
|
9949a5ef7f | ||
|
|
74ba935e96 | ||
|
|
39a62ed59d | ||
|
|
1379cf1519 | ||
|
|
2d15b78d21 | ||
|
|
92ebdb4b9e | ||
|
|
a523a4e831 | ||
|
|
db8e17ae7c | ||
|
|
5b581c2ed6 | ||
|
|
1e734581d7 | ||
|
|
aecdda3557 | ||
|
|
2119b757b1 | ||
|
|
27087a0e0e | ||
|
|
2b689b666a | ||
|
|
63aeebdee0 | ||
|
|
51e700cd10 | ||
|
|
71a431d5aa | ||
|
|
6970e6221b | ||
|
|
831f3be1a8 | ||
|
|
f2aba8c466 | ||
|
|
f085ccaa38 | ||
|
|
6c3c1a908d | ||
|
|
388b90913a | ||
|
|
07aea9d7b2 | ||
|
|
edcdbee523 | ||
|
|
43b51895f0 | ||
|
|
d0e294ecf5 | ||
|
|
3c35341e8b | ||
|
|
daf1f9263c | ||
|
|
805c695d68 | ||
|
|
ffdd45e32a | ||
|
|
316ca106fd | ||
|
|
fd9b201346 | ||
|
|
667dc4de8e | ||
|
|
fed67e990d | ||
|
|
c181a83b48 | ||
|
|
c830a32962 | ||
|
|
82bc99b181 | ||
|
|
556cabca38 | ||
|
|
6f4c5e36e6 | ||
|
|
a3c49e408a | ||
|
|
cc77d7e031 | ||
|
|
d553c1364f | ||
|
|
3f374a2cd7 | ||
|
|
9e99275db5 | ||
|
|
330e2baf39 | ||
|
|
5a81626e8c | ||
|
|
41cff5e3c6 |
17
4dev/bin/create_mo.sh
Executable file
17
4dev/bin/create_mo.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
base_folder='/var/www/html/developers/clemens/core_data/php_libraries/trunk/www/';
|
||||||
|
|
||||||
|
# locale gettext po to mo translator master
|
||||||
|
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||||
|
file=$(basename $file .po);
|
||||||
|
echo "Translate language ${file}";
|
||||||
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
|
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||||
|
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
||||||
|
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||||
|
fi;
|
||||||
|
msgfmt -o ${base_folder}/includes/locale/${locale}/LC_MESSAGES/${domain}.mo ${base_folder}../4dev/locale/${locale}-${domain}.po;
|
||||||
|
done;
|
||||||
|
|
||||||
|
# __END__
|
||||||
@@ -1,4 +1,42 @@
|
|||||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||||
# -c phpunit.xml
|
# -c phpunit.xml
|
||||||
# --testdox
|
# --testdox
|
||||||
${base}www/vendor/bin/phpunit -c ${base}phpunit.xml ${base}4dev/tests/
|
# call with "t" to give verbose testdox output
|
||||||
|
# SUPPORTED: https://www.php.net/supported-versions.php
|
||||||
|
# call with 7.3, 7.4, 8.0, 8.1 to force a certain php version
|
||||||
|
|
||||||
|
opt_testdox="";
|
||||||
|
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
||||||
|
opt_testdox="--testdox";
|
||||||
|
fi;
|
||||||
|
php_bin="";
|
||||||
|
if [ ! -z "${1}" ]; then
|
||||||
|
case "${1}" in
|
||||||
|
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||||
|
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
|
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
|
esac;
|
||||||
|
fi;
|
||||||
|
if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
|
||||||
|
case "${2}" in
|
||||||
|
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||||
|
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
|
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
|
esac;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
phpunit_call="${php_bin}${base}www/vendor/bin/phpunit ${opt_testdox} -c ${base}phpunit.xml ${base}4dev/tests/";
|
||||||
|
|
||||||
|
${phpunit_call};
|
||||||
|
|
||||||
|
if [ ! -z "${php_bin}" ]; then
|
||||||
|
echo "CALLED WITH PHP: ${php_bin}"$(${php_bin} --version);
|
||||||
|
else
|
||||||
|
echo "Default PHP used: "$(php --version);
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
# this list only holds edit_* related table data
|
||||||
# functions
|
# functions
|
||||||
function/set_uid.sql
|
|
||||||
function/set_generic.sql
|
|
||||||
function/random_string.sql
|
function/random_string.sql
|
||||||
function/set_edit_generic.sql
|
function/set_edit_generic.sql
|
||||||
function/edit_set_access_uid.sql
|
function/edit_access_set_uid.sql
|
||||||
|
function/edit_group_set_uid.sql
|
||||||
function/edit_log_partition_insert.sql
|
function/edit_log_partition_insert.sql
|
||||||
|
function/edit_user_set_login_user_id_set_date.sql
|
||||||
# generic tables
|
# generic tables
|
||||||
table/edit_temp_files.sql
|
table/edit_temp_files.sql
|
||||||
table/edit_generic.sql
|
table/edit_generic.sql
|
||||||
|
|||||||
@@ -6,20 +6,25 @@
|
|||||||
#exit;
|
#exit;
|
||||||
|
|
||||||
# if flagged 'y' then it will ask after each import to continue
|
# if flagged 'y' then it will ask after each import to continue
|
||||||
development='y';
|
development='n';
|
||||||
|
# do not import anything, just order flow output
|
||||||
test='n';
|
test='n';
|
||||||
input='';
|
# write to file do not write to DB directly
|
||||||
|
write='y';
|
||||||
# database connection info
|
# database connection info
|
||||||
db='<db name>';
|
db='<db name>';
|
||||||
host='<db host>';
|
host='<db host>';
|
||||||
user='<db user>';
|
user='<db user>';
|
||||||
schema="public";
|
schemas='public';
|
||||||
export PGPASSWORD='';
|
export PGPASSWORD='';
|
||||||
|
|
||||||
# log files
|
# log files
|
||||||
error_file="log/error";
|
error_file='log/error';
|
||||||
output_file="log/output";
|
output_file='log/output';
|
||||||
|
data_file='database_create_data.sql';
|
||||||
|
|
||||||
|
if [ "$write" = 'y' ]; then
|
||||||
|
rm -f "${data_file}";
|
||||||
|
fi;
|
||||||
if [ ! -f ORDER ]; then
|
if [ ! -f ORDER ]; then
|
||||||
echo "Could not find ORDER file";
|
echo "Could not find ORDER file";
|
||||||
exit;
|
exit;
|
||||||
@@ -40,26 +45,37 @@ while read file <&3; do
|
|||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
for path in "$schemas"; do
|
for path in "$schemas"; do
|
||||||
echo "[+] WORK ON '${file}' @ '${path}'";
|
echo "[+] WORK ON '${file}' @ '${path}'";
|
||||||
|
# skip all on test
|
||||||
if [ "$test" = 'n' ]; then
|
if [ "$test" = 'n' ]; then
|
||||||
echo "=== START [$file] ===>" >> ${error_file};
|
# write to file
|
||||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
if [ "$write" = 'y' ]; then
|
||||||
echo "=== END [$file] ===>" >> ${error_file};
|
echo "-- START: ${file}" >> ${data_file};
|
||||||
fi;
|
cat "${file}" >> ${data_file};
|
||||||
if [ "$development" = "y" ]; then
|
echo "-- END: ${file}" >> ${data_file};
|
||||||
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
else
|
||||||
fi;
|
# write to DB
|
||||||
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
echo "=== START [$file] ===>" >> ${error_file};
|
||||||
read -ep "Continue (y|r|^c): " input;
|
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||||
if [ "$input" = "r" ]; then
|
echo "=== END [$file] ===>" >> ${error_file};
|
||||||
echo "Reload File '${file}' ...";
|
# next wait for dev
|
||||||
if [ "$test" = 'n' ]; then
|
if [ "$development" = "y" ]; then
|
||||||
echo "=== START RELOAD [$file] ===>" >> ${error_file};
|
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
||||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
|
||||||
echo "=== END RELOAD [$file] ===>" >> ${error_file};
|
|
||||||
fi;
|
fi;
|
||||||
|
# loop run for reload on failed
|
||||||
|
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
||||||
|
read -ep "Continue (y|r|^c): " input;
|
||||||
|
if [ "$input" = "r" ]; then
|
||||||
|
echo "Reload File '${file}' ...";
|
||||||
|
if [ "$test" = 'n' ]; then
|
||||||
|
echo "=== START RELOAD [$file] ===>" >> ${error_file};
|
||||||
|
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||||
|
echo "=== END RELOAD [$file] ===>" >> ${error_file};
|
||||||
|
fi;
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
input='';
|
||||||
fi;
|
fi;
|
||||||
done;
|
fi;
|
||||||
input='';
|
|
||||||
done;
|
done;
|
||||||
elif [[ ${file::1} != "#" ]]; then
|
elif [[ ${file::1} != "#" ]]; then
|
||||||
echo "[!] COULD NOT FIND FILE: '${file}'";
|
echo "[!] COULD NOT FIND FILE: '${file}'";
|
||||||
|
|||||||
@@ -68,9 +68,11 @@ INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Visitor', 'B0C4B3
|
|||||||
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('User', '1E789E', 1);
|
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('User', '1E789E', 1);
|
||||||
|
|
||||||
-- edit language
|
-- edit language
|
||||||
|
-- short_name = locale without encoding
|
||||||
|
-- iso_name = encoding
|
||||||
DELETE FROM edit_language;
|
DELETE FROM edit_language;
|
||||||
INSERT INTO edit_language (short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('en', 'English', 'UTF-8', 1, 1, 1);
|
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('English', 'en_US', 'UTF-8', 1, 1, 1);
|
||||||
INSERT INTO edit_language (short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('ja', 'Japanese', 'UTF-8', 2, 1, 0);
|
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('Japanese', 'ja_JP', 'UTF-8', 2, 1, 0);
|
||||||
|
|
||||||
-- edit group
|
-- edit group
|
||||||
DELETE FROM edit_group;
|
DELETE FROM edit_group;
|
||||||
@@ -129,7 +131,7 @@ INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_
|
|||||||
-- inserts admin user so basic users can be created
|
-- inserts admin user so basic users can be created
|
||||||
DELETE FROM edit_user;
|
DELETE FROM edit_user;
|
||||||
INSERT INTO edit_user (username, password, enabled, debug, db_debug, email, protected, admin, edit_language_id, edit_group_id, edit_scheme_id, edit_access_right_id) VALUES ('admin', 'admin', 1, 1, 1, '', 1, 1,
|
INSERT INTO edit_user (username, password, enabled, debug, db_debug, email, protected, admin, edit_language_id, edit_group_id, edit_scheme_id, edit_access_right_id) VALUES ('admin', 'admin', 1, 1, 1, '', 1, 1,
|
||||||
(SELECT edit_language_id FROM edit_language WHERE short_name = 'en'),
|
(SELECT edit_language_id FROM edit_language WHERE short_name = 'en_US'),
|
||||||
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
|
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
|
||||||
(SELECT edit_scheme_id FROM edit_scheme WHERE name = 'Admin'),
|
(SELECT edit_scheme_id FROM edit_scheme WHERE name = 'Admin'),
|
||||||
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
|
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
|
||||||
|
|||||||
1031
4dev/database/database_create_data.sql
Normal file
1031
4dev/database/database_create_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
28
4dev/database/function/edit_access_set_uid.sql
Normal file
28
4dev/database/function/edit_access_set_uid.sql
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
-- add uid add for edit_access table
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
myrec RECORD;
|
||||||
|
v_uid VARCHAR;
|
||||||
|
BEGIN
|
||||||
|
-- skip if NEW.name is not set
|
||||||
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
|
-- use NEW.name as base, remove all spaces
|
||||||
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
-- always set
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
-- check if not set, then set
|
||||||
|
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
||||||
|
IF FOUND THEN
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
28
4dev/database/function/edit_group_set_uid.sql
Executable file
28
4dev/database/function/edit_group_set_uid.sql
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
-- add uid add for edit_group table
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
myrec RECORD;
|
||||||
|
v_uid VARCHAR;
|
||||||
|
BEGIN
|
||||||
|
-- skip if NEW.name is not set
|
||||||
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
|
-- use NEW.name as base, remove all spaces
|
||||||
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
-- always set
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
-- check if not set, then set
|
||||||
|
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
||||||
|
IF FOUND THEN
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
-- add uid add for edit_access table
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
myrec RECORD;
|
|
||||||
v_uid VARCHAR;
|
|
||||||
BEGIN
|
|
||||||
-- skip if NEW.name is not set
|
|
||||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
|
||||||
-- use NEW.name as base, remove all spaces
|
|
||||||
-- name data is already unique, so we do not need to worry about this here
|
|
||||||
v_uid := REPLACE(NEW.name, ' ', '');
|
|
||||||
IF TG_OP = 'INSERT' THEN
|
|
||||||
-- always set
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
|
||||||
-- check if not set, then set
|
|
||||||
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
|
||||||
IF FOUND THEN
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$
|
|
||||||
LANGUAGE 'plpgsql';
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
-- add uid add for edit_group table
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
myrec RECORD;
|
|
||||||
v_uid VARCHAR;
|
|
||||||
BEGIN
|
|
||||||
-- skip if NEW.name is not set
|
|
||||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
|
||||||
-- use NEW.name as base, remove all spaces
|
|
||||||
-- name data is already unique, so we do not need to worry about this here
|
|
||||||
v_uid := REPLACE(NEW.name, ' ', '');
|
|
||||||
IF TG_OP = 'INSERT' THEN
|
|
||||||
-- always set
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
|
||||||
-- check if not set, then set
|
|
||||||
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
|
||||||
IF FOUND THEN
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$
|
|
||||||
LANGUAGE 'plpgsql';
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
-- set edit user login_user_id_set_date if login_user_id is set
|
||||||
|
-- NOW() if not empty
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
||||||
|
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
-- create random string with length X
|
-- create random string with length X
|
||||||
|
|
||||||
CREATE FUNCTION random_string(randomLength int)
|
CREATE FUNCTION random_string(randomLength int)
|
||||||
RETURNS text AS $$
|
RETURNS text AS
|
||||||
|
$$
|
||||||
SELECT array_to_string(
|
SELECT array_to_string(
|
||||||
ARRAY(
|
ARRAY(
|
||||||
SELECT substring(
|
SELECT substring(
|
||||||
@@ -13,6 +14,7 @@ SELECT array_to_string(
|
|||||||
),
|
),
|
||||||
''
|
''
|
||||||
)
|
)
|
||||||
$$ LANGUAGE SQL
|
$$
|
||||||
|
LANGUAGE SQL
|
||||||
RETURNS NULL ON NULL INPUT
|
RETURNS NULL ON NULL INPUT
|
||||||
VOLATILE; -- LEAKPROOF;
|
VOLATILE; -- LEAKPROOF;
|
||||||
|
|||||||
15
4dev/database/function/set_date.sql
Normal file
15
4dev/database/function/set_date.sql
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
NEW.date_created := 'now';
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
NEW.date_updated := 'now';
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,15 +1,18 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
random_length INT = 12; -- that should be long enough
|
$$
|
||||||
BEGIN
|
DECLARE
|
||||||
IF TG_OP = ''INSERT'' THEN
|
random_length INT = 12; -- that should be long enough
|
||||||
NEW.date_created := ''now'';
|
BEGIN
|
||||||
NEW.cuid := random_string(random_length);
|
IF TG_OP = 'INSERT' THEN
|
||||||
ELSIF TG_OP = ''UPDATE'' THEN
|
NEW.date_created := 'now';
|
||||||
NEW.date_updated := ''now'';
|
NEW.cuid := random_string(random_length);
|
||||||
END IF;
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
RETURN NEW;
|
NEW.date_updated := 'now';
|
||||||
END;
|
END IF;
|
||||||
' LANGUAGE 'plpgsql';
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
-- adds the created or updated date tags
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
|
||||||
BEGIN
|
|
||||||
IF TG_OP = ''INSERT'' THEN
|
|
||||||
NEW.date_created := ''now'';
|
|
||||||
ELSIF TG_OP = ''UPDATE'' THEN
|
|
||||||
NEW.date_updated := ''now'';
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
' LANGUAGE 'plpgsql';
|
|
||||||
21
4dev/database/function/set_generic_uid.sql
Normal file
21
4dev/database/function/set_generic_uid.sql
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
-- set generic with date and uid combined
|
||||||
|
-- don't use with set_generic/set_uid together
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_generic()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
random_length INT = 32; -- long for massive data
|
||||||
|
BEGIN
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
NEW.date_created := 'now';
|
||||||
|
IF NEW.uid IS NULL THEN
|
||||||
|
NEW.uid := random_string(random_length);
|
||||||
|
END IF;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
NEW.date_updated := 'now';
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_uid()
|
||||||
DECLARE
|
RETURNS TRIGGER AS
|
||||||
random_length INT = 32; -- that should be long enough
|
$$
|
||||||
BEGIN
|
DECLARE
|
||||||
IF TG_OP = ''INSERT'' THEN
|
random_length INT = 32; -- that should be long enough
|
||||||
NEW.uid := random_string(random_length);
|
BEGIN
|
||||||
END IF;
|
IF TG_OP = 'INSERT' THEN
|
||||||
RETURN NEW;
|
NEW.uid := random_string(random_length);
|
||||||
END;
|
END IF;
|
||||||
' LANGUAGE 'plpgsql';
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -2,15 +2,18 @@
|
|||||||
|
|
||||||
-- OLD, DEPRECATED, use set_generic.sql
|
-- OLD, DEPRECATED, use set_generic.sql
|
||||||
|
|
||||||
-- CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
-- CREATE OR REPLACE FUNCTION set_generic()
|
||||||
-- BEGIN
|
-- RETURNS TRIGGER AS
|
||||||
-- IF TG_OP = ''INSERT'' THEN
|
-- $$
|
||||||
-- NEW.date_created := clock_timestamp();
|
-- BEGIN
|
||||||
-- NEW.user_created := current_user;
|
-- IF TG_OP = 'INSERT' THEN
|
||||||
-- ELSIF TG_OP = ''UPDATE'' THEN
|
-- NEW.date_created := clock_timestamp();
|
||||||
-- NEW.date_updated := clock_timestamp();
|
-- NEW.user_created := current_user;
|
||||||
-- NEW.user_updated := current_user;
|
-- ELSIF TG_OP = 'UPDATE' THEN
|
||||||
-- END IF;
|
-- NEW.date_updated := clock_timestamp();
|
||||||
-- RETURN NEW;
|
-- NEW.user_updated := current_user;
|
||||||
-- END;
|
-- END IF;
|
||||||
-- ' LANGUAGE 'plpgsql';
|
-- RETURN NEW;
|
||||||
|
-- END;
|
||||||
|
-- $$
|
||||||
|
-- LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -14,3 +14,7 @@ CREATE TABLE edit_access_data (
|
|||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
value VARCHAR
|
value VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
-- create a unique index for each attached data block for each edit access can
|
||||||
|
-- only have ONE value;
|
||||||
|
CREATE UNIQUE INDEX edit_access_data_edit_access_id_name_ukey ON edit_access_data (edit_access_id, name);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ CREATE TABLE edit_language (
|
|||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||||
long_name VARCHAR,
|
long_name VARCHAR,
|
||||||
short_name VARCHAR,
|
short_name VARCHAR, -- en_US, en or en_US@latin without encoding
|
||||||
iso_name VARCHAR,
|
iso_name VARCHAR, -- should actually be encoding
|
||||||
order_number INT
|
order_number INT
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -18,31 +18,82 @@ CREATE TABLE edit_user (
|
|||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
-- username/password
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
|
-- name block
|
||||||
first_name VARCHAR,
|
first_name VARCHAR,
|
||||||
last_name VARCHAR,
|
last_name VARCHAR,
|
||||||
first_name_furigana VARCHAR,
|
first_name_furigana VARCHAR,
|
||||||
last_name_furigana VARCHAR,
|
last_name_furigana VARCHAR,
|
||||||
|
-- email
|
||||||
|
email VARCHAR,
|
||||||
|
-- eanbled/deleted flag
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- general flags
|
||||||
|
strict SMALLINT DEFAULT 0,
|
||||||
|
locked SMALLINT DEFAULT 0,
|
||||||
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- legacy, debug flags
|
||||||
debug SMALLINT NOT NULL DEFAULT 0,
|
debug SMALLINT NOT NULL DEFAULT 0,
|
||||||
db_debug SMALLINT NOT NULL DEFAULT 0,
|
db_debug SMALLINT NOT NULL DEFAULT 0,
|
||||||
email VARCHAR,
|
-- is admin user
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- last login log
|
||||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- login error
|
||||||
login_error_count INT DEFAULT 0,
|
login_error_count INT DEFAULT 0,
|
||||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||||
strict SMALLINT DEFAULT 0,
|
-- time locked
|
||||||
locked SMALLINT DEFAULT 0,
|
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- password change
|
||||||
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
||||||
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
||||||
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
||||||
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
||||||
|
-- _GET login id for direct login
|
||||||
|
login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars
|
||||||
|
login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set
|
||||||
|
login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password
|
||||||
|
login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid
|
||||||
|
login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid
|
||||||
|
login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever
|
||||||
|
login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||||
|
-- additional ACL json block
|
||||||
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
-- create unique index
|
||||||
|
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN edit_user.username IS 'Login username, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.password IS 'Login password, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.enabled IS 'Login is enabled (master switch)';
|
||||||
|
COMMENT ON COLUMN edit_user.deleted IS 'Login is deleted (master switch), overrides all other';
|
||||||
|
COMMENT ON COLUMN edit_user.strict IS 'If too many failed logins user will be locked, default off';
|
||||||
|
COMMENT ON COLUMN edit_user.locked IS 'Locked from too many wrong password logins';
|
||||||
|
COMMENT ON COLUMN edit_user.protected IS 'User can only be chnaged by admin user';
|
||||||
|
COMMENT ON COLUMN edit_user.debug IS 'Turn debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.db_debug IS 'Turn DB debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.admin IS 'If set, this user is SUPER admin';
|
||||||
|
COMMENT ON COLUMN edit_user.last_login IS 'Last succesfull login tiemstamp';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_count IS 'Number of failed logins, reset on successful login';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_last IS 'Last login error date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_first IS 'First login error date, reset on successfull login';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_until IS 'Account is locked until this date, <';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_after IS 'Account is locked after this date, >';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_date IS 'Password was changed on';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_interval IS 'After how many days the password has to be changed';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';
|
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid, one time, invalid after reset successful or time out';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id IS 'Min 32 character UID to be used to login without password. Via GET/POST parameter';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_set_date IS 'loginUserId was set at what date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_last_revalidate IS 'set when username/password login is done and loginUserId is set';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_from IS 'loginUserId is valid from this date, >=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_until IS 'loginUserId is valid until this date, <=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_revalidate_after IS 'If set to a number greater 0 then user must login after given amount of days to revalidate the loginUserId, set to 0 for valid forver';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_locked IS 'A separte lock flag for loginUserId, user can still login normal';
|
||||||
|
COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List stored in JSON format';
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
-- DATE: 2005/07/05
|
-- DATE: 2005/07/05
|
||||||
-- DESCRIPTION:
|
-- DESCRIPTION:
|
||||||
-- cms tables; generic basic table
|
-- generic basic table with date and uid column
|
||||||
-- TABLE: generic
|
-- TABLE: generic
|
||||||
-- HISTORY:
|
-- HISTORY:
|
||||||
|
|
||||||
-- DROP TABLE edit_generic;
|
-- DROP TABLE generic;
|
||||||
CREATE TABLE generic (
|
CREATE TABLE generic (
|
||||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
uid VARCHAR
|
||||||
);
|
);
|
||||||
|
|||||||
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
--
|
||||||
|
SELECT
|
||||||
|
eu.cuid, eu.username,
|
||||||
|
eu.lock_until, eu.lock_after,
|
||||||
|
CASE WHEN (
|
||||||
|
(eu.lock_until IS NULL
|
||||||
|
OR (eu.lock_until IS NOT NULL AND NOW() >= eu.lock_until))
|
||||||
|
AND (eu.lock_after IS NULL
|
||||||
|
OR (eu.lock_after IS NOT NULL AND NOW() <= eu.lock_after))
|
||||||
|
) THEN 0::INT ELSE 1::INT END locked_period
|
||||||
|
FROM edit_user eu
|
||||||
|
WHERE eu.username = 'empty';
|
||||||
|
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_until = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_after = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_until = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_after = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
UPDATE edit_user SET lock_until = NULL, lock_after = NULL WHERE username = 'empty';
|
||||||
|
|
||||||
|
--
|
||||||
|
SELECT
|
||||||
|
eu.cuid, eu.username,
|
||||||
|
eu.login_user_id, login_user_id_set_date, eu.login_user_id_last_revalidate,
|
||||||
|
(eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE AS reval_date, NOW()::DATE,
|
||||||
|
eu.login_user_id_valid_from, eu.login_user_id_valid_until,
|
||||||
|
eu.login_user_id_revalidate_after,
|
||||||
|
CASE WHEN (
|
||||||
|
(eu.login_user_id_valid_from IS NULL
|
||||||
|
OR (eu.login_user_id_valid_from IS NOT NULL AND NOW() >= eu.login_user_id_valid_from))
|
||||||
|
AND (eu.login_user_id_valid_until IS NULL
|
||||||
|
OR (eu.login_user_id_valid_until IS NOT NULL AND NOW() <= eu.login_user_id_valid_until))
|
||||||
|
) THEN 1::INT ELSE 0::INT END AS login_user_id_valid_date,
|
||||||
|
CASE WHEN eu.login_user_id_revalidate_after IS NOT NULL
|
||||||
|
AND eu.login_user_id_revalidate_after > '0 days'::INTERVAL
|
||||||
|
AND (eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE <= NOW()::DATE
|
||||||
|
THEN 1::INT ELSE 0::INT END AS login_user_id_revalidate
|
||||||
|
FROM edit_user eu
|
||||||
|
WHERE eu.username = 'empty';
|
||||||
|
|
||||||
|
-- init
|
||||||
|
UPDATE edit_user SET login_user_id = random_string(5) WHERE username = 'empty';
|
||||||
|
|
||||||
|
-- outside valid
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_from = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_until = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
-- inside valid
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_from = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_until = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
-- revalidate must
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_last_revalidate = NOW() - '1 day'::interval,
|
||||||
|
login_user_id_revalidate_after = '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
-- revalidate not yet
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_last_revalidate = NOW(),
|
||||||
|
login_user_id_revalidate_after = '6 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE edit_user SET login_user_id_set_date = NULL, login_user_id_last_revalidate = NULL, login_user_id_valid_from = NULL, login_user_id_valid_until = NULL, login_user_id_revalidate_after = NULL WHERE username = 'empty';
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
|
-- DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
|
||||||
CREATE TRIGGER trg_edit_access
|
CREATE TRIGGER trg_edit_access
|
||||||
BEFORE INSERT OR UPDATE ON edit_access
|
BEFORE INSERT OR UPDATE ON edit_access
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_set_edit_access_uid ON edit_access;
|
-- DROP TRIGGER IF EXISTS trg_set_edit_access_uid ON edit_access;
|
||||||
CREATE TRIGGER trg_set_edit_access_uid
|
CREATE TRIGGER trg_set_edit_access_uid
|
||||||
BEFORE INSERT OR UPDATE ON edit_access
|
BEFORE INSERT OR UPDATE ON edit_access
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
|
-- DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
|
||||||
CREATE TRIGGER trg_edit_access_data
|
CREATE TRIGGER trg_edit_access_data
|
||||||
BEFORE INSERT OR UPDATE ON edit_access_data
|
BEFORE INSERT OR UPDATE ON edit_access_data
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
|
-- DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
|
||||||
CREATE TRIGGER trg_edit_access_right
|
CREATE TRIGGER trg_edit_access_right
|
||||||
BEFORE INSERT OR UPDATE ON edit_access_right
|
BEFORE INSERT OR UPDATE ON edit_access_right
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
|
-- DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
|
||||||
CREATE TRIGGER trg_edit_access_user
|
CREATE TRIGGER trg_edit_access_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_access_user
|
BEFORE INSERT OR UPDATE ON edit_access_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
||||||
CREATE TRIGGER trg_edit_group
|
CREATE TRIGGER trg_edit_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_group
|
BEFORE INSERT OR UPDATE ON edit_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
|
-- DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
|
||||||
CREATE TRIGGER trg_set_edit_group_uid
|
CREATE TRIGGER trg_set_edit_group_uid
|
||||||
BEFORE INSERT OR UPDATE ON edit_group
|
BEFORE INSERT OR UPDATE ON edit_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
|
-- DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
|
||||||
CREATE TRIGGER trg_edit_language
|
CREATE TRIGGER trg_edit_language
|
||||||
BEFORE INSERT OR UPDATE ON edit_language
|
BEFORE INSERT OR UPDATE ON edit_language
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
|
-- DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
|
||||||
CREATE TRIGGER trg_edit_log
|
CREATE TRIGGER trg_edit_log
|
||||||
BEFORE INSERT OR UPDATE ON edit_log
|
BEFORE INSERT OR UPDATE ON edit_log
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_edit_log_insert_partition ON edit_log;
|
-- DROP TRIGGER IF EXISTS trg_edit_log_insert_partition ON edit_log;
|
||||||
CREATE TRIGGER trg_edit_log_insert_partition
|
CREATE TRIGGER trg_edit_log_insert_partition
|
||||||
BEFORE INSERT OR UPDATE ON edit_log
|
BEFORE INSERT OR UPDATE ON edit_log
|
||||||
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();
|
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_log_overflow ON edit_log_overflow;
|
-- DROP TRIGGER IF EXISTS trg_edit_log_overflow ON edit_log_overflow;
|
||||||
CREATE TRIGGER trg_edit_log_overflow
|
CREATE TRIGGER trg_edit_log_overflow
|
||||||
BEFORE INSERT OR UPDATE ON edit_log_overflow
|
BEFORE INSERT OR UPDATE ON edit_log_overflow
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
|
||||||
CREATE TRIGGER trg_edit_menu_group
|
CREATE TRIGGER trg_edit_menu_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_menu_group
|
BEFORE INSERT OR UPDATE ON edit_menu_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
|
-- DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
|
||||||
CREATE TRIGGER trg_edit_page
|
CREATE TRIGGER trg_edit_page
|
||||||
BEFORE INSERT OR UPDATE ON edit_page
|
BEFORE INSERT OR UPDATE ON edit_page
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
|
-- DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
|
||||||
CREATE TRIGGER trg_edit_page_access
|
CREATE TRIGGER trg_edit_page_access
|
||||||
BEFORE INSERT OR UPDATE ON edit_page_access
|
BEFORE INSERT OR UPDATE ON edit_page_access
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_page_content ON edit_page_content;
|
-- DROP TRIGGER IF EXISTS trg_edit_page_content ON edit_page_content;
|
||||||
CREATE TRIGGER trg_edit_page_content
|
CREATE TRIGGER trg_edit_page_content
|
||||||
BEFORE INSERT OR UPDATE ON edit_page_content
|
BEFORE INSERT OR UPDATE ON edit_page_content
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
|
-- DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
|
||||||
CREATE TRIGGER trg_edit_query_string
|
CREATE TRIGGER trg_edit_query_string
|
||||||
BEFORE INSERT OR UPDATE ON edit_query_string
|
BEFORE INSERT OR UPDATE ON edit_query_string
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
|
-- DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
|
||||||
CREATE TRIGGER trg_edit_scheme
|
CREATE TRIGGER trg_edit_scheme
|
||||||
BEFORE INSERT OR UPDATE ON edit_scheme
|
BEFORE INSERT OR UPDATE ON edit_scheme
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
|
-- DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
|
||||||
CREATE TRIGGER trg_edit_user
|
CREATE TRIGGER trg_edit_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_user
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
|
-- DROP TRIGGER IF EXISTS trg_edit_user_set_login_user_id_set_date ON edit_user;
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
||||||
CREATE TRIGGER trg_edit_visible_group
|
CREATE TRIGGER trg_edit_visible_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_visible_group
|
BEFORE INSERT OR UPDATE ON edit_visible_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
-- update missing edit_* table data
|
-- 2019/12/11 update missing edit_* table data
|
||||||
|
|
||||||
ALTER TABLE edit_generic ADD cuid VARCHAR;
|
ALTER TABLE edit_generic ADD cuid VARCHAR;
|
||||||
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
-- 2022/6/17 update edit_user with login uid
|
||||||
|
|
||||||
|
-- !!! COPY TABLE ARRAY FOLDER !!!
|
||||||
|
|
||||||
|
-- the login uid, at least 32 chars
|
||||||
|
ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE;
|
||||||
|
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
-- ALTER TABLE edit_user ADD CONSTRAINT edit_user_login_user_id_key UNIQUE (login_user_id);
|
||||||
|
-- when above uid was set
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- if set, from/until when the above uid is valid
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- user must login to revalidated login id after set days, 0 for forever
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_revalidate_after INTERVAL;
|
||||||
|
-- lock for login user id, but still allow normal login
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_locked SMALLINT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
-- disable login before date
|
||||||
|
ALTER TABLE edit_user ADD lock_until TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- disable login after date
|
||||||
|
ALTER TABLE edit_user ADD lock_after TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
||||||
|
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
|
|
||||||
|
-- __END__
|
||||||
@@ -25,7 +25,7 @@ declare(strict_types=1);
|
|||||||
* 1 for file loadable, but no data inside
|
* 1 for file loadable, but no data inside
|
||||||
* 2 for file not readable
|
* 2 for file not readable
|
||||||
* 3 for file not found
|
* 3 for file not found
|
||||||
* @deprecated V6 Use \CoreLibs\Get\ReadEnvFile::readEnvFile()
|
* @deprecated V6 Use \CoreLibs\Get\DotEnv::readEnvFile()
|
||||||
*/
|
*/
|
||||||
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
||||||
{
|
{
|
||||||
55
4dev/locale/Readme.md
Normal file
55
4dev/locale/Readme.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# Translation files
|
||||||
|
|
||||||
|
## Source file name convetion
|
||||||
|
|
||||||
|
Locale Name . Domain . Encoding .po
|
||||||
|
|
||||||
|
## Name parte explenations
|
||||||
|
|
||||||
|
### Locale Name Examples
|
||||||
|
|
||||||
|
If underscore in name the long version is checked first, then the short version:
|
||||||
|
en_US@latin -> en_US -> en
|
||||||
|
|
||||||
|
* en
|
||||||
|
* en_US
|
||||||
|
* en_US.UTF-8
|
||||||
|
* en_US@latin
|
||||||
|
|
||||||
|
### Domain
|
||||||
|
|
||||||
|
For current case auto set CONTENT_PATH is used
|
||||||
|
|
||||||
|
* admin
|
||||||
|
* frontend
|
||||||
|
|
||||||
|
### Encoding
|
||||||
|
|
||||||
|
if not set UTF-8 is assumed. Any other utf8 encoding is changed to UTF-8
|
||||||
|
|
||||||
|
* UTF-8
|
||||||
|
* SJIS
|
||||||
|
* EUC
|
||||||
|
|
||||||
|
## File name example source
|
||||||
|
|
||||||
|
`ja-admin.po`
|
||||||
|
|
||||||
|
First part is LOCALE, second part is domain. Separator is `-`
|
||||||
|
|
||||||
|
## Folder layout
|
||||||
|
|
||||||
|
`includes/locale/ja/LC_MESSAGES/frontend.mo`
|
||||||
|
|
||||||
|
ALTERNATE LOCALE NAMES:
|
||||||
|
* ja
|
||||||
|
* ja_JP
|
||||||
|
* ja.UTF-8
|
||||||
|
* ja_JP.UTF-8
|
||||||
|
|
||||||
|
ja_JP.UTF-8: Locale Name
|
||||||
|
frontend: dmain (CONTENT_PATH)
|
||||||
|
|
||||||
|
## command
|
||||||
|
|
||||||
|
`msgfmt -o www/includes/locale/ja/LC_MESSAGES/frontend.mo 4dev/lang/ja.admin.po`
|
||||||
@@ -2,22 +2,22 @@
|
|||||||
# AUTHOR: Clemens Schwaighofer
|
# AUTHOR: Clemens Schwaighofer
|
||||||
# CREATED: 2005/08/09
|
# CREATED: 2005/08/09
|
||||||
# SHORT DESCRIPTION:
|
# SHORT DESCRIPTION:
|
||||||
# Backned English Messages file for gettext
|
# Backend English Messages file for gettext
|
||||||
# to craete: msgfmt -o ja.mo messages_en.po
|
|
||||||
# HISTORY:
|
|
||||||
# ********************************************************************/
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Project Version\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\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: \n"
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\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"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
|
||||||
msgid "Year"
|
msgid "Year"
|
||||||
msgstr "Year"
|
msgstr "Year"
|
||||||
@@ -26,7 +26,25 @@ msgid "Month"
|
|||||||
msgstr "Month"
|
msgstr "Month"
|
||||||
|
|
||||||
msgid "INPUT TEST"
|
msgid "INPUT TEST"
|
||||||
msgstr "OUTPUT TEST EN"
|
msgstr "OUTPUT TEST ADMIN EN"
|
||||||
|
|
||||||
|
# testing multi
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin en 0"
|
||||||
|
msgstr[1] "Multi Admin en 1"
|
||||||
|
msgstr[2] "Multi Admin en 2"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "May"
|
||||||
|
msgstr "May Admin en"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin month en 0"
|
||||||
|
msgstr[1] "Multi Admin month en 1"
|
||||||
|
msgstr[2] "Multi Admin month en 2"
|
||||||
|
|
||||||
msgid "I should be translated"
|
msgid "I should be translated"
|
||||||
msgstr "I should be translated: I WAS TRANSLATED"
|
msgstr "I should be translated: I WAS TRANSLATED"
|
||||||
29
4dev/locale/en-frontend.po
Normal file
29
4dev/locale/en-frontend.po
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# ********************************************************************
|
||||||
|
# AUTHOR: Clemens Schwaighofer
|
||||||
|
# CREATED: 2005/08/09
|
||||||
|
# SHORT DESCRIPTION:
|
||||||
|
# Frontend English Messages file for gettext
|
||||||
|
# ********************************************************************/
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
|
||||||
|
msgid "INPUT TEST"
|
||||||
|
msgstr "OUTPUT TEST FRONTEND EN"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi frontend en 0"
|
||||||
|
msgstr[1] "Multi frontend en 1"
|
||||||
|
msgstr[2] "Multi frontend en 2"
|
||||||
@@ -2,22 +2,22 @@
|
|||||||
# AUTHOR: Clemens Schwaighofer
|
# AUTHOR: Clemens Schwaighofer
|
||||||
# CREATED: 2018/03/28
|
# CREATED: 2018/03/28
|
||||||
# SHORT DESCRIPTION:
|
# SHORT DESCRIPTION:
|
||||||
# Backend Japanese Messages file for gettext
|
# Backend Japanese Messages file for gettext>
|
||||||
# to craete: msgfmt -o ja.mo messages_ja.po
|
|
||||||
# HISTORY:
|
|
||||||
# ********************************************************************/
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Project Version\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\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: \n"
|
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\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"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||||
|
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr "はい"
|
msgstr "はい"
|
||||||
@@ -63,7 +63,25 @@ msgid "Sun"
|
|||||||
msgstr "日"
|
msgstr "日"
|
||||||
|
|
||||||
msgid "INPUT TEST"
|
msgid "INPUT TEST"
|
||||||
msgstr "OUTPUT TEST JA"
|
msgstr "OUTPUT TEST ADMIN JA"
|
||||||
|
|
||||||
|
# testing multi
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin ja 0"
|
||||||
|
msgstr[1] "Multi Admin ja 1"
|
||||||
|
msgstr[2] "Multi Admin ja 2"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "May"
|
||||||
|
msgstr "May Admin ja"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin month ja 0"
|
||||||
|
msgstr[1] "Multi Admin month ja 1"
|
||||||
|
msgstr[2] "Multi Admin month ja 2"
|
||||||
|
|
||||||
# login string
|
# login string
|
||||||
msgid "Hello %s"
|
msgid "Hello %s"
|
||||||
29
4dev/locale/ja-frontend.po
Normal file
29
4dev/locale/ja-frontend.po
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# ********************************************************************
|
||||||
|
# AUTHOR: Clemens Schwaighofer
|
||||||
|
# CREATED: 2005/08/09
|
||||||
|
# SHORT DESCRIPTION:
|
||||||
|
# Frontend Japanese Messages file for gettext
|
||||||
|
# ********************************************************************/
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: ja\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
|
|
||||||
|
msgid "INPUT TEST"
|
||||||
|
msgstr "OUTPUT TEST FRONTEND JA"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi frontend ja 0"
|
||||||
|
msgstr[1] "Multi frontend ja 1"
|
||||||
|
msgstr[2] "Multi frontend ja 2"
|
||||||
File diff suppressed because it is too large
Load Diff
52
4dev/tests/CoreLibsACLLogin_database_prepare.sh
Executable file
52
4dev/tests/CoreLibsACLLogin_database_prepare.sh
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# note: there is currently no port selection, standard 5432 port is assumed
|
||||||
|
# note: we use the default in path postgresql commands and connect to whatever default DB is set
|
||||||
|
|
||||||
|
# PARAMETER 1: database data file to load
|
||||||
|
# PARAMETER 2: db user WHO MUST BE ABLE TO CREATE A DATABASE
|
||||||
|
# PARAMETER 3: db name
|
||||||
|
# PARAMETER 4: db host
|
||||||
|
# PARAMETER 5: print out for testing
|
||||||
|
|
||||||
|
load_sql="${1}";
|
||||||
|
# abort with 1 if we cannot find the file
|
||||||
|
if [ ! -f "${load_sql}" ]; then
|
||||||
|
echo 1;
|
||||||
|
exit 1;
|
||||||
|
fi;
|
||||||
|
db_user="${2}";
|
||||||
|
db_name="${3}";
|
||||||
|
db_host="${4}";
|
||||||
|
# empty db name or db user -> exit with 2
|
||||||
|
if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
|
||||||
|
echo 2;
|
||||||
|
exit 2;
|
||||||
|
fi;
|
||||||
|
# drop database, on error exit with 3
|
||||||
|
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo 3;
|
||||||
|
exit 3;
|
||||||
|
fi;
|
||||||
|
# create database, on error exit with 4
|
||||||
|
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo 4;
|
||||||
|
exit 4;
|
||||||
|
fi;
|
||||||
|
# if error 5 thrown, test with enabled below
|
||||||
|
if [ ! -z "${5}" ]; then
|
||||||
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
||||||
|
else
|
||||||
|
# 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;
|
||||||
|
fi;
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo 5;
|
||||||
|
exit 5;
|
||||||
|
fi;
|
||||||
|
echo 0;
|
||||||
|
exit 0;
|
||||||
|
|
||||||
|
# __END__
|
||||||
117
4dev/tests/CoreLibsCheckEncodingTest.php
Normal file
117
4dev/tests/CoreLibsCheckEncodingTest.php
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\Encoding
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\Encoding
|
||||||
|
* @testdox \CoreLibs\Check\Encoding method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckEncodingTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function checkConvertEncodingProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: string to test
|
||||||
|
// 1: source encoding
|
||||||
|
// 2: target encoding
|
||||||
|
// 3: substitue character
|
||||||
|
// 4: false for ok, array with error list
|
||||||
|
'valid test UTF-8 to SJIS (default)' => [
|
||||||
|
'日本語',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (dots as code point)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
0x2234,
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (dots as string)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'∴',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (none)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'none',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (long)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'long',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (entity)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'entity',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkConvertEncoding
|
||||||
|
* @dataProvider checkConvertEncodingProvider
|
||||||
|
* @testdox check encoding convert from $from_encoding to $to_encoding [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $from_encoding
|
||||||
|
* @param string $to_encoding
|
||||||
|
* @param string|int|null $error_char
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckConvertEncoding(
|
||||||
|
string $input,
|
||||||
|
string $from_encoding,
|
||||||
|
string $to_encoding,
|
||||||
|
$error_char,
|
||||||
|
$expected
|
||||||
|
): void {
|
||||||
|
if ($error_char !== null) {
|
||||||
|
\CoreLibs\Check\Encoding::setErrorChar($error_char);
|
||||||
|
if (!in_array($error_char, ['none', 'long', 'entity'])) {
|
||||||
|
$this->assertEquals(
|
||||||
|
\IntlChar::chr($error_char),
|
||||||
|
\CoreLibs\Check\Encoding::getErrorChar()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$error_char,
|
||||||
|
\CoreLibs\Check\Encoding::getErrorChar()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$return = \CoreLibs\Check\Encoding::checkConvertEncoding($input, $from_encoding, $to_encoding);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$return
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -7,6 +7,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace tests;
|
namespace tests;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -274,7 +275,6 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO: create provider for n array merge
|
|
||||||
* provides array listing for the merge test
|
* provides array listing for the merge test
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
@@ -282,6 +282,61 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
public function arrayMergeRecursiveProvider(): array
|
public function arrayMergeRecursiveProvider(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
// 0: expected
|
||||||
|
// 1..n: to merge arrays
|
||||||
|
// n+1: trigger for handle keys as string
|
||||||
|
'two arrays' => [
|
||||||
|
['a' => 1, 'b' => 2, 'c' => 3],
|
||||||
|
['a' => 1, 'b' => 2],
|
||||||
|
['b' => 2, 'c' => 3],
|
||||||
|
],
|
||||||
|
'two arrays, string flag' => [
|
||||||
|
['a' => 1, 'b' => 2, 'c' => 3],
|
||||||
|
['a' => 1, 'b' => 2],
|
||||||
|
['b' => 2, 'c' => 3],
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// non hash arrays
|
||||||
|
'non hash array merge, no string flag' => [
|
||||||
|
[3, 4, 5],
|
||||||
|
[1, 2, 3],
|
||||||
|
[3, 4, 5],
|
||||||
|
],
|
||||||
|
'non hash array merge, string flag' => [
|
||||||
|
[1, 2, 3, 3, 4, 5],
|
||||||
|
[1, 2, 3],
|
||||||
|
[3, 4, 5],
|
||||||
|
true
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for warning checks
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function arrayMergeRecursiveProviderWarning(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// error <2 arguments
|
||||||
|
'too view arguments' => [
|
||||||
|
'arrayMergeRecursive needs two or more array arguments',
|
||||||
|
[1]
|
||||||
|
],
|
||||||
|
// error <2 arrays
|
||||||
|
'only one array' => [
|
||||||
|
'arrayMergeRecursive needs two or more array arguments',
|
||||||
|
[1],
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// error element is not array
|
||||||
|
'non array between array' => [
|
||||||
|
'arrayMergeRecursive encountered a non array argument',
|
||||||
|
[1],
|
||||||
|
'string',
|
||||||
|
[2]
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -626,21 +681,43 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::arrayMergeRecursive
|
* @covers ::arrayMergeRecursive
|
||||||
* @#dataProvider arrayMergeRecursiveProvider
|
* @dataProvider arrayMergeRecursiveProvider
|
||||||
* @testdox arrayMergeRecursive ... will be $expected [$_dataName]
|
* @testdox arrayMergeRecursive ... [$_dataName]
|
||||||
*
|
*
|
||||||
* @param array $input nested array set as each parameter
|
|
||||||
* @param bool $flag
|
|
||||||
* @param bool|array $expected
|
|
||||||
* @return void
|
* @return void
|
||||||
* array $input, bool $flag, $expected
|
*
|
||||||
*/
|
*/
|
||||||
public function testArrayMergeRecursive(): void
|
public function testArrayMergeRecursive(): void
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Implement proper test run');
|
$arrays = func_get_args();
|
||||||
$this->markTestIncomplete(
|
// first is expected array, always
|
||||||
'testArrayMergeRecursive has not been implemented yet.'
|
$expected = array_shift($arrays);
|
||||||
|
$output = \CoreLibs\Combined\ArrayHandler::arrayMergeRecursive(
|
||||||
|
...$arrays
|
||||||
);
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::arrayMergeRecursive
|
||||||
|
* @dataProvider arrayMergeRecursiveProviderWarning
|
||||||
|
* @testdox arrayMergeRecursive with E_USER_WARNING [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArrayMergeRecursiveWarningA(): void
|
||||||
|
{
|
||||||
|
$arrays = func_get_args();
|
||||||
|
// first is expected warning
|
||||||
|
$warning = array_shift($arrays);
|
||||||
|
$this->expectWarning();
|
||||||
|
$this->expectWarningMessage($warning);
|
||||||
|
\CoreLibs\Combined\ArrayHandler::arrayMergeRecursive(...$arrays);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
102
4dev/tests/CoreLibsConvertEncodingTest.php
Normal file
102
4dev/tests/CoreLibsConvertEncodingTest.php
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Encoding
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Encoding
|
||||||
|
* @testdox \CoreLibs\Convert\Encoding method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertEncodingTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function convertEncodingProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: original string
|
||||||
|
// 1: target encoding
|
||||||
|
// 2: optional source encoding
|
||||||
|
// 3: auto check (not used)
|
||||||
|
// 4: expected string
|
||||||
|
// 5: expected string encoding
|
||||||
|
'simple from UTF-8 to SJIS' => [
|
||||||
|
'input string',
|
||||||
|
'SJIS',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'input string',
|
||||||
|
'SJIS'
|
||||||
|
],
|
||||||
|
'kanji from UTF-8 to SJIS' => [
|
||||||
|
'日本語',
|
||||||
|
'SJIS',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'日本語',
|
||||||
|
'SJIS'
|
||||||
|
],
|
||||||
|
'kanji from UTF-8 to SJIS with source' => [
|
||||||
|
'日本語',
|
||||||
|
'SJIS',
|
||||||
|
'UTF-8',
|
||||||
|
null,
|
||||||
|
'日本語',
|
||||||
|
'SJIS'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::convertEncoding
|
||||||
|
* @dataProvider convertEncodingProvider
|
||||||
|
* @testdox convert encoding $target_encoding, source: $source_encoding, auto: $auto_check [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $target_encoding
|
||||||
|
* @param string $source_encoding
|
||||||
|
* @param bool $auto_check
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_encoding
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testConvertEncoding(
|
||||||
|
string $input,
|
||||||
|
string $target_encoding,
|
||||||
|
?string $source_encoding,
|
||||||
|
?bool $auto_check,
|
||||||
|
string $expected,
|
||||||
|
string $expected_encoding
|
||||||
|
): void {
|
||||||
|
if ($source_encoding === null and $auto_check === null) {
|
||||||
|
$string = \CoreLibs\Convert\Encoding::convertEncoding($input, $target_encoding);
|
||||||
|
} elseif ($auto_check === null) {
|
||||||
|
$string = \CoreLibs\Convert\Encoding::convertEncoding($input, $target_encoding, $source_encoding);
|
||||||
|
} else {
|
||||||
|
$string = \CoreLibs\Convert\Encoding::convertEncoding(
|
||||||
|
$input,
|
||||||
|
$target_encoding,
|
||||||
|
$source_encoding,
|
||||||
|
$auto_check
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// because we can't store encoding in here anyway
|
||||||
|
$target = mb_convert_encoding($expected, $expected_encoding, 'UTF-8');
|
||||||
|
// print "IN: $input, $target_encoding\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$target,
|
||||||
|
$string
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -13,7 +13,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsConvertJsonTest extends TestCase
|
final class CoreLibsConvertJsonTest extends TestCase
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test list for json convert tests
|
* test list for json convert tests
|
||||||
*
|
*
|
||||||
|
|||||||
101
4dev/tests/CoreLibsConvertMimeEncodeTest.php
Normal file
101
4dev/tests/CoreLibsConvertMimeEncodeTest.php
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\MimeEncode
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\MimeEncode
|
||||||
|
* @testdox \CoreLibs\Convert\MimeEncode method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertMimeEncodeTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function mbMimeEncodeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: input string
|
||||||
|
// 1: encoding
|
||||||
|
// 2: expected
|
||||||
|
'standard UTF-8' => [
|
||||||
|
'Test string',
|
||||||
|
'UTF-8',
|
||||||
|
'Test string'
|
||||||
|
],
|
||||||
|
'long text UTF-8' => [
|
||||||
|
'The quick brown fox jumps over the lazy sheep that sleeps in the ravine '
|
||||||
|
. 'and has no idea what is going on here',
|
||||||
|
'UTF-8',
|
||||||
|
'The quick brown fox jumps over the lazy sheep that sleeps in the ravine '
|
||||||
|
. 'and has no idea what is going on here'
|
||||||
|
],
|
||||||
|
'standard with special chars UTF-8' => [
|
||||||
|
'This is ümläßtと漢字もカタカナ!!^$%&',
|
||||||
|
'UTF-8',
|
||||||
|
'This is =?UTF-8?B?w7xtbMOkw59044Go5ryi5a2X44KC44Kr44K/44Kr44OK77yBIV4k?='
|
||||||
|
. "\r\n"
|
||||||
|
. ' =?UTF-8?B?JQ==?=&'
|
||||||
|
],
|
||||||
|
'35 chars and space at the end UTF-8' => [
|
||||||
|
'12345678901234567890123456789012345 '
|
||||||
|
. 'is there a space?',
|
||||||
|
'UTF-8',
|
||||||
|
'12345678901234567890123456789012345 '
|
||||||
|
. 'is there a =?UTF-8?B?c3BhY2U/?='
|
||||||
|
],
|
||||||
|
'36 chars and space at the end UTF-8' => [
|
||||||
|
'123456789012345678901234567890123456 '
|
||||||
|
. 'is there a space?',
|
||||||
|
'UTF-8',
|
||||||
|
'123456789012345678901234567890123456 '
|
||||||
|
. 'is there a =?UTF-8?B?c3BhY2U/?='
|
||||||
|
],
|
||||||
|
'36 kanji and space UTF-8' => [
|
||||||
|
'カタカナカタカナかなカタカナカタカナかなカタカナカタカナかなカタカナカタ '
|
||||||
|
. 'is there a space?',
|
||||||
|
'UTF-8',
|
||||||
|
"=?UTF-8?B?44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr44OK44Kr?=\r\n"
|
||||||
|
. " =?UTF-8?B?44K/44Kr44OK?=\r\n"
|
||||||
|
. " =?UTF-8?B?44GL44Gq44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr?=\r\n"
|
||||||
|
. " =?UTF-8?B?44OK44Kr44K/?= is there a =?UTF-8?B?c3BhY2U/?="
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mb mime header encoding test
|
||||||
|
*
|
||||||
|
* @covers ::__mbMimeEncode
|
||||||
|
* @dataProvider mbMimeEncodeProvider
|
||||||
|
* @testdox mb encoding target $encoding [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUuMbMimeEncode(string $input, string $encoding, string $expected): void
|
||||||
|
{
|
||||||
|
// encode string first
|
||||||
|
$encoded = \CoreLibs\Convert\MimeEncode::__mbMimeEncode($input, $encoding);
|
||||||
|
// print "MIME: -" . $encoded . "-\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$encoded
|
||||||
|
);
|
||||||
|
$decoded = mb_decode_mimeheader($encoded);
|
||||||
|
// print "INPUT : " . $input . "\n";
|
||||||
|
// print "DECODED: " . $decoded . "\n";
|
||||||
|
// back compare decoded
|
||||||
|
$this->assertEquals(
|
||||||
|
$input,
|
||||||
|
$decoded
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
692
4dev/tests/CoreLibsCreateEmailTest.php
Normal file
692
4dev/tests/CoreLibsCreateEmailTest.php
Normal file
@@ -0,0 +1,692 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\Email
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\Email
|
||||||
|
* @testdox \CoreLibs\Create\Email method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateEmailTest extends TestCase
|
||||||
|
{
|
||||||
|
private static $log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* start DB conneciton, setup DB, etc
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
self::$log = new \CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||||
|
'file_id' => 'CoreLibs-Create-Email-Test',
|
||||||
|
'debug_all' => true,
|
||||||
|
'echo_all' => false,
|
||||||
|
'print_all' => true,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function encodeEmailNameProvider(): array
|
||||||
|
{
|
||||||
|
// 0: email
|
||||||
|
// 1: name
|
||||||
|
// 2: encoding
|
||||||
|
// 3: kv_folding
|
||||||
|
// 4: expected
|
||||||
|
return [
|
||||||
|
'all empty' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'email only' => [
|
||||||
|
'test@test.com',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'email and name' => [
|
||||||
|
'test@test.com',
|
||||||
|
'Test Name',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"Test Name" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded with half width Katakana, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded with half width Katakana, folding on, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
'UTF-8',
|
||||||
|
true,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded, UTF-8 parameter' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
'UTF-8',
|
||||||
|
null,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
// does internal UTF-8 to ISO-2022-JP convert
|
||||||
|
'encoding in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
null,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'encoding with half width Katakana in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
null,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'encoding with half width Katakana, folding on in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
true,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider encodeEmailNameProvider
|
||||||
|
* @testdox encode email $email, name $name, encoding $encoding will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testEncodeEmailName(
|
||||||
|
string $email,
|
||||||
|
?string $name,
|
||||||
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
if ($name === null && $encoding === null && $kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
|
||||||
|
} elseif ($encoding === null && $kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
|
||||||
|
} elseif ($kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
|
||||||
|
} else {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$encoded_email
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendEmailProvider(): array
|
||||||
|
{
|
||||||
|
// 0: subject
|
||||||
|
// 1: body
|
||||||
|
// 2: from email
|
||||||
|
// 3: from name ('')
|
||||||
|
// 4: array for to email
|
||||||
|
// 5: replace content ([]/null)
|
||||||
|
// 6: encoding (UTF-8/null)
|
||||||
|
// 7: kv_folding
|
||||||
|
// 8: return status
|
||||||
|
// 9: expected content
|
||||||
|
return [
|
||||||
|
'all empty, fail -1' => [
|
||||||
|
'subject' => '',
|
||||||
|
'body' => '',
|
||||||
|
'from_email' => '',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -1,
|
||||||
|
'expected_content' => [],
|
||||||
|
],
|
||||||
|
'missing to entry, fail -2' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -2,
|
||||||
|
'expected_content' => [],
|
||||||
|
],
|
||||||
|
'bad encoding, fail -3' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => ['to@test.com'],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'IDONTEXISTENCODING',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -3,
|
||||||
|
'expected_content' => [],
|
||||||
|
],
|
||||||
|
'sending email 1' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded, with half width katakanata' => [
|
||||||
|
'subject' => 'SUBJECT 日本語カタカナパ',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded, with half width katakanata, folding on' => [
|
||||||
|
'subject' => 'SUBJECT 日本語カタカナパ',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'kv_folding' => true,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded subject ISO-2022-JP' => [
|
||||||
|
'subject' => 'SUBJECT 日本語',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'ISO-2022-JP',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=',
|
||||||
|
// body is stored as UTF-8 in log and here, so both must be translated
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 2' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'e1@test.com',
|
||||||
|
'e2@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'e1@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'e2@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT foo',
|
||||||
|
'body' => 'BODY foo bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic, to override' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 'test@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to',
|
||||||
|
'body' => 'BODY foo to bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic, to override encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 'test@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0bw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo to bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 3: dynamic, to mixed override' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 't1@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 1'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't2@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't3@test.com',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't1@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to 1',
|
||||||
|
'body' => 'BODY foo to 1 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't2@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to 2',
|
||||||
|
'body' => 'BODY foo to 2 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't3@test.com',
|
||||||
|
'subject' => 'SUBJECT foo',
|
||||||
|
'body' => 'BODY foo bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 3: dynamic, to mixed override encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 't1@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 1'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't2@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't3@test.com',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't1@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAx?=',
|
||||||
|
'body' => 'BODY 日本語 foo to 1 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't2@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAy?=',
|
||||||
|
'body' => 'BODY 日本語 foo to 2 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't3@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider sendEmailProvider
|
||||||
|
* @testdox email sending with expected status $expected_status [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $subject
|
||||||
|
* @param string $body
|
||||||
|
* @param string $from_email
|
||||||
|
* @param string $from_name
|
||||||
|
* @param array $to_email
|
||||||
|
* @param array|null $replace
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param bool|null $kv_folding
|
||||||
|
* @param int $expected_status
|
||||||
|
* @param array $expected_content
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSendEmail(
|
||||||
|
string $subject,
|
||||||
|
string $body,
|
||||||
|
string $from_email,
|
||||||
|
string $from_name,
|
||||||
|
array $to_email,
|
||||||
|
?array $replace,
|
||||||
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
|
int $expected_status,
|
||||||
|
array $expected_content
|
||||||
|
): void {
|
||||||
|
if ($replace === null) {
|
||||||
|
$replace = [];
|
||||||
|
}
|
||||||
|
if ($encoding === null) {
|
||||||
|
$encoding = 'UTF-8';
|
||||||
|
}
|
||||||
|
if ($kv_folding === null) {
|
||||||
|
$kv_folding = false;
|
||||||
|
}
|
||||||
|
// force new set for each run
|
||||||
|
self::$log->setLogUniqueId(true);
|
||||||
|
// set on of unique log id
|
||||||
|
self::$log->setLogPer('run', true);
|
||||||
|
// init logger
|
||||||
|
$status = \CoreLibs\Create\Email::sendEmail(
|
||||||
|
$subject,
|
||||||
|
$body,
|
||||||
|
$from_email,
|
||||||
|
$from_name,
|
||||||
|
$to_email,
|
||||||
|
$replace,
|
||||||
|
$encoding,
|
||||||
|
$kv_folding,
|
||||||
|
true,
|
||||||
|
self::$log
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_status,
|
||||||
|
$status,
|
||||||
|
'Assert sending status'
|
||||||
|
);
|
||||||
|
// assert content: must load JSON from log file
|
||||||
|
if ($status == 2) {
|
||||||
|
// open file, get last entry with 'SEND EMAIL JSON' key
|
||||||
|
$file = file_get_contents(self::$log->getLogFileName());
|
||||||
|
if ($file !== false) {
|
||||||
|
// extract SEND EMAIL JSON line
|
||||||
|
$found = preg_match_all("/^.* <SEND EMAIL JSON> - (.*)$/m", $file, $matches);
|
||||||
|
// print "Found: $found | EMAIL: " . print_r($matches, true) . "\n";
|
||||||
|
if (!empty($matches[1])) {
|
||||||
|
foreach ($matches[1] as $pos => $email_json) {
|
||||||
|
$email = \CoreLibs\Convert\Json::jsonConvertToArray($email_json);
|
||||||
|
// print "EMAIL: " . print_r($email, true) . "\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['header']['From'] ?? 'MISSING FROM',
|
||||||
|
$email['header']['From'] ?? '',
|
||||||
|
'Email check: assert header from'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'text/plain; charset=' . $encoding ?? 'UTF-8',
|
||||||
|
$email['header']['Content-type'] ?? '',
|
||||||
|
'Email check: assert header content type'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'1.0',
|
||||||
|
$email['header']['MIME-Version'] ?? '',
|
||||||
|
'Email check: assert header mime version'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['to'] ?? 'MISSING TO',
|
||||||
|
$email['to'] ?? '',
|
||||||
|
'Email check: assert to'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['subject'] ?? 'MISSING SUBJECT',
|
||||||
|
$email['subject'] ?? '',
|
||||||
|
'Email check: assert subject'
|
||||||
|
);
|
||||||
|
// body must be translated back to encoding if encoding is not UTF-8
|
||||||
|
$this->assertEquals(
|
||||||
|
$encoding != 'UTF-8' ?
|
||||||
|
mb_convert_encoding($expected_content[$pos]['body'] ?? '', $encoding, 'UTF-8') :
|
||||||
|
$expected_content[$pos]['body'] ?? 'MISSING BODY',
|
||||||
|
$email['encoding'] != 'UTF-8' ?
|
||||||
|
mb_convert_encoding($email['body'] ?? '', $email['encoding'], 'UTF-8') :
|
||||||
|
$email['body'] ?? '',
|
||||||
|
'Email check: assert body'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -13,7 +13,11 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsCreateHashTest extends TestCase
|
final class CoreLibsCreateHashTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function hashData(): array
|
public function hashData(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace tests;
|
namespace tests;
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test class for Create\Session
|
* Test class for Create\Session
|
||||||
@@ -20,84 +21,451 @@ final class CoreLibsCreateSessionTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function sessionProvider(): array
|
public function sessionProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: session name as parameter or for GLOBAL value
|
||||||
|
// 1: type p: parameter, g: global, d: php.ini default
|
||||||
|
// 2: mock data as array
|
||||||
|
// checkCliStatus: true/false,
|
||||||
|
// getSessionStatus: PHP_SESSION_DISABLED for abort,
|
||||||
|
// PHP_SESSION_NONE/ACTIVE for ok
|
||||||
|
// setSessionName: true/false,
|
||||||
|
// checkActiveSession: true/false, [1st call, 2nd call]
|
||||||
|
// getSessionId: string or false
|
||||||
|
// 3: exepcted name (session)
|
||||||
|
// 4: expected error string
|
||||||
return [
|
return [
|
||||||
'session parameter' => [
|
'session parameter' => [
|
||||||
'sessionNameParameter',
|
'sessionNameParameter',
|
||||||
'p',
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
'sessionNameParameter',
|
'sessionNameParameter',
|
||||||
'/^\w+$/'
|
''
|
||||||
],
|
],
|
||||||
'session globals' => [
|
'session globals' => [
|
||||||
'sessionNameGlobals',
|
'sessionNameGlobals',
|
||||||
'g',
|
'g',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
'sessionNameGlobals',
|
'sessionNameGlobals',
|
||||||
'/^\w+$/'
|
''
|
||||||
],
|
],
|
||||||
'session constant' => [
|
'session name default' => [
|
||||||
'sessionNameConstant',
|
'',
|
||||||
'c',
|
'd',
|
||||||
'sessionNameConstant',
|
[
|
||||||
'/^\w+$/'
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
''
|
||||||
|
],
|
||||||
|
// error checks
|
||||||
|
// 1: we are in cli
|
||||||
|
'on cli error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => true,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] No sessions in php cli'
|
||||||
|
],
|
||||||
|
// 2: session disabled
|
||||||
|
'session disabled error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_DISABLED,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Sessions are disabled'
|
||||||
|
],
|
||||||
|
// 3: invalid session name: string
|
||||||
|
'invalid name chars error' => [
|
||||||
|
'1invalid$session#;',
|
||||||
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => false,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Invalid session name: 1invalid$session#;'
|
||||||
|
],
|
||||||
|
// 3: invalid session name: only numbers
|
||||||
|
'invalid name numbers only error' => [
|
||||||
|
'123',
|
||||||
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => false,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Invalid session name: 123'
|
||||||
|
],
|
||||||
|
// 3: invalid session name: invalid name short
|
||||||
|
// 3: invalid session name: too long (128)
|
||||||
|
// 4: failed to start session (2nd false on check active session)
|
||||||
|
'invalid name numbers only error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, false],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Failed to activate session'
|
||||||
|
],
|
||||||
|
// 5: get session id return false
|
||||||
|
'invalid name numbers only error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => false
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] getSessionId did not return a session id'
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Test session start
|
||||||
*
|
*
|
||||||
|
* @covers ::startSession
|
||||||
|
* @dataProvider sessionProvider
|
||||||
|
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $type
|
||||||
|
* @param array<mixed> $mock_data
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_error
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
protected function setUp(): void
|
public function testStartSession(
|
||||||
{
|
string $input,
|
||||||
if (session_id()) {
|
string $type,
|
||||||
session_destroy();
|
array $mock_data,
|
||||||
|
string $expected,
|
||||||
|
string $expected_error,
|
||||||
|
): void {
|
||||||
|
// override expected
|
||||||
|
if ($type == 'd') {
|
||||||
|
$expected = ini_get('session.name');
|
||||||
|
}
|
||||||
|
/** @var \CoreLibs\Create\Session&MockObject $session_mock */
|
||||||
|
$session_mock = $this->createPartialMock(
|
||||||
|
\CoreLibs\Create\Session::class,
|
||||||
|
[
|
||||||
|
'checkCliStatus', 'getSessionStatus', 'checkActiveSession',
|
||||||
|
'setSessionName', 'startSessionCall', 'getSessionId',
|
||||||
|
'getSessionName'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
// set return values based requested input values
|
||||||
|
// OK: true
|
||||||
|
// error: false
|
||||||
|
$session_mock->method('checkCliStatus')->willReturn($mock_data['checkCliStatus']);
|
||||||
|
// OK: PHP_SESSION_ACTIVE, PHP_SESSION_NONE
|
||||||
|
// error: PHP_SESSION_DISABLED
|
||||||
|
$session_mock->method('getSessionStatus')->willReturn($mock_data['getSessionStatus']);
|
||||||
|
// false: try start
|
||||||
|
// true: skip start
|
||||||
|
// note that on second call if false -> error
|
||||||
|
$session_mock->method('checkActiveSession')
|
||||||
|
->willReturnOnConsecutiveCalls(
|
||||||
|
$mock_data['checkActiveSession'][0],
|
||||||
|
$mock_data['checkActiveSession'][1],
|
||||||
|
);
|
||||||
|
// dummy set for session name
|
||||||
|
$session_mock->method('setSessionName')->with($input)->willReturn($mock_data['setSessionName']);
|
||||||
|
// set session name & return bsed on request data
|
||||||
|
$session_mock->method('getSessionName')->willReturn($expected);
|
||||||
|
// will not return anything
|
||||||
|
$session_mock->method('startSessionCall');
|
||||||
|
// in test case only return string
|
||||||
|
// false: will return false
|
||||||
|
$session_mock->method('getSessionId')->willReturn($mock_data['getSessionId']);
|
||||||
|
|
||||||
|
// regex for session id
|
||||||
|
$ression_id_regex = "/^\w+$/";
|
||||||
|
|
||||||
|
unset($GLOBALS['SET_SESSION_NAME']);
|
||||||
|
$session_id = '';
|
||||||
|
switch ($type) {
|
||||||
|
case 'p':
|
||||||
|
$session_id = $session_mock->startSession($input);
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
$GLOBALS['SET_SESSION_NAME'] = $input;
|
||||||
|
$session_id = $session_mock->startSession();
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
$session_id = $session_mock->startSession();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// asert checks
|
||||||
|
if (!empty($session_id)) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$ression_id_regex,
|
||||||
|
(string)$session_id,
|
||||||
|
'session id regex from retrun'
|
||||||
|
);
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$ression_id_regex,
|
||||||
|
(string)$session_mock->getSessionId()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$session_mock->getSessionName()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// false checks
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_error,
|
||||||
|
$session_mock->getErrorStr(),
|
||||||
|
'error assert'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* provider for session name check
|
||||||
*
|
*
|
||||||
* @dataProvider sessionProvider
|
* @return array
|
||||||
* @testdox startSession $input name for $type will be $expected_n with $expected_i [$_dataName]
|
*/
|
||||||
|
public function sessionNameProvider(): array
|
||||||
|
{
|
||||||
|
// 0: string for session
|
||||||
|
// 1: expected return as bool
|
||||||
|
return [
|
||||||
|
'valid name' => [
|
||||||
|
'abc',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'valid name longer' => [
|
||||||
|
'something-abc-123',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'invalid name' => [
|
||||||
|
'abc#abc',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'only numbers' => [
|
||||||
|
'123',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'longer than 128 chars' => [
|
||||||
|
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
|
||||||
|
. 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
|
||||||
|
. 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'too short' => [
|
||||||
|
'',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test valid session name
|
||||||
*
|
*
|
||||||
* @param string $input
|
* @covers ::checkValidSessionName
|
||||||
* @param string $type
|
* @dataProvider sessionNameProvider
|
||||||
* @param string|bool $expected_n
|
* @testdox checkValidSessionName $input seessionn name is $expected [$_dataName]
|
||||||
* @param string|bool $expected_i
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testStartSession(string $input, string $type, $expected_n, $expected_i): void
|
public function testCheckValidSessionName(string $input, bool $expected): void
|
||||||
{
|
{
|
||||||
/* $session_id = '';
|
|
||||||
switch ($type) {
|
|
||||||
case 'p':
|
|
||||||
$session_id = \CoreLibs\Create\Session::startSession($input);
|
|
||||||
break;
|
|
||||||
case 'g':
|
|
||||||
$GLOBALS['SET_SESSION_NAME'] = $input;
|
|
||||||
$session_id = \CoreLibs\Create\Session::startSession();
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
define('SET_SESSION_NAME', $input);
|
|
||||||
$session_id = \CoreLibs\Create\Session::startSession();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_i,
|
|
||||||
(string)$session_id
|
|
||||||
);
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_i,
|
|
||||||
(string)\CoreLibs\Create\Session::getSessionId()
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_n,
|
$expected,
|
||||||
\CoreLibs\Create\Session::getSessionName()
|
\CoreLibs\Create\Session::checkValidSessionName($input)
|
||||||
);
|
);
|
||||||
if ($type == 'g') {
|
}
|
||||||
unset($GLOBALS['SET_SESSION_NAME']);
|
|
||||||
} */
|
/**
|
||||||
$this->markTestSkipped('No implementation for Create\Session. Cannot run session_start in CLI');
|
* provider for set/get tests
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sessionDataProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'test' => [
|
||||||
|
'foo',
|
||||||
|
'bar',
|
||||||
|
'bar',
|
||||||
|
],
|
||||||
|
'int key test' => [
|
||||||
|
123,
|
||||||
|
'bar',
|
||||||
|
'bar',
|
||||||
|
],
|
||||||
|
// more complex value tests
|
||||||
|
'array values' => [
|
||||||
|
'array',
|
||||||
|
[1, 2, 3],
|
||||||
|
[1, 2, 3],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* method call test
|
||||||
|
*
|
||||||
|
* @covers ::setS
|
||||||
|
* @covers ::getS
|
||||||
|
* @covers ::issetS
|
||||||
|
* @covers ::unsetS
|
||||||
|
* @dataProvider sessionDataProvider
|
||||||
|
* @testdox setS/getS/issetS/unsetS $name with $input is $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @param mixed $input
|
||||||
|
* @param mixed $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMethodSetGet($name, $input, $expected): void
|
||||||
|
{
|
||||||
|
$session = new \CoreLibs\Create\Session();
|
||||||
|
$session->setS($name, $input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$session->getS($name),
|
||||||
|
'method set assert'
|
||||||
|
);
|
||||||
|
// isset true
|
||||||
|
$this->assertTrue(
|
||||||
|
$session->issetS($name),
|
||||||
|
'method isset assert ok'
|
||||||
|
);
|
||||||
|
$session->unsetS($name);
|
||||||
|
$this->assertEquals(
|
||||||
|
'',
|
||||||
|
$session->getS($name),
|
||||||
|
'method unset assert'
|
||||||
|
);
|
||||||
|
// iset false
|
||||||
|
$this->assertFalse(
|
||||||
|
$session->issetS($name),
|
||||||
|
'method isset assert false'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* magic call test
|
||||||
|
*
|
||||||
|
* @covers ::__set
|
||||||
|
* @covers ::__get
|
||||||
|
* @covers ::__isset
|
||||||
|
* @covers ::__unset
|
||||||
|
* @dataProvider sessionDataProvider
|
||||||
|
* @testdox __set/__get/__iseet/__unset $name with $input is $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @param mixed $input
|
||||||
|
* @param mixed $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMagicSetGet($name, $input, $expected): void
|
||||||
|
{
|
||||||
|
$session = new \CoreLibs\Create\Session();
|
||||||
|
$session->$name = $input;
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$session->$name,
|
||||||
|
'magic set assert'
|
||||||
|
);
|
||||||
|
// isset true
|
||||||
|
$this->assertTrue(
|
||||||
|
isset($session->$name),
|
||||||
|
'magic isset assert ok'
|
||||||
|
);
|
||||||
|
unset($session->$name);
|
||||||
|
$this->assertEquals(
|
||||||
|
'',
|
||||||
|
$session->$name,
|
||||||
|
'magic unset assert'
|
||||||
|
);
|
||||||
|
// isset true
|
||||||
|
$this->assertFalse(
|
||||||
|
isset($session->$name),
|
||||||
|
'magic isset assert false'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unset all test
|
||||||
|
*
|
||||||
|
* @covers ::unsetAllS
|
||||||
|
* @testdox unsetAllS test
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUnsetAll(): void
|
||||||
|
{
|
||||||
|
$test_values = [
|
||||||
|
'foo' => 'abc',
|
||||||
|
'bar' => '123'
|
||||||
|
];
|
||||||
|
$session = new \CoreLibs\Create\Session();
|
||||||
|
foreach ($test_values as $name => $value) {
|
||||||
|
$session->setS($name, $value);
|
||||||
|
// confirm set
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$session->getS($name),
|
||||||
|
'set assert: ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// unset all
|
||||||
|
$session->unsetAllS();
|
||||||
|
// check unset
|
||||||
|
foreach (array_keys($test_values) as $name) {
|
||||||
|
$this->assertEquals(
|
||||||
|
'',
|
||||||
|
$session->getS($name),
|
||||||
|
'unsert assert: ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ final class CoreLibsDBExtendedArrayIOTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDBIO()
|
public function testArrayDBIO()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
// $this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,8 @@ namespace tests;
|
|||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
// TODO: setLogPer test log file written matches pattern
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test class for Debug\Logging
|
* Test class for Debug\Logging
|
||||||
* @coversDefaultClass \CoreLibs\Debug\Logging
|
* @coversDefaultClass \CoreLibs\Debug\Logging
|
||||||
@@ -13,8 +15,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsDebugLoggingTest extends TestCase
|
final class CoreLibsDebugLoggingTest extends TestCase
|
||||||
{
|
{
|
||||||
public $log;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test set for options BASIC
|
* test set for options BASIC
|
||||||
*
|
*
|
||||||
@@ -54,14 +54,16 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
'no options set, constant set' => [
|
'no options set, constant set' => [
|
||||||
null,
|
null,
|
||||||
[
|
[
|
||||||
'log_folder' => '/tmp/',
|
'log_folder' => str_replace('/configs', '', __DIR__)
|
||||||
|
. DIRECTORY_SEPARATOR . 'log/',
|
||||||
'debug_all' => false,
|
'debug_all' => false,
|
||||||
'print_all' => false,
|
'print_all' => false,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'constant' => [
|
'constant' => [
|
||||||
'BASE' => '/tmp',
|
'BASE' => str_replace('/configs', '', __DIR__)
|
||||||
'LOG' => '/'
|
. DIRECTORY_SEPARATOR,
|
||||||
|
'LOG' => 'log/'
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -81,6 +83,47 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init logging class
|
||||||
|
*
|
||||||
|
* @dataProvider optionsProvider
|
||||||
|
* @testdox init test [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array|null $options
|
||||||
|
* @param array $expected
|
||||||
|
* @param array $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testClassInit(?array $options, array $expected, array $override): void
|
||||||
|
{
|
||||||
|
if (!empty($override['constant'])) {
|
||||||
|
foreach ($override['constant'] as $var => $value) {
|
||||||
|
define($var, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($options === null) {
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Debug\Logging($options);
|
||||||
|
}
|
||||||
|
// check that settings match
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['log_folder'],
|
||||||
|
$log->getSetting('log_folder')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['debug_all'],
|
||||||
|
$log->getSetting('debug_output_all')
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['print_all'],
|
||||||
|
$log->getSetting('print_output_all')
|
||||||
|
);
|
||||||
|
// print "LOG: " . $log->getSetting('log_folder') . "\n";
|
||||||
|
// print "DEBUG: " . $log->getSetting('debug_output_all') . "\n";
|
||||||
|
// print "PRINT: " . $log->getSetting('print_output_all') . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* adds log ID settings based on basic options
|
* adds log ID settings based on basic options
|
||||||
*
|
*
|
||||||
@@ -169,6 +212,52 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test the setting and getting of LogId
|
||||||
|
*
|
||||||
|
* @covers ::setLogId
|
||||||
|
* @dataProvider logIdOptionsProvider
|
||||||
|
* @testdox log id set/get tests [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array|null $options
|
||||||
|
* @param array $expected
|
||||||
|
* @param array $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLogId(?array $options, array $expected, array $override): void
|
||||||
|
{
|
||||||
|
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
||||||
|
if (!empty($override['constant'])) {
|
||||||
|
foreach ($override['constant'] as $var => $value) {
|
||||||
|
define($var, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!empty($override['globals'])) {
|
||||||
|
foreach ($override['globals'] as $var => $value) {
|
||||||
|
$GLOBALS[$var] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($options === null) {
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Debug\Logging($options);
|
||||||
|
}
|
||||||
|
// check current
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogId(),
|
||||||
|
$expected['log_file_id']
|
||||||
|
);
|
||||||
|
// we need to override now too
|
||||||
|
if (!empty($override['values'])) {
|
||||||
|
// check if we have values, set them post and assert
|
||||||
|
$log->setLogId($override['values']['log_file_id']);
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogId(),
|
||||||
|
$expected['set_log_file_id']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -176,6 +265,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function logLevelAllProvider(): array
|
public function logLevelAllProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: type
|
||||||
|
// 1: flag
|
||||||
|
// 2: expected set
|
||||||
|
// 3: expected get
|
||||||
return [
|
return [
|
||||||
'debug all true' => [
|
'debug all true' => [
|
||||||
'debug',
|
'debug',
|
||||||
@@ -204,6 +297,38 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check set/get for log level all flag
|
||||||
|
*
|
||||||
|
* @dataProvider logLevelAllProvider
|
||||||
|
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @param bool $flag
|
||||||
|
* @param bool $expected_set
|
||||||
|
* @param bool $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogLevelAll(
|
||||||
|
string $type,
|
||||||
|
bool $flag,
|
||||||
|
bool $expected_set,
|
||||||
|
bool $expected_get
|
||||||
|
): void {
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setLogLevelAll($type, $flag),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
// get and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogLevelAll($type),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -211,6 +336,12 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function logLevelProvider(): array
|
public function logLevelProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: type
|
||||||
|
// 1: flag
|
||||||
|
// 2: debug on (array)
|
||||||
|
// 3: expected set
|
||||||
|
// 4: level
|
||||||
|
// 5: expected get
|
||||||
return [
|
return [
|
||||||
'set debug on for level A,B,C and check full set' => [
|
'set debug on for level A,B,C and check full set' => [
|
||||||
'debug',
|
'debug',
|
||||||
@@ -283,6 +414,43 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* checks setting for per log info level
|
||||||
|
*
|
||||||
|
* @covers ::setLogLevel
|
||||||
|
* @dataProvider logLevelProvider
|
||||||
|
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @param string $flag
|
||||||
|
* @param array $debug_on
|
||||||
|
* @param bool $expected_set
|
||||||
|
* @param string|null $level
|
||||||
|
* @param bool|array<mixed> $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogLevel(
|
||||||
|
string $type,
|
||||||
|
string $flag,
|
||||||
|
array $debug_on,
|
||||||
|
bool $expected_set,
|
||||||
|
?string $level,
|
||||||
|
$expected_get
|
||||||
|
): void {
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setLogLevel($type, $flag, $debug_on),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
// get, if level is null compare to?
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogLevel($type, $flag, $level),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -290,6 +458,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function logPerProvider(): array
|
public function logPerProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: type
|
||||||
|
// 1: set
|
||||||
|
// 2: expected set
|
||||||
|
// 3: expected get
|
||||||
return [
|
return [
|
||||||
'level set true' => [
|
'level set true' => [
|
||||||
'level',
|
'level',
|
||||||
@@ -324,6 +496,68 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set and get per log
|
||||||
|
* for level/class/page/run flags
|
||||||
|
*
|
||||||
|
* @covers ::setLogPer
|
||||||
|
* @dataProvider logPerProvider
|
||||||
|
* @testdox set/get log per $type with $set [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @param boolean $set
|
||||||
|
* @param boolean $expected_set
|
||||||
|
* @param boolean $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogPer(
|
||||||
|
string $type,
|
||||||
|
bool $set,
|
||||||
|
bool $expected_set,
|
||||||
|
bool $expected_get
|
||||||
|
): void {
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setLogPer($type, $set),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
// get and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogPer($type),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the print log file date part
|
||||||
|
*
|
||||||
|
* @covers ::setGetLogPrintFileDate
|
||||||
|
* @testWith [true, true, true]
|
||||||
|
* [false, false, false]
|
||||||
|
* @testdox set/get log file date to $input [$_dataName]
|
||||||
|
*
|
||||||
|
* @param boolean $input
|
||||||
|
* @param boolean $expected_set
|
||||||
|
* @param boolean $expected_get
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
||||||
|
{
|
||||||
|
// neutral start with default
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
// set and check
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setGetLogPrintFileDate($input),
|
||||||
|
$expected_set
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->setGetLogPrintFileDate(),
|
||||||
|
$expected_get
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -365,6 +599,95 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convert array to string with ## pre replace space holders
|
||||||
|
*
|
||||||
|
* @covers ::prAr
|
||||||
|
* @dataProvider prArProvider
|
||||||
|
* @testdox check prAr array to string conversion [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrAr(array $input, string $expected): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->prAr($input),
|
||||||
|
$expected
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function prBlProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input flag (bool)
|
||||||
|
// 1: is true
|
||||||
|
// 2: is flase
|
||||||
|
// 3: epxected
|
||||||
|
return [
|
||||||
|
'true bool default' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'true'
|
||||||
|
],
|
||||||
|
'false bool default' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'false'
|
||||||
|
],
|
||||||
|
'true bool override' => [
|
||||||
|
true,
|
||||||
|
'ok',
|
||||||
|
'not ok',
|
||||||
|
'ok'
|
||||||
|
],
|
||||||
|
'false bool override' => [
|
||||||
|
false,
|
||||||
|
'ok',
|
||||||
|
'not ok',
|
||||||
|
'not ok'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check bool to string converter
|
||||||
|
*
|
||||||
|
* @covers ::prBl
|
||||||
|
* @dataProvider prBlProvider
|
||||||
|
* @testdox check prBl $input ($true/$false) is expected $false [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $input
|
||||||
|
* @param string|null $true
|
||||||
|
* @param string|null $false
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrBl(bool $input, ?string $true, ?string $false, string $expected): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
$return = '';
|
||||||
|
if ($true === null && $false === null) {
|
||||||
|
$return = $log->prBl($input);
|
||||||
|
} elseif ($true !== null || $false !== null) {
|
||||||
|
$return = $log->prBl($input, $true ?? '', $false ?? '');
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$return
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// from here are complex debug tests
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -467,246 +790,6 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* init logging class
|
|
||||||
*
|
|
||||||
* @dataProvider optionsProvider
|
|
||||||
* @testdox init test [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array|null $options
|
|
||||||
* @param array $expected
|
|
||||||
* @param array $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testClassInit(?array $options, array $expected, array $override): void
|
|
||||||
{
|
|
||||||
if (!empty($override['constant'])) {
|
|
||||||
foreach ($override['constant'] as $var => $value) {
|
|
||||||
define($var, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($options === null) {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check that settings match
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['log_folder'],
|
|
||||||
$this->log->getSetting('log_folder')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['debug_all'],
|
|
||||||
$this->log->getSetting('debug_output_all')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['print_all'],
|
|
||||||
$this->log->getSetting('print_output_all')
|
|
||||||
);
|
|
||||||
// print "LOG: " . $this->log->getSetting('log_folder') . "\n";
|
|
||||||
// print "DEBUG: " . $this->log->getSetting('debug_output_all') . "\n";
|
|
||||||
// print "PRINT: " . $this->log->getSetting('print_output_all') . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* test the setting and getting of LogId
|
|
||||||
*
|
|
||||||
* @covers ::setLogId
|
|
||||||
* @dataProvider logIdOptionsProvider
|
|
||||||
* @testdox log id set/get tests [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array|null $options
|
|
||||||
* @param array $expected
|
|
||||||
* @param array $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testLogId(?array $options, array $expected, array $override): void
|
|
||||||
{
|
|
||||||
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
|
||||||
if (!empty($override['constant'])) {
|
|
||||||
foreach ($override['constant'] as $var => $value) {
|
|
||||||
define($var, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!empty($override['globals'])) {
|
|
||||||
foreach ($override['globals'] as $var => $value) {
|
|
||||||
$GLOBALS[$var] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($options === null) {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check current
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogId(),
|
|
||||||
$expected['log_file_id']
|
|
||||||
);
|
|
||||||
// we need to override now too
|
|
||||||
if (!empty($override['values'])) {
|
|
||||||
// check if we have values, set them post and assert
|
|
||||||
$this->log->basicSetLogId($override['values']['log_file_id']);
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogId(),
|
|
||||||
$expected['set_log_file_id']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check set/get for log level all flag
|
|
||||||
*
|
|
||||||
* @dataProvider logLevelAllProvider
|
|
||||||
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param bool $flag
|
|
||||||
* @param bool $expected_set
|
|
||||||
* @param bool $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogLevelAll(
|
|
||||||
string $type,
|
|
||||||
bool $flag,
|
|
||||||
bool $expected_set,
|
|
||||||
bool $expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogLevelAll($type, $flag),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogLevelAll($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* checks setting for per log info level
|
|
||||||
*
|
|
||||||
* @covers ::setLogLevel
|
|
||||||
* @dataProvider logLevelProvider
|
|
||||||
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param string $flag
|
|
||||||
* @param array $debug_on
|
|
||||||
* @param bool $expected_set
|
|
||||||
* @param string|null $level
|
|
||||||
* @param bool|array<mixed> $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogLevel(
|
|
||||||
string $type,
|
|
||||||
string $flag,
|
|
||||||
array $debug_on,
|
|
||||||
bool $expected_set,
|
|
||||||
?string $level,
|
|
||||||
$expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogLevel($type, $flag, $debug_on),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get, if level is null compare to?
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogLevel($type, $flag, $level),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set and get per log
|
|
||||||
* for level/class/page/run flags
|
|
||||||
*
|
|
||||||
* @covers ::setLogPer
|
|
||||||
* @dataProvider logPerProvider
|
|
||||||
* @testdox set/get log per $type with $set [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param boolean $set
|
|
||||||
* @param boolean $expected_set
|
|
||||||
* @param boolean $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogPer(
|
|
||||||
string $type,
|
|
||||||
bool $set,
|
|
||||||
bool $expected_set,
|
|
||||||
bool $expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogPer($type, $set),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogPer($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set the print log file date part
|
|
||||||
*
|
|
||||||
* @covers ::setGetLogPrintFileDate
|
|
||||||
* @testWith [true, true, true]
|
|
||||||
* [false, false, false]
|
|
||||||
* @testdox set/get log file date to $input [$_dataName]
|
|
||||||
*
|
|
||||||
* @param boolean $input
|
|
||||||
* @param boolean $expected_set
|
|
||||||
* @param boolean $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
|
||||||
{
|
|
||||||
// neutral start with default
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setGetLogPrintFileDate($input),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setGetLogPrintFileDate(),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert array to string with ## pre replace space holders
|
|
||||||
*
|
|
||||||
* @covers ::prAr
|
|
||||||
* @dataProvider prArProvider
|
|
||||||
* @testdox check prAr array to string conversion [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrAr(array $input, string $expected): void
|
|
||||||
{
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->prAr($input),
|
|
||||||
$expected
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// from here are complex debug tests
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test debug flow
|
* Test debug flow
|
||||||
*
|
*
|
||||||
@@ -728,7 +811,7 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
bool $expected_debug,
|
bool $expected_debug,
|
||||||
string $expected_file,
|
string $expected_file,
|
||||||
string $expected_string_start,
|
string $expected_string_start,
|
||||||
string $expected_string_contains,
|
string $expected_string_contains
|
||||||
): void {
|
): void {
|
||||||
// must run with below matrix
|
// must run with below matrix
|
||||||
// level | debug | print | echo | debug() | printErrorMsg() | file
|
// level | debug | print | echo | debug() | printErrorMsg() | file
|
||||||
@@ -762,11 +845,11 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
// remove any files named /tmp/error_log_TestDebug*.log
|
// remove any files named /tmp/error_log_TestDebug*.log
|
||||||
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
|
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
|
||||||
// init logger
|
// init logger
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
$log = new \CoreLibs\Debug\Logging($options);
|
||||||
// * debug (A/B)
|
// * debug (A/B)
|
||||||
// NULL check for strip/prefix
|
// NULL check for strip/prefix
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$this->log->debug(
|
$log->debug(
|
||||||
$debug_msg['level'],
|
$debug_msg['level'],
|
||||||
$debug_msg['string'],
|
$debug_msg['string'],
|
||||||
$debug_msg['strip'],
|
$debug_msg['strip'],
|
||||||
@@ -775,7 +858,7 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
$expected_debug
|
$expected_debug
|
||||||
);
|
);
|
||||||
// * if print check data in log file
|
// * if print check data in log file
|
||||||
$log_file = $this->log->getLogFileName();
|
$log_file = $log->getLogFileName();
|
||||||
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
|
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
|
||||||
// file name matching
|
// file name matching
|
||||||
$this->assertStringStartsWith(
|
$this->assertStringStartsWith(
|
||||||
@@ -804,10 +887,10 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
// ** ECHO ON
|
// ** ECHO ON
|
||||||
$log_string = $this->log->printErrorMsg();
|
$log_string = $log->printErrorMsg();
|
||||||
// * print
|
// * print
|
||||||
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
||||||
// print $this->log->printErrorMsg() . "\n";
|
// print $log->printErrorMsg() . "\n";
|
||||||
// echo string must start with
|
// echo string must start with
|
||||||
$this->assertStringStartsWith(
|
$this->assertStringStartsWith(
|
||||||
$expected_string_start,
|
$expected_string_start,
|
||||||
@@ -831,6 +914,77 @@ final class CoreLibsDebugLoggingTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: setLogUniqueId/getLogUniqueId
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function logUniqueIdProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'option set' => [
|
||||||
|
'option' => true,
|
||||||
|
'override' => false,
|
||||||
|
],
|
||||||
|
'direct set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => false,
|
||||||
|
],
|
||||||
|
'override set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => true,
|
||||||
|
],
|
||||||
|
'option and override set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => true,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogUniqueId
|
||||||
|
* @covers ::getLogUniqueId
|
||||||
|
* @dataProvider logUniqueIdProvider
|
||||||
|
* @testdox per run log id set test: option: $option, override: $override [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $option
|
||||||
|
* @param bool $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLogUniqueId(bool $option, bool $override): void
|
||||||
|
{
|
||||||
|
if ($option === true) {
|
||||||
|
$log = new \CoreLibs\Debug\Logging(['per_run' => $option]);
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Debug\Logging();
|
||||||
|
$log->setLogUniqueId();
|
||||||
|
}
|
||||||
|
$per_run_id = $log->getLogUniqueId();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||||
|
$per_run_id,
|
||||||
|
'assert per log run id 1st'
|
||||||
|
);
|
||||||
|
if ($override === true) {
|
||||||
|
$log->setLogUniqueId(true);
|
||||||
|
$per_run_id_2nd = $log->getLogUniqueId();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||||
|
$per_run_id_2nd,
|
||||||
|
'assert per log run id 2nd'
|
||||||
|
);
|
||||||
|
$this->assertNotEquals(
|
||||||
|
$per_run_id,
|
||||||
|
$per_run_id_2nd,
|
||||||
|
'1st and 2nd don\'t match'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
119
4dev/tests/CoreLibsDebugMemoryUsageTest.php
Normal file
119
4dev/tests/CoreLibsDebugMemoryUsageTest.php
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Debug\MemoryUsage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Debug\MemoryUsage
|
||||||
|
* @coversDefaultClass \CoreLibs\Debug\MemoryUsage
|
||||||
|
* @testdox \CoreLibs\Debug\MemoryUsage method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsDebugMemoryUsageTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function memoryUsageProvider(): array
|
||||||
|
{
|
||||||
|
$regex_raw_off = '/^\[[\w\s_-]+\] Peak\/Curr\/Change: \d+(\.\d+)? ?\w{1,2}\/'
|
||||||
|
. '\d+(\.\d+)? ?\w{1,2}\/'
|
||||||
|
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \| '
|
||||||
|
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \| '
|
||||||
|
. 'Since Set: \d+(\.\d+)? ?\w{1,2}$/';
|
||||||
|
$regex_raw_on = '/^\[[\w\s_-]+\] Peak\/Curr\/'
|
||||||
|
// . 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2} \[\d+\]\/'
|
||||||
|
. 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2}/'
|
||||||
|
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||||
|
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||||
|
. 'Since Set: \d+(\.\d+)? ?\w{1,2} \[\d+\]$/';
|
||||||
|
$regex_array = [
|
||||||
|
'prefix' => '/^[\w\s_-]+$/',
|
||||||
|
'peak' => '/^\d+$/',
|
||||||
|
'usage' => '/^\d+$/',
|
||||||
|
'start' => '/^\d+$/',
|
||||||
|
'last' => '/^\d+$/',
|
||||||
|
'set' => '/^\d+$/',
|
||||||
|
];
|
||||||
|
// 0: prefix
|
||||||
|
// 1: raw flag
|
||||||
|
// 2: set flags array
|
||||||
|
// 3: array output expected (as regex)
|
||||||
|
// 4: string output expected (as regex)
|
||||||
|
return [
|
||||||
|
'test normal' => [
|
||||||
|
'test',
|
||||||
|
null,
|
||||||
|
[],
|
||||||
|
$regex_array,
|
||||||
|
$regex_raw_off,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::resetMemory
|
||||||
|
* @cover ::debugMemoryFlag
|
||||||
|
* @cover ::setStartMemory
|
||||||
|
* @cover ::setMemory
|
||||||
|
* @cover ::memoryUsage
|
||||||
|
* @cover ::printMemoryUsage
|
||||||
|
* @dataProvider memoryUsageProvider
|
||||||
|
* @testdox memoryUsage with $prefix, raw memory $raw [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $prefix
|
||||||
|
* @param bool|null $raw
|
||||||
|
* @param array $set_flags
|
||||||
|
* @param array $expected_array
|
||||||
|
* @param string $expected_string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMemoryUsage(
|
||||||
|
string $prefix,
|
||||||
|
?bool $raw,
|
||||||
|
array $settings,
|
||||||
|
array $expected_array,
|
||||||
|
string $expected_string
|
||||||
|
): void {
|
||||||
|
// always reeset to null
|
||||||
|
MemoryUsage::resetMemory();
|
||||||
|
MemoryUsage::debugMemoryFlag(true);
|
||||||
|
MemoryUsage::setStartMemory();
|
||||||
|
MemoryUsage::setMemory();
|
||||||
|
// run collector
|
||||||
|
$memory = MemoryUsage::memoryUsage($prefix);
|
||||||
|
if ($raw === null) {
|
||||||
|
$string = MemoryUsage::printMemoryUsage($memory);
|
||||||
|
} else {
|
||||||
|
$string = MemoryUsage::printMemoryUsage($memory, $raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expected_array for each
|
||||||
|
foreach ($expected_array as $name => $regex) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
(string)$memory[$name],
|
||||||
|
'assert memory usage array ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// regex match string
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected_string,
|
||||||
|
$string,
|
||||||
|
'assert memory usage string as regex'
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO additional tests with use more memory and check diff matching
|
||||||
|
// TODO reset memory usage test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -15,6 +15,8 @@ final class CoreLibsDebugRunningTimeTest extends TestCase
|
|||||||
{
|
{
|
||||||
public function hrRunningTimeProvider(): array
|
public function hrRunningTimeProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: return time difference
|
||||||
|
// 1: return time on first run in regex
|
||||||
return [
|
return [
|
||||||
'default time' => [
|
'default time' => [
|
||||||
0 => null,
|
0 => null,
|
||||||
@@ -69,21 +71,73 @@ final class CoreLibsDebugRunningTimeTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testHrRunningTime(?string $out_time, string $expected): void
|
public function testHrRunningTime(?string $out_time, string $expected): void
|
||||||
{
|
{
|
||||||
|
// reset for each run
|
||||||
|
\CoreLibs\Debug\RunningTime::hrRunningTimeReset();
|
||||||
$start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
$start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
0,
|
0,
|
||||||
$start
|
$start,
|
||||||
|
'assert first run 0'
|
||||||
);
|
);
|
||||||
time_nanosleep(1, 500);
|
time_nanosleep(1, 500);
|
||||||
if ($out_time === null) {
|
if ($out_time === null) {
|
||||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
$second = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
} else {
|
} else {
|
||||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
$second = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||||
}
|
}
|
||||||
// print "E: " . $end . "\n";
|
// print "E: " . $end . "\n";
|
||||||
$this->assertMatchesRegularExpression(
|
$this->assertMatchesRegularExpression(
|
||||||
$expected,
|
$expected,
|
||||||
(string)$end
|
(string)$second,
|
||||||
|
'assert second run regex'
|
||||||
|
);
|
||||||
|
if ($out_time === null) {
|
||||||
|
$end_second = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart();
|
||||||
|
} else {
|
||||||
|
$end_second = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart($out_time);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$end_second,
|
||||||
|
$second,
|
||||||
|
'assert end is equal second'
|
||||||
|
);
|
||||||
|
// sleep again, second messurement
|
||||||
|
time_nanosleep(1, 500);
|
||||||
|
if ($out_time === null) {
|
||||||
|
$third = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
|
} else {
|
||||||
|
$third = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||||
|
}
|
||||||
|
// third call is not null
|
||||||
|
$this->assertNotEquals(
|
||||||
|
0,
|
||||||
|
$third,
|
||||||
|
'assert third call not null'
|
||||||
|
);
|
||||||
|
// third call is bigger than end
|
||||||
|
$this->assertNotEquals(
|
||||||
|
$second,
|
||||||
|
$third,
|
||||||
|
'assert third different second'
|
||||||
|
);
|
||||||
|
// last messurement, must match start - end + last
|
||||||
|
if ($out_time === null) {
|
||||||
|
$end = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart();
|
||||||
|
} else {
|
||||||
|
$end = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart($out_time);
|
||||||
|
}
|
||||||
|
$this->assertGreaterThan(
|
||||||
|
$third,
|
||||||
|
$end,
|
||||||
|
'assert end greater third'
|
||||||
|
);
|
||||||
|
// new start
|
||||||
|
\CoreLibs\Debug\RunningTime::hrRunningTimeReset();
|
||||||
|
$new_start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
|
$this->assertEquals(
|
||||||
|
0,
|
||||||
|
$new_start,
|
||||||
|
'assert new run 0'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function printArProvider(): array
|
public function printArrayProvider(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'empty array' => [
|
'empty array' => [
|
||||||
@@ -62,6 +62,51 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printBoolProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'true input default' => [
|
||||||
|
0 => true,
|
||||||
|
1 => [],
|
||||||
|
2 => 'true'
|
||||||
|
],
|
||||||
|
'false input default' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [],
|
||||||
|
2 => 'false'
|
||||||
|
],
|
||||||
|
'false input param name' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test'
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: false'
|
||||||
|
],
|
||||||
|
'true input param name, true override' => [
|
||||||
|
0 => true,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test',
|
||||||
|
'true' => 'ok'
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: ok'
|
||||||
|
],
|
||||||
|
'false input param name, true override, false override' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test',
|
||||||
|
'true' => 'ok',
|
||||||
|
'false' => 'not',
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: not'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -75,6 +120,16 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
null,
|
null,
|
||||||
'a string',
|
'a string',
|
||||||
],
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
'a number' => [
|
'a number' => [
|
||||||
1234,
|
1234,
|
||||||
null,
|
null,
|
||||||
@@ -135,22 +190,41 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function debugStringProvider(): array
|
public function debugStringProvider(): array
|
||||||
{
|
{
|
||||||
|
// 0: input string
|
||||||
|
// 1: replace
|
||||||
|
// 2: html flag
|
||||||
|
// 3: expected
|
||||||
return [
|
return [
|
||||||
'null string, default' => [
|
'null string, default' => [
|
||||||
0 => null,
|
null,
|
||||||
1 => null,
|
null,
|
||||||
2 => '-'
|
null,
|
||||||
|
'-'
|
||||||
],
|
],
|
||||||
'empty string, ... replace' => [
|
'empty string, ... replace' => [
|
||||||
0 => '',
|
'',
|
||||||
1 => '...',
|
'...',
|
||||||
2 => '...'
|
null,
|
||||||
|
'...'
|
||||||
],
|
],
|
||||||
'filled string' => [
|
'filled string' => [
|
||||||
0 => 'some string',
|
'some string',
|
||||||
1 => null,
|
null,
|
||||||
2 => 'some string'
|
null,
|
||||||
]
|
'some string'
|
||||||
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,8 +258,9 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @cover ::printAr
|
* @cover ::printAr
|
||||||
* @dataProvider printArProvider
|
* @cover ::printArray
|
||||||
* @testdox printAr $input will be $expected [$_dataName]
|
* @dataProvider printArrayProvider
|
||||||
|
* @testdox printAr/printArray $input will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
* @param array $input
|
* @param array $input
|
||||||
* @param string $expected
|
* @param string $expected
|
||||||
@@ -195,7 +270,59 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
{
|
{
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::printAr($input)
|
\CoreLibs\Debug\Support::printAr($input),
|
||||||
|
'assert printAr'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\Support::printArray($input),
|
||||||
|
'assert printArray'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printBool
|
||||||
|
* @dataProvider printBoolProvider
|
||||||
|
* @testdox printBool $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $input
|
||||||
|
* @param array $params
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintBool(bool $input, array $params, string $expected): void
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
isset($params['name']) &&
|
||||||
|
isset($params['true']) &&
|
||||||
|
isset($params['false'])
|
||||||
|
) {
|
||||||
|
$string = \CoreLibs\Debug\Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name'],
|
||||||
|
$params['true'],
|
||||||
|
$params['false']
|
||||||
|
);
|
||||||
|
} elseif (isset($params['name']) && isset($params['true'])) {
|
||||||
|
$string = \CoreLibs\Debug\Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name'],
|
||||||
|
$params['true']
|
||||||
|
);
|
||||||
|
} elseif (isset($params['name'])) {
|
||||||
|
$string = \CoreLibs\Debug\Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name']
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$string = \CoreLibs\Debug\Support::printBool($input);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$string,
|
||||||
|
'assert printBool'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,12 +395,14 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
if (count($compare) == 10) {
|
if (count($compare) == 10) {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
\CoreLibs\Debug\Support::getCallerMethodList(),
|
||||||
|
'assert expected 10'
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_group,
|
$expected_group,
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
\CoreLibs\Debug\Support::getCallerMethodList(),
|
||||||
|
'assert expected group'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -300,24 +429,33 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @cover ::debugString
|
* @cover ::debugString
|
||||||
* @dataProvider debugStringProvider
|
* @dataProvider debugStringProvider
|
||||||
* @testdox debugString $input with replace $replace will be $expected [$_dataName]
|
* @testdox debugString $input with replace $replace and html $flag will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
* @param string|null $input
|
* @param string|null $input
|
||||||
* @param string|null $replace
|
* @param string|null $replace
|
||||||
* @param string $expected
|
* @param bool|null $flag
|
||||||
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDebugString(?string $input, ?string $replace, string $expected)
|
public function testDebugString(?string $input, ?string $replace, ?bool $flag, string $expected): void
|
||||||
{
|
{
|
||||||
if ($replace === null) {
|
if ($replace === null && $flag === null) {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::debugString($input)
|
\CoreLibs\Debug\Support::debugString($input),
|
||||||
|
'assert all default'
|
||||||
|
);
|
||||||
|
} elseif ($flag === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\Support::debugString($input, $replace),
|
||||||
|
'assert flag default'
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
\CoreLibs\Debug\Support::debugString($input, $replace)
|
\CoreLibs\Debug\Support::debugString($input, $replace, $flag),
|
||||||
|
'assert all set'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
162
4dev/tests/CoreLibsGetDotEnvTest.php
Normal file
162
4dev/tests/CoreLibsGetDotEnvTest.php
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Get\DotEnv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for ACL\Login
|
||||||
|
* @coversDefaultClass \CoreLibs\Get\DotEnv
|
||||||
|
* @testdox \CoreLibs\Get\DotEnv method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsGetDotEnvTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function envFileProvider(): array
|
||||||
|
{
|
||||||
|
$dot_env_content = [
|
||||||
|
'SOMETHING' => 'A',
|
||||||
|
'OTHER' => 'B IS B',
|
||||||
|
'Complex' => 'A B \"D is F',
|
||||||
|
'HAS_SPACE' => 'ABC',
|
||||||
|
'HAS_COMMENT_QUOTES_SPACE' => 'Comment at end with quotes and space',
|
||||||
|
'HAS_COMMENT_QUOTES_NO_SPACE' => 'Comment at end with quotes no space',
|
||||||
|
'HAS_COMMENT_NO_QUOTES_SPACE' => 'Comment at end no quotes and space',
|
||||||
|
'HAS_COMMENT_NO_QUOTES_NO_SPACE' => 'Comment at end no quotes no space',
|
||||||
|
'COMMENT_IN_TEXT_QUOTES' => 'Foo bar # comment in here',
|
||||||
|
'FAILURE' => 'ABC',
|
||||||
|
'SIMPLEBOX' => 'A B C',
|
||||||
|
'TITLE' => '1',
|
||||||
|
'FOO' => '1.2',
|
||||||
|
'SOME.TEST' => 'Test Var',
|
||||||
|
'SOME.LIVE' => 'Live Var',
|
||||||
|
'A_TEST1' => 'foo',
|
||||||
|
'A_TEST2' => '${TEST1:-bar}',
|
||||||
|
'A_TEST3' => '${TEST4:-bar}',
|
||||||
|
'A_TEST5' => 'null',
|
||||||
|
'A_TEST6' => '${TEST5-bar}',
|
||||||
|
'A_TEST7' => '${TEST6:-bar}',
|
||||||
|
'B_TEST1' => 'foo',
|
||||||
|
'B_TEST2' => '${TEST1:=bar}',
|
||||||
|
'B_TEST3' => '${TEST4:=bar}',
|
||||||
|
'B_TEST5' => 'null',
|
||||||
|
'B_TEST6' => '${TEST5=bar}',
|
||||||
|
'B_TEST7' => '${TEST6=bar}',
|
||||||
|
'Test' => 'A',
|
||||||
|
'TEST' => 'B',
|
||||||
|
'LINE' => "ABC\nDEF",
|
||||||
|
'OTHERLINE' => "ABC\nAF\"ASFASDF\nMORESHIT",
|
||||||
|
'SUPERLINE' => '',
|
||||||
|
'__FOO_BAR_1' => 'b',
|
||||||
|
'__FOOFOO' => 'f ',
|
||||||
|
123123 => 'number',
|
||||||
|
'EMPTY' => '',
|
||||||
|
];
|
||||||
|
// 0: folder relative to test folder, if unset __DIR__
|
||||||
|
// 1: file, if unset .env
|
||||||
|
// 2: status to be returned
|
||||||
|
// 3: _ENV file content to be set
|
||||||
|
// 4: override chmod as octect in string
|
||||||
|
return [
|
||||||
|
'default' => [
|
||||||
|
'folder' => null,
|
||||||
|
'file' => null,
|
||||||
|
'status' => 3,
|
||||||
|
'content' => [],
|
||||||
|
'chmod' => null,
|
||||||
|
],
|
||||||
|
'cannot open file' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => 'cannot_read.env',
|
||||||
|
'status' => 2,
|
||||||
|
'content' => [],
|
||||||
|
'chmod' => '000',
|
||||||
|
],
|
||||||
|
'empty file' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => 'empty.env',
|
||||||
|
'status' => 1,
|
||||||
|
'content' => [],
|
||||||
|
'chmod' => null,
|
||||||
|
],
|
||||||
|
'override all' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => 'test.env',
|
||||||
|
'status' => 0,
|
||||||
|
'content' => $dot_env_content,
|
||||||
|
'chmod' => null,
|
||||||
|
],
|
||||||
|
'override directory' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => null,
|
||||||
|
'status' => 0,
|
||||||
|
'content' => $dot_env_content,
|
||||||
|
'chmod' => null,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test read .env file
|
||||||
|
*
|
||||||
|
* @covers ::readEnvFile
|
||||||
|
* @dataProvider envFileProvider
|
||||||
|
* @testdox Read _ENV file from $folder / $file with expected status: $expected_status and chmod $chmod [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $folder
|
||||||
|
* @param string|null $file
|
||||||
|
* @param int $expected_status
|
||||||
|
* @param array $expected_env
|
||||||
|
* @param string|null $chmod
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testReadEnvFile(
|
||||||
|
?string $folder,
|
||||||
|
?string $file,
|
||||||
|
int $expected_status,
|
||||||
|
array $expected_env,
|
||||||
|
?string $chmod
|
||||||
|
): void {
|
||||||
|
// if we have file + chmod set
|
||||||
|
$old_chmod = null;
|
||||||
|
if (
|
||||||
|
is_file($folder . DIRECTORY_SEPARATOR . $file) &&
|
||||||
|
!empty($chmod)
|
||||||
|
) {
|
||||||
|
// get the old permissions
|
||||||
|
$old_chmod = fileperms($folder . DIRECTORY_SEPARATOR . $file);
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, octdec($chmod));
|
||||||
|
}
|
||||||
|
if ($folder !== null && $file !== null) {
|
||||||
|
$status = DotEnv::readEnvFile($folder, $file);
|
||||||
|
} elseif ($folder !== null) {
|
||||||
|
$status = DotEnv::readEnvFile($folder);
|
||||||
|
} else {
|
||||||
|
$status = DotEnv::readEnvFile();
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$status,
|
||||||
|
$expected_status,
|
||||||
|
'Assert returned status equal'
|
||||||
|
);
|
||||||
|
// now assert read data
|
||||||
|
$this->assertEquals(
|
||||||
|
$_ENV,
|
||||||
|
$expected_env,
|
||||||
|
'Assert _ENV correct'
|
||||||
|
);
|
||||||
|
// if we have file and chmod unset
|
||||||
|
if ($old_chmod !== null) {
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, $old_chmod);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -90,11 +90,16 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
public function getPageNameProvider(): array
|
public function getPageNameProvider(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
// 0: input
|
||||||
|
// 1: expected default/WITH_EXTENSION
|
||||||
|
// 2: expected NO_EXTENSION
|
||||||
|
// 3: expected FULL_PATH, if first and last character are / use regex
|
||||||
'original set' => [
|
'original set' => [
|
||||||
0 => null, // input
|
0 => null,
|
||||||
1 => 'phpunit',
|
1 => 'phpunit',
|
||||||
2 => 'phpunit',
|
2 => 'phpunit',
|
||||||
3 => 'www/vendor/bin/phpunit', // NOTE: this can change
|
// NOTE: this can change, so it is a regex check
|
||||||
|
3 => "/^(\/?.*\/?)?www\/vendor\/bin\/phpunit$/",
|
||||||
],
|
],
|
||||||
'some path with extension' => [
|
'some path with extension' => [
|
||||||
0 => '/some/path/to/file.txt',
|
0 => '/some/path/to/file.txt',
|
||||||
@@ -147,11 +152,13 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
list ($host, $port) = \CoreLibs\Get\System::getHostName();
|
list ($host, $port) = \CoreLibs\Get\System::getHostName();
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_host,
|
$expected_host,
|
||||||
$host
|
$host,
|
||||||
|
'failed expected host assert'
|
||||||
);
|
);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_port,
|
$expected_port,
|
||||||
$port
|
$port,
|
||||||
|
'faile expected port assert'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,20 +183,38 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
// default 0,
|
// default 0,
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_0,
|
$expected_0,
|
||||||
\CoreLibs\Get\System::getPageName()
|
\CoreLibs\Get\System::getPageName(),
|
||||||
|
'failed default assert'
|
||||||
);
|
);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_0,
|
$expected_0,
|
||||||
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::WITH_EXTENSION)
|
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::WITH_EXTENSION),
|
||||||
|
'failed WITH_EXTESION assert'
|
||||||
);
|
);
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected_1,
|
$expected_1,
|
||||||
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::NO_EXTENSION)
|
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::NO_EXTENSION),
|
||||||
);
|
'failed NO_EXTENSION assert'
|
||||||
$this->assertEquals(
|
|
||||||
$expected_2,
|
|
||||||
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::FULL_PATH)
|
|
||||||
);
|
);
|
||||||
|
// FULL PATH check can be equals or regex
|
||||||
|
$page_name_full_path = \CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::FULL_PATH);
|
||||||
|
if (
|
||||||
|
substr($expected_2, 0, 1) == '/' &&
|
||||||
|
substr($expected_2, -1, 1) == '/'
|
||||||
|
) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected_2,
|
||||||
|
$page_name_full_path,
|
||||||
|
'failed FULL_PATH assert regex'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_2,
|
||||||
|
$page_name_full_path,
|
||||||
|
'failed FULL_PATH assert equals'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Language\Encoding
|
|
||||||
* @coversDefaultClass \CoreLibs\Language\Encoding
|
|
||||||
* @testdox \CoreLibs\Language\Encoding method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsLanguageEncodingTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @testdox Language\Encoding Class tests
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testLanguageEncoding()
|
|
||||||
{
|
|
||||||
$this->assertTrue(true, 'Language Encoding Tests not implemented');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'Language\Encoding Tests have not yet been implemented'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
310
4dev/tests/CoreLibsLanguageGetLocaleTest.php
Normal file
310
4dev/tests/CoreLibsLanguageGetLocaleTest.php
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Language\GetLocale
|
||||||
|
*
|
||||||
|
* @coversDefaultClass \CoreLibs\Language\GetLocale
|
||||||
|
* @testdox \CoreLibs\Language\GetLocale method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsLanguageGetLocaleTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* set all constant variables that must be set before call
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
// default web page encoding setting
|
||||||
|
if (!defined('DEFAULT_ENCODING')) {
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
}
|
||||||
|
if (!defined('DEFAULT_LOCALE')) {
|
||||||
|
// default lang + encoding
|
||||||
|
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
||||||
|
}
|
||||||
|
// site
|
||||||
|
if (!defined('SITE_ENCODING')) {
|
||||||
|
define('SITE_ENCODING', DEFAULT_ENCODING);
|
||||||
|
}
|
||||||
|
if (!defined('SITE_LOCALE')) {
|
||||||
|
define('SITE_LOCALE', DEFAULT_LOCALE);
|
||||||
|
}
|
||||||
|
// just set
|
||||||
|
if (!defined('BASE')) {
|
||||||
|
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('INCLUDES')) {
|
||||||
|
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('LANG')) {
|
||||||
|
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('LOCALE')) {
|
||||||
|
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('CONTENT_PATH')) {
|
||||||
|
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
// array session
|
||||||
|
$_SESSION = [];
|
||||||
|
global $_SESSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all the test data
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function setLocaleProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: locale
|
||||||
|
// 1: domain
|
||||||
|
// 2: encoding
|
||||||
|
// 3: path
|
||||||
|
// 4: SESSION: DEFAULT_LOCALE
|
||||||
|
// 5: SESSION: DEFAULT_CHARSET
|
||||||
|
// 6: expected array
|
||||||
|
'no params, all default constants' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'no params, session charset and lang' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
'ja_JP', 'UTF-8',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'no params, session charset and lang short' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
'ja', 'UTF-8',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// param lang (no sessions)
|
||||||
|
'locale param only, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// different locale setting
|
||||||
|
'locale complex param only, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja_JP.SJIS', null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP.SJIS',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'SJIS',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'locale, domain params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', 'UTF-8', null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// lang, domain, path (no override)
|
||||||
|
'locale, domain and path, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', '', __DIR__ . '/locale_other/',
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// all params set (no override)
|
||||||
|
'all parameter, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja', 'admin', 'UTF-8', __DIR__ . '/locale_other/',
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'long locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'de_CH.UTF-8@euro', 'admin', 'UTF-8', null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'de_CH.UTF-8@euro',
|
||||||
|
'lang' => 'de_CH',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// TODO invalid params (bad path) (no override)
|
||||||
|
// TODO param calls, but with override set
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLocale
|
||||||
|
* @dataProvider setLocaleProvider
|
||||||
|
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testsetLocale(
|
||||||
|
?string $language,
|
||||||
|
?string $domain,
|
||||||
|
?string $encoding,
|
||||||
|
?string $path,
|
||||||
|
?string $SESSION_DEFAULT_LOCALE,
|
||||||
|
?string $SESSION_DEFAULT_CHARSET,
|
||||||
|
array $expected
|
||||||
|
): void {
|
||||||
|
$return_lang_settings = [];
|
||||||
|
global $_SESSION;
|
||||||
|
// set override
|
||||||
|
if ($SESSION_DEFAULT_LOCALE !== null) {
|
||||||
|
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_CHARSET !== null) {
|
||||||
|
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
|
||||||
|
}
|
||||||
|
// function call
|
||||||
|
if ($language === null && $domain === null && $encoding === null && $path === null) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
} elseif ($language !== null && $domain === null && $encoding === null && $path === null) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language
|
||||||
|
);
|
||||||
|
} elseif ($language !== null && $domain !== null && $encoding === null && $path === null) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain
|
||||||
|
);
|
||||||
|
} elseif ($language !== null && $domain !== null && $encoding !== null && $path === null) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding,
|
||||||
|
$path
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
|
||||||
|
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'locale', 'lang', 'domain', 'encoding', 'path'
|
||||||
|
] as $key
|
||||||
|
) {
|
||||||
|
$value = $expected[$key];
|
||||||
|
if (strpos($value, "/") === 0) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert regex failed for ' . $key
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// assert equal
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert equal failed for ' . $key
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// unset all vars
|
||||||
|
$_SESSION = [];
|
||||||
|
unset($GLOBALS['OVERRIDE_LANG']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@ final class CoreLibsOutputFormElementsTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputFormElements()
|
public function testOutputFormElements()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
// $this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'Output\Form\Elements Tests have not yet been implemented'
|
'Output\Form\Elements Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputFormTokenTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputFormToken()
|
public function testOutputFormToken()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Output Form Token Tests not implemented');
|
// $this->assertTrue(true, 'Output Form Token Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'Output\Form\Token Tests have not yet been implemented'
|
'Output\Form\Token Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
@@ -22,7 +22,7 @@ final class CoreLibsOutputImageTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputImage()
|
public function testOutputImage()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'Output Image Tests not implemented');
|
// $this->assertTrue(true, 'Output Image Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'Output\Image Tests have not yet been implemented'
|
'Output\Image Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
@@ -22,10 +22,10 @@ final class CoreLibsOutputProgressbarTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testOutputProgressbar()
|
public function testOutputProgressbar()
|
||||||
{
|
{
|
||||||
/* $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
// $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
// $this->markTestIncomplete(
|
||||||
'Output\Progressbar Tests have not yet been implemented'
|
// 'Output\Progressbar Tests have not yet been implemented'
|
||||||
); */
|
// );
|
||||||
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
|
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
1031
4dev/tests/database/CoreLibsACLLogin_database_create_data.sql
Normal file
1031
4dev/tests/database/CoreLibsACLLogin_database_create_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
1
4dev/tests/dotenv/.env
Symbolic link
1
4dev/tests/dotenv/.env
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
test.env
|
||||||
0
4dev/tests/dotenv/cannot_read.env
Normal file
0
4dev/tests/dotenv/cannot_read.env
Normal file
0
4dev/tests/dotenv/empty.env
Normal file
0
4dev/tests/dotenv/empty.env
Normal file
49
4dev/tests/dotenv/test.env
Normal file
49
4dev/tests/dotenv/test.env
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# enviroment file
|
||||||
|
SOMETHING=A
|
||||||
|
OTHER="B IS B"
|
||||||
|
Complex="A B \"D is F"
|
||||||
|
# COMMENT
|
||||||
|
HAS_SPACE= "ABC";
|
||||||
|
# COMMENT AT END
|
||||||
|
HAS_COMMENT_QUOTES_SPACE="Comment at end with quotes and space" # Comment QE
|
||||||
|
HAS_COMMENT_QUOTES_NO_SPACE="Comment at end with quotes no space"# Comment QES
|
||||||
|
HAS_COMMENT_NO_QUOTES_SPACE=Comment at end no quotes and space # Comment NQE
|
||||||
|
HAS_COMMENT_NO_QUOTES_NO_SPACE=Comment at end no quotes no space# Comment NQES
|
||||||
|
COMMENT_IN_TEXT_QUOTES="Foo bar # comment in here"
|
||||||
|
FAILURE = ABC
|
||||||
|
SIMPLEBOX= A B C
|
||||||
|
TITLE=1
|
||||||
|
FOO=1.2
|
||||||
|
SOME.TEST=Test Var
|
||||||
|
SOME.LIVE=Live Var
|
||||||
|
# VAR TESTS -
|
||||||
|
A_TEST1 = foo
|
||||||
|
A_TEST2 = ${TEST1:-bar} # TEST1 is set so the value of TEST2 = foo
|
||||||
|
A_TEST3 = ${TEST4:-bar} # TEST4 is not set so the value of TEST3 = bar
|
||||||
|
A_TEST5 = null
|
||||||
|
A_TEST6 = ${TEST5-bar} # TEST5 is set but empty so the value of TEST6 = null
|
||||||
|
A_TEST7 = ${TEST6:-bar} # TEST5 is set and empty so the value of TEST7 = bar
|
||||||
|
# VAR TESTS =
|
||||||
|
B_TEST1 = foo
|
||||||
|
B_TEST2 = ${TEST1:=bar} # TEST1 is set so the value of TEST2 = foo
|
||||||
|
B_TEST3 = ${TEST4:=bar} # TEST4 is not set so the value of TEST3 = bar and TEST4 = bar
|
||||||
|
B_TEST5 = null
|
||||||
|
B_TEST6 = ${TEST5=bar} # TEST5 is set but emtpy so the value of TEST6 = null
|
||||||
|
B_TEST7 = ${TEST6=bar} # TEST5 is set and empty so the value of TEST7 = bar and TEST5 = bar
|
||||||
|
# VAR TEST END
|
||||||
|
Test="A"
|
||||||
|
TEST="B"
|
||||||
|
TEST="D"
|
||||||
|
LINE="ABC
|
||||||
|
DEF"
|
||||||
|
OTHERLINE="ABC
|
||||||
|
AF\"ASFASDF
|
||||||
|
MORESHIT"
|
||||||
|
SUPERLINE=
|
||||||
|
"asfasfasf"
|
||||||
|
__FOO_BAR_1 = b
|
||||||
|
__FOOFOO = f
|
||||||
|
123123=number
|
||||||
|
EMPTY=
|
||||||
|
= flase
|
||||||
|
asfasdf
|
||||||
16
4dev/tests/includes/create_po.sh
Executable file
16
4dev/tests/includes/create_po.sh
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# if we don't have one base file we are in the wrong folder
|
||||||
|
if [ ! -f "locale/en_US/LC_MESSAGES/admin.mo" ]; then
|
||||||
|
echo "Locale file is missing, wrong base folder?"
|
||||||
|
echo "Should be: 4dev/tests/includes/"
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
for file in $(ls -1 locale/*.po); do
|
||||||
|
echo $file;
|
||||||
|
file=$(basename $file .po);
|
||||||
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
|
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||||
|
msgfmt -o locale/${locale}/LC_MESSAGES/${domain}.mo locale/${locale}-${domain}.po;
|
||||||
|
done;
|
||||||
34
4dev/tests/includes/locale/en_US-admin.po
Normal file
34
4dev/tests/includes/locale/en_US-admin.po
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: en_US.UTF-8 LC_MESSAGES admin\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: en_US\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Translated admin en_US"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi admin en_US 0"
|
||||||
|
msgstr[1] "Multi admin en_US 1"
|
||||||
|
msgstr[2] "Multi admin en_US 2"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Original context admin en_US"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi context admin en_US 0"
|
||||||
|
msgstr[1] "Multi context admin en_US 1"
|
||||||
|
msgstr[2] "Multi context admin en_US 2"
|
||||||
34
4dev/tests/includes/locale/en_US-frontend.po
Normal file
34
4dev/tests/includes/locale/en_US-frontend.po
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: en_US.UTF-8 LC_MESSAGES frontend\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: en_US\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Translated frontend en_US"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi frontend en_US 0"
|
||||||
|
msgstr[1] "Multi frontend en_US 1"
|
||||||
|
msgstr[2] "Multi frontend en_US 2"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Original context frontend en_US"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi context frontend en_US 0"
|
||||||
|
msgstr[1] "Multi context frontend en_US 1"
|
||||||
|
msgstr[2] "Multi context frontend en_US 2"
|
||||||
BIN
4dev/tests/includes/locale/en_US/LC_MESSAGES/admin.mo
Normal file
BIN
4dev/tests/includes/locale/en_US/LC_MESSAGES/admin.mo
Normal file
Binary file not shown.
BIN
4dev/tests/includes/locale/en_US/LC_MESSAGES/frontend.mo
Normal file
BIN
4dev/tests/includes/locale/en_US/LC_MESSAGES/frontend.mo
Normal file
Binary file not shown.
35
4dev/tests/includes/locale/ja_JP-admin.po
Normal file
35
4dev/tests/includes/locale/ja_JP-admin.po
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ja_JP.UTF-8 LC_MESSAGES admin\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: ja\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
|
||||||
|
# 0, 1, 2 plural
|
||||||
|
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Translated admin ja_JP"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi admin ja_JP 0"
|
||||||
|
msgstr[1] "Multi admin ja_JP 1"
|
||||||
|
msgstr[2] "Multi admin ja_JP 2"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Original context admin ja_JP"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi context admin ja_JP 0"
|
||||||
|
msgstr[1] "Multi context admin ja_JP 1"
|
||||||
|
msgstr[2] "Multi context admin ja_JP 2"
|
||||||
35
4dev/tests/includes/locale/ja_JP-frontend.po
Normal file
35
4dev/tests/includes/locale/ja_JP-frontend.po
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ja_JP.UTF-8 LC_MESSAGES frontend\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: ja\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
|
||||||
|
# 0, 1, 2 plural
|
||||||
|
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Translated frontend ja_JP"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi frontend ja_JP 0"
|
||||||
|
msgstr[1] "Multi frontend ja_JP 1"
|
||||||
|
msgstr[2] "Multi frontend ja_JP 2"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "Original"
|
||||||
|
msgstr "Original context frontend ja_JP"
|
||||||
|
|
||||||
|
msgctxt "context"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi context frontend ja_JP 0"
|
||||||
|
msgstr[1] "Multi context frontend ja_JP 1"
|
||||||
|
msgstr[2] "Multi context frontend ja_JP 2"
|
||||||
BIN
4dev/tests/includes/locale/ja_JP/LC_MESSAGES/admin.mo
Normal file
BIN
4dev/tests/includes/locale/ja_JP/LC_MESSAGES/admin.mo
Normal file
Binary file not shown.
BIN
4dev/tests/includes/locale/ja_JP/LC_MESSAGES/frontend.mo
Normal file
BIN
4dev/tests/includes/locale/ja_JP/LC_MESSAGES/frontend.mo
Normal file
Binary file not shown.
@@ -1,58 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace test;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
final class TemplateMethodsTest extends TestCase
|
|
||||||
{
|
|
||||||
public static function setUpBeforeClass(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function setUp(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function assertPreConditions(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testOne(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
$this->assertTrue(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testTwo(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
$this->assertTrue(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function assertPostConditions(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function tearDown(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function tearDownAfterClass(): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function onNotSuccessfulTest(\Throwable $t): void
|
|
||||||
{
|
|
||||||
fwrite(STDOUT, __METHOD__ . "\n");
|
|
||||||
throw $t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -44,9 +44,24 @@ $db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
|||||||
// login & page access check
|
// login & page access check
|
||||||
$login = new CoreLibs\ACL\Login($db, $log);
|
$login = new CoreLibs\ACL\Login($db, $log);
|
||||||
```
|
```
|
||||||
|
* update language class
|
||||||
|
```php
|
||||||
|
// pre auto detect language after login
|
||||||
|
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
// set lang and pass to smarty/backend
|
||||||
|
$l10n = new \CoreLibs\Language\L10n(
|
||||||
|
$locale['locale'],
|
||||||
|
$locale['domain'],
|
||||||
|
$locale['path'],
|
||||||
|
);
|
||||||
|
```
|
||||||
|
* smarty needs language
|
||||||
|
```php
|
||||||
|
$smarty = new CoreLibs\Template\SmartyExtend($l10n, $locale);
|
||||||
|
```
|
||||||
* admin backend also needs logger
|
* admin backend also needs logger
|
||||||
```php
|
```php
|
||||||
$cms = new CoreLibs\Admin\Backend($db, $log);
|
$cms = new CoreLibs\Admin\Backend($db, $log, $l10n, $locale);
|
||||||
```
|
```
|
||||||
* update and `$cms` or similar calls so db is in `$cms->db->...` and log are in `$cms->log->...`
|
* update and `$cms` or similar calls so db is in `$cms->db->...` and log are in `$cms->log->...`
|
||||||
* update all `config.*.php` files where needed
|
* update all `config.*.php` files where needed
|
||||||
@@ -60,6 +75,12 @@ require BASE . LIB . 'autoloader.php';
|
|||||||
```
|
```
|
||||||
**UPDATE:**
|
**UPDATE:**
|
||||||
```php
|
```php
|
||||||
|
// po langs [DEPRECAED: use LOCALE]
|
||||||
|
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
||||||
|
// po locale file
|
||||||
|
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
||||||
|
```
|
||||||
|
```php
|
||||||
// SSL host name
|
// SSL host name
|
||||||
// define('SSL_HOST', $_ENV['SSL_HOST'] ?? '');
|
// define('SSL_HOST', $_ENV['SSL_HOST'] ?? '');
|
||||||
```
|
```
|
||||||
@@ -85,6 +106,13 @@ define('CONTENT_WIDTH', '100%');
|
|||||||
define('BASE_NAME', preg_replace('/[^A-Za-z0-9]/', '', $_ENV['BASE_NAME'] ?? ''));
|
define('BASE_NAME', preg_replace('/[^A-Za-z0-9]/', '', $_ENV['BASE_NAME'] ?? ''));
|
||||||
```
|
```
|
||||||
```php
|
```php
|
||||||
|
/************* LANGUAGE / ENCODING *******/
|
||||||
|
// default lang + encoding
|
||||||
|
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
||||||
|
// default web page encoding setting
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
```
|
||||||
|
```php
|
||||||
// BAIL ON MISSING DB CONFIG:
|
// BAIL ON MISSING DB CONFIG:
|
||||||
// we have either no db selction for this host but have db config entries
|
// we have either no db selction for this host but have db config entries
|
||||||
// or we have a db selection but no db config as array or empty
|
// or we have a db selection but no db config as array or empty
|
||||||
@@ -104,6 +132,10 @@ if (
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
```php
|
```php
|
||||||
|
// remove SITE_LANG
|
||||||
|
define('SITE_LOCALE', $SITE_CONFIG[HOST_NAME]['site_locale'] ?? DEFAULT_LOCALE);
|
||||||
|
define('SITE_ENCODING', $SITE_CONFIG[HOST_NAME]['site_encoding'] ?? DEFAULT_ENCODING);
|
||||||
|
```
|
||||||
```php
|
```php
|
||||||
/************* GENERAL PAGE TITLE ********/
|
/************* GENERAL PAGE TITLE ********/
|
||||||
define('G_TITLE', $_ENV['G_TITLE'] ?? '');
|
define('G_TITLE', $_ENV['G_TITLE'] ?? '');
|
||||||
@@ -118,6 +150,15 @@ In the config then
|
|||||||
```php
|
```php
|
||||||
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
|
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
|
||||||
```
|
```
|
||||||
|
* config.host.php update
|
||||||
|
must add site_locale (site_lang + site_encoding)
|
||||||
|
remove site_lang
|
||||||
|
```php
|
||||||
|
// lang + encoding
|
||||||
|
'site_locale' => 'en_US.UTF-8',
|
||||||
|
// site language
|
||||||
|
'site_encoding' => 'UTF-8',
|
||||||
|
```
|
||||||
* copy `layout/admin/javascript/edit.jq.js`
|
* copy `layout/admin/javascript/edit.jq.js`
|
||||||
* check other javacsript files if needed (`edit.jq.js`)
|
* check other javacsript files if needed (`edit.jq.js`)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,72 @@
|
|||||||
parameters:
|
parameters:
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$result of function pg_result_error expects resource, object\\|resource\\|true given\\.$#"
|
message: "#^Parameter \\#1 \\$connection of function pg_connection_busy expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
||||||
|
count: 3
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$connection of function pg_connection_status expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$connection of function pg_get_result expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
||||||
|
count: 2
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$connection of function pg_meta_data expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$connection of function pg_send_query expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
||||||
|
count: 2
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$connection of function pg_socket expects PgSql\\\\Connection, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$connection of function pg_version expects PgSql\\\\Connection\\|null, object\\|resource given\\.$#"
|
||||||
|
count: 2
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_affected_rows expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_fetch_all expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_fetch_array expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_field_name expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_num_fields expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_num_rows expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
|
count: 1
|
||||||
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
-
|
||||||
|
message: "#^Parameter \\#1 \\$result of function pg_result_error expects PgSql\\\\Result, object\\|resource given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ parameters:
|
|||||||
# do not check old qq file uploader tests
|
# do not check old qq file uploader tests
|
||||||
- www/admin/qq_file_upload_*.php
|
- www/admin/qq_file_upload_*.php
|
||||||
# ignore all test files
|
# ignore all test files
|
||||||
- www/admin/class_test*php
|
- www/admin/class_test*.php
|
||||||
|
# extra in sub folder
|
||||||
|
- www/admin/subfolder/class_test*.php
|
||||||
- www/admin/error_test.php
|
- www/admin/error_test.php
|
||||||
# admin synlink files
|
# admin synlink files
|
||||||
- www/admin/edit_*.php
|
- www/admin/edit_*.php
|
||||||
@@ -47,9 +49,12 @@ parameters:
|
|||||||
- www/vendor
|
- www/vendor
|
||||||
# ignore errores with
|
# ignore errores with
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*
|
- # this error is ignore because of the PHP 8.0 to 8.1 change for pg_*, only for 8.0 or lower
|
||||||
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#"
|
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects resource(\\|null)?, object\\|resource(\\|bool)? given\\.$#"
|
||||||
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
|
- # this is for 8.1 or newer
|
||||||
|
message: "#^Parameter \\#1 \\$(result|connection) of function pg_\\w+ expects PgSql\\\\(Result|Connection(\\|null)?), object\\|resource given\\.$#"
|
||||||
|
path: %currentWorkingDirectory%/www/lib/CoreLibs/DB/SQL/PgSQL.php
|
||||||
# this is ignored for now
|
# this is ignored for now
|
||||||
# - '#Expression in empty\(\) is always falsy.#'
|
# - '#Expression in empty\(\) is always falsy.#'
|
||||||
# -
|
# -
|
||||||
|
|||||||
@@ -23,14 +23,12 @@ define('USE_DATABASE', true);
|
|||||||
require 'config.php';
|
require 'config.php';
|
||||||
// override ECHO ALL FALSE
|
// override ECHO ALL FALSE
|
||||||
$ECHO_ALL = true;
|
$ECHO_ALL = true;
|
||||||
// set session name
|
|
||||||
if (!defined('SET_SESSION_NAME')) {
|
|
||||||
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
|
|
||||||
}
|
|
||||||
// define log file id
|
// define log file id
|
||||||
$LOG_FILE_ID = 'classTest-admin';
|
$LOG_FILE_ID = 'classTest-admin';
|
||||||
|
$SET_SESSION_NAME = EDIT_SESSION_NAME;
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
|
|
||||||
|
$session = new CoreLibs\Create\Session($SET_SESSION_NAME);
|
||||||
$log = new CoreLibs\Debug\Logging([
|
$log = new CoreLibs\Debug\Logging([
|
||||||
'log_folder' => BASE . LOG,
|
'log_folder' => BASE . LOG,
|
||||||
'file_id' => $LOG_FILE_ID,
|
'file_id' => $LOG_FILE_ID,
|
||||||
@@ -43,14 +41,23 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
]);
|
]);
|
||||||
// db config with logger
|
// db config with logger
|
||||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
$backend = new CoreLibs\Admin\Backend($db, $log);
|
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
$l10n = new \CoreLibs\Language\L10n(
|
||||||
|
$locale['locale'],
|
||||||
|
$locale['domain'],
|
||||||
|
$locale['path'],
|
||||||
|
);
|
||||||
|
$backend = new CoreLibs\Admin\Backend($db, $log, $session, $l10n, $locale);
|
||||||
|
|
||||||
print "<html><head><title>TEST CLASS: ADMIN BACKEND</title><head>";
|
$PAGE_NAME = 'TEST CLASS: ADMIN BACKEND';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
print "<body>";
|
print "<body>";
|
||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
// set acl, from eg login acl
|
// set acl, from eg login acl
|
||||||
print "SETACL[]: " . $backend->setACL([]) . "<br>";
|
print "SETACL[]: " . $backend->setACL(['EMPTY' => 'EMPTY']) . "<br>";
|
||||||
print "ADBEDITLOG: " . $backend->adbEditLog('CLASSTEST-ADMIN', 'Some info stirng') . "<br>";
|
print "ADBEDITLOG: " . $backend->adbEditLog('CLASSTEST-ADMIN', 'Some info stirng') . "<br>";
|
||||||
print "ADBTOPMENU(0): " . \CoreLibs\Debug\Support::printAr($backend->adbTopMenu()) . "<br>";
|
print "ADBTOPMENU(0): " . \CoreLibs\Debug\Support::printAr($backend->adbTopMenu()) . "<br>";
|
||||||
print "ADBMSG: " . $backend->adbMsg('info', 'Message: %1$d', [1]) . "<br>";
|
print "ADBMSG: " . $backend->adbMsg('info', 'Message: %1$d', [1]) . "<br>";
|
||||||
|
|||||||
@@ -21,10 +21,6 @@ ob_start();
|
|||||||
define('USE_DATABASE', false);
|
define('USE_DATABASE', false);
|
||||||
// sample config
|
// sample config
|
||||||
require 'config.php';
|
require 'config.php';
|
||||||
// set session name
|
|
||||||
if (!defined('SET_SESSION_NAME')) {
|
|
||||||
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
|
|
||||||
}
|
|
||||||
// define log file id
|
// define log file id
|
||||||
$LOG_FILE_ID = 'classTest-array';
|
$LOG_FILE_ID = 'classTest-array';
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
@@ -45,9 +41,12 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
// $_array = new CoreLibs\Combined\ArrayHandler();
|
// $_array = new CoreLibs\Combined\ArrayHandler();
|
||||||
// $array_class = 'CoreLibs\Combination\ArrayHandler';
|
// $array_class = 'CoreLibs\Combination\ArrayHandler';
|
||||||
|
|
||||||
print "<html><head><title>TEST CLASS: ARRAY HANDLER</title><head>";
|
$PAGE_NAME = 'TEST CLASS: ARRAY HANDLER';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
print "<body>";
|
print "<body>";
|
||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
// recursive array search
|
// recursive array search
|
||||||
$test_array = [
|
$test_array = [
|
||||||
|
|||||||
@@ -20,10 +20,6 @@ ob_start();
|
|||||||
define('USE_DATABASE', false);
|
define('USE_DATABASE', false);
|
||||||
// sample config
|
// sample config
|
||||||
require 'config.php';
|
require 'config.php';
|
||||||
// set session name
|
|
||||||
if (!defined('SET_SESSION_NAME')) {
|
|
||||||
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
|
|
||||||
}
|
|
||||||
// define log file id
|
// define log file id
|
||||||
$LOG_FILE_ID = 'classTest-autoloader';
|
$LOG_FILE_ID = 'classTest-autoloader';
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
@@ -32,9 +28,12 @@ ob_end_flush();
|
|||||||
|
|
||||||
use CoreLibs\Convert\Byte;
|
use CoreLibs\Convert\Byte;
|
||||||
|
|
||||||
print "<html><head><title>TEST CLASS: AUTOLOADER</title><head>";
|
$PAGE_NAME = 'TEST CLASS: AUTOLOADER';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
print "<body>";
|
print "<body>";
|
||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
$bytes = 10242424;
|
$bytes = 10242424;
|
||||||
$_bytes = Byte::humanReadableByteFormat($bytes);
|
$_bytes = Byte::humanReadableByteFormat($bytes);
|
||||||
|
|||||||
@@ -21,10 +21,6 @@ ob_start();
|
|||||||
define('USE_DATABASE', false);
|
define('USE_DATABASE', false);
|
||||||
// sample config
|
// sample config
|
||||||
require 'config.php';
|
require 'config.php';
|
||||||
// set session name
|
|
||||||
if (!defined('SET_SESSION_NAME')) {
|
|
||||||
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
|
|
||||||
}
|
|
||||||
// define log file id
|
// define log file id
|
||||||
$LOG_FILE_ID = 'classTest-byte';
|
$LOG_FILE_ID = 'classTest-byte';
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
@@ -43,9 +39,12 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
]);
|
]);
|
||||||
$byte_class = 'CoreLibs\Convert\Byte';
|
$byte_class = 'CoreLibs\Convert\Byte';
|
||||||
|
|
||||||
print "<html><head><title>TEST CLASS: BYTE CONVERT</title><head>";
|
$PAGE_NAME = 'TEST CLASS: BYTE CONVERT';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
print "<body>";
|
print "<body>";
|
||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
// class
|
// class
|
||||||
$byte = 254779258;
|
$byte = 254779258;
|
||||||
|
|||||||
@@ -21,10 +21,6 @@ ob_start();
|
|||||||
define('USE_DATABASE', false);
|
define('USE_DATABASE', false);
|
||||||
// sample config
|
// sample config
|
||||||
require 'config.php';
|
require 'config.php';
|
||||||
// set session name
|
|
||||||
if (!defined('SET_SESSION_NAME')) {
|
|
||||||
define('SET_SESSION_NAME', EDIT_SESSION_NAME);
|
|
||||||
}
|
|
||||||
// define log file id
|
// define log file id
|
||||||
$LOG_FILE_ID = 'classTest-colors';
|
$LOG_FILE_ID = 'classTest-colors';
|
||||||
ob_end_flush();
|
ob_end_flush();
|
||||||
@@ -44,9 +40,12 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
]);
|
]);
|
||||||
$color_class = 'CoreLibs\Convert\Colors';
|
$color_class = 'CoreLibs\Convert\Colors';
|
||||||
|
|
||||||
print "<html><head><title>TEST CLASS: COLORS</title><head>";
|
$PAGE_NAME = 'TEST CLASS: COLORS';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
print "<body>";
|
print "<body>";
|
||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
// define a list of from to color sets for conversion test
|
// define a list of from to color sets for conversion test
|
||||||
|
|
||||||
|
|||||||
59
www/admin/class_test.config.direct.php
Normal file
59
www/admin/class_test.config.direct.php
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||||
|
$DEBUG_ALL = 1;
|
||||||
|
$PRINT_ALL = 1;
|
||||||
|
$DB_DEBUG = 1;
|
||||||
|
|
||||||
|
if ($DEBUG_ALL) {
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', false);
|
||||||
|
// sample config
|
||||||
|
require '../configs/config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-config-direct';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
$log = new CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'file_id' => $LOG_FILE_ID,
|
||||||
|
// add file date
|
||||||
|
'print_file_date' => true,
|
||||||
|
// set debug and print flags
|
||||||
|
'debug_all' => $DEBUG_ALL ?? false,
|
||||||
|
'echo_all' => $ECHO_ALL ?? false,
|
||||||
|
'print_all' => $PRINT_ALL ?? false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: CONFIG DIRECT';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
|
print "DIR: " . DIR . "<br>";
|
||||||
|
print "BASE: " . BASE . "<br>";
|
||||||
|
print "ROOT: " . ROOT . "<br>";
|
||||||
|
print "BASE NAME: " . BASE_NAME . "<br>";
|
||||||
|
echo "Config path prefix: " . $CONFIG_PATH_PREFIX . "<br>";
|
||||||
|
print "DB Name: " . DB_CONFIG_NAME . "<br>";
|
||||||
|
print "DB Config: " . \CoreLibs\Debug\Support::printAr(DB_CONFIG) . "<br>";
|
||||||
|
|
||||||
|
// error message
|
||||||
|
print $log->printErrorMsg();
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
59
www/admin/class_test.config.link.php
Normal file
59
www/admin/class_test.config.link.php
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$DEBUG_ALL_OVERRIDE = 0; // set to 1 to debug on live/remote server locations
|
||||||
|
$DEBUG_ALL = 1;
|
||||||
|
$PRINT_ALL = 1;
|
||||||
|
$DB_DEBUG = 1;
|
||||||
|
|
||||||
|
if ($DEBUG_ALL) {
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', false);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-config-link';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
$log = new CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'file_id' => $LOG_FILE_ID,
|
||||||
|
// add file date
|
||||||
|
'print_file_date' => true,
|
||||||
|
// set debug and print flags
|
||||||
|
'debug_all' => $DEBUG_ALL ?? false,
|
||||||
|
'echo_all' => $ECHO_ALL ?? false,
|
||||||
|
'print_all' => $PRINT_ALL ?? false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: CONFIG LINK';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
|
print "DIR: " . DIR . "<br>";
|
||||||
|
print "BASE: " . BASE . "<br>";
|
||||||
|
print "ROOT: " . ROOT . "<br>";
|
||||||
|
print "BASE NAME: " . BASE_NAME . "<br>";
|
||||||
|
echo "Config path prefix: " . $CONFIG_PATH_PREFIX . "<br>";
|
||||||
|
print "DB Name: " . DB_CONFIG_NAME . "<br>";
|
||||||
|
print "DB Config: " . \CoreLibs\Debug\Support::printAr(DB_CONFIG) . "<br>";
|
||||||
|
|
||||||
|
// error message
|
||||||
|
print $log->printErrorMsg();
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user