Explorar o código

Improve general tests + Add support for PostgreSQL testing (#2006)

* Split up restore test and General test

* Add multiple tests + add support for PostgreSQL tests

* Fix 2 minor bugs

* Use .pgpass instead source
Jaap Marcus %!s(int64=4) %!d(string=hai) anos
pai
achega
d4db3c9e21
Modificáronse 6 ficheiros con 761 adicións e 489 borrados
  1. 7 5
      .drone.yml
  2. 11 0
      bin/v-add-database
  3. 5 1
      bin/v-change-database-user
  4. 6 6
      func/db.sh
  5. 536 0
      test/restore.bats
  6. 196 477
      test/test.bats

+ 7 - 5
.drone.yml

@@ -19,16 +19,17 @@ platform:
   arch: amd64
    
 steps:
-- name: Down submodules
+- name: Download submodules
   image: alpine/git
   commands:
   - git submodule update --init --recursive
-- name: build-install
+- name: Build Hestia package and install
   commands:
   - ./src/hst_autocompile.sh --hestia --install '~localsrc'
 - name: Run Bats
   commands:
   - bats ./test/test.bats
+  - bats ./test/restore.bats
 - name: Run Check PHP
   commands: 
   - ./test/check_php.sh
@@ -57,16 +58,17 @@ platform:
   arch: amd64
    
 steps:
-- name: Down submodules
+- name: Download submodules
   image: alpine/git
   commands:
   - git submodule update --init --recursive
-- name: build-install
+- name: Build Hestia package install
   commands:
   - ./src/hst_autocompile.sh --hestia --install '~localsrc'
 - name: Run Bats
   commands:
   - bats ./test/test.bats
+  - bats ./test/restore.bats
 - name: Run Check PHP
   commands: 
   - ./test/check_php.sh
@@ -76,4 +78,4 @@ trigger:
 
 ---
 kind: signature
-hmac: 206d86147c4ee57339c4af654f073c0d2f136f591c890eb4244ccaef087c433f
+hmac: f3763c63fcebe50a2ad24dc3fb2ab3191cba15750e4dd80be82cea87466d96bc

+ 11 - 0
bin/v-add-database

@@ -58,6 +58,17 @@ is_object_unsuspended "../../../conf/$type" 'DBHOST' "$host"
 #is_charset_valid
 is_package_full 'DATABASES'
 is_password_valid
+
+if [ "$type" = "pgsql" ]; then 
+   exclude="-"
+    if [[ "$dbuser" =~ $exclude ]]; then
+        check_result $E_INVALID "invalid database user format"
+    fi
+    if [[ "$database" =~ $exclude ]]; then
+      check_result $E_INVALID "invalid database format"
+    fi
+fi
+
 dbpass="$password"
 
 # Perform verification if read-only mode is enabled

+ 5 - 1
bin/v-change-database-user

@@ -65,7 +65,11 @@ get_database_values
 
 #Fix issue #1084 with "Upper case not allowed with PGSQL"
 if [ "$TYPE" = "pgsql" ]; then
-   dbuser=$(echo $dbuser | tr '[:upper:]' '[:lower:]'); 
+   dbuser=$(echo $dbuser | tr '[:upper:]' '[:lower:]');
+   exclude="-"
+    if [[ "$dbuser" =~ $exclude ]]; then
+        check_result $E_INVALID "invalid database user format"
+    fi
 fi
 
 # Rebuild database

+ 6 - 6
func/db.sh

@@ -284,7 +284,7 @@ add_pgsql_database() {
     query="GRANT CONNECT ON DATABASE template1 to $dbuser"
     psql_query "$query" > /dev/null
 
-    query="SELECT rolpassword FROM pg_authid WHERE rolname='$dbuser';"
+    query="SELECT rolpassword FROM pg_authid WHERE rolname='$dbuser'"
     md5=$(psql_query "$query" | grep md5 | cut -f 2 -d \ )
 }
 
@@ -350,7 +350,7 @@ change_pgsql_password() {
     query="ALTER ROLE $DBUSER WITH LOGIN PASSWORD '$dbpass'"
     psql_query "$query" > /dev/null
 
-    query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER';"
+    query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER'"
     md5=$(psql_query "$query" | grep md5 |cut -f 2 -d \ )
 }
 
@@ -387,9 +387,9 @@ delete_pgsql_database() {
     psql_query "$query" > /dev/null
 
     if [ "$(grep "DBUSER='$DBUSER'" $USER_DATA/db.conf |wc -l)" -lt 2 ]; then
-        query="REVOKE CONNECT ON DATABASE template1 FROM $db_user"
+        query="REVOKE CONNECT ON DATABASE template1 FROM $DBUSER"
         psql_query "$query" > /dev/null
-        query="DROP ROLE $db_user"
+        query="DROP ROLE $DBUSER"
         psql_query "$query" > /dev/null
     fi
 }
@@ -413,9 +413,9 @@ dump_pgsql_database() {
 
     psql_dump $dump $database
 
-    query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER';"
+    query="SELECT rolpassword FROM pg_authid WHERE rolname='$DBUSER'"
     md5=$(psql_query "$query" | head -n1 | cut -f 2 -d \ )
-    pw_str="UPDATE pg_authid SET rolpassword='$md5' WHERE rolname='$DBUSER';"
+    pw_str="UPDATE pg_authid SET rolpassword='$md5' WHERE rolname='$DBUSER'"
     gr_str="GRANT ALL PRIVILEGES ON DATABASE $database to '$DBUSER'"
     echo -e "$pw_str\n$gr_str" >> $grants
 }

+ 536 - 0
test/restore.bats

@@ -0,0 +1,536 @@
+#!/usr/bin/env bats
+
+if [ "${PATH#*/usr/local/hestia/bin*}" = "$PATH" ]; then
+    . /etc/profile.d/hestia.sh
+fi
+
+load 'test_helper/bats-support/load'
+load 'test_helper/bats-assert/load'
+load 'test_helper/bats-file/load'
+
+function random() {
+head /dev/urandom | tr -dc 0-9 | head -c$1
+}
+
+function setup() {
+    # echo "# Setup_file" > &3
+    if [ $BATS_TEST_NUMBER = 1 ]; then
+        echo 'user=test-5285' > /tmp/hestia-test-env.sh
+        echo 'user2=test-5286' >> /tmp/hestia-test-env.sh
+        echo 'userbk=testbk-5285' >> /tmp/hestia-test-env.sh
+        echo 'userpass1=test-5285' >> /tmp/hestia-test-env.sh
+        echo 'userpass2=t3st-p4ssw0rd' >> /tmp/hestia-test-env.sh
+        echo 'HESTIA=/usr/local/hestia' >> /tmp/hestia-test-env.sh
+        echo 'domain=test-5285.hestiacp.com' >> /tmp/hestia-test-env.sh
+        echo 'domainuk=test-5285.hestiacp.com.uk' >> /tmp/hestia-test-env.sh
+        echo 'rootdomain=testhestiacp.com' >> /tmp/hestia-test-env.sh
+        echo 'subdomain=cdn.testhestiacp.com' >> /tmp/hestia-test-env.sh
+        echo 'database=test-5285_database' >> /tmp/hestia-test-env.sh
+        echo 'dbuser=test-5285_dbuser' >> /tmp/hestia-test-env.sh
+    fi
+    
+    source /tmp/hestia-test-env.sh
+    source $HESTIA/func/main.sh
+    source $HESTIA/conf/hestia.conf
+    source $HESTIA/func/ip.sh
+}
+
+
+
+function validate_web_domain() {
+    local user=$1
+    local domain=$2
+    local webproof=$3
+    local webpath=${4}
+    
+    refute [ -z "$user" ]
+    refute [ -z "$domain" ]
+    refute [ -z "$webproof" ]
+    
+    source $HESTIA/func/ip.sh
+    
+    run v-list-web-domain $user $domain
+    assert_success
+    
+    USER_DATA=$HESTIA/data/users/$user
+    local domain_ip=$(get_object_value 'web' 'DOMAIN' "$domain" '$IP')
+    SSL=$(get_object_value 'web' 'DOMAIN' "$domain" '$SSL')
+    domain_ip=$(get_real_ip "$domain_ip")
+    
+    if [ ! -z $webpath ]; then
+        domain_docroot=$(get_object_value 'web' 'DOMAIN' "$domain" '$CUSTOM_DOCROOT')
+        if [ -n "$domain_docroot" ] && [ -d "$domain_docroot" ]; then
+            assert_file_exist "${domain_docroot}/${webpath}"
+        else
+            assert_file_exist "${HOMEDIR}/${user}/web/${domain}/public_html/${webpath}"
+        fi
+    fi
+    
+    # Test HTTP
+    run curl --location --silent --show-error --insecure --resolve "${domain}:80:${domain_ip}" "http://${domain}/${webpath}"
+    assert_success
+    assert_output --partial "$webproof"
+    
+    # Test HTTPS
+    if [ "$SSL" = "yes" ]; then
+        run v-list-web-domain-ssl $user $domain
+        assert_success
+    
+        run curl --location --silent --show-error --insecure --resolve "${domain}:443:${domain_ip}" "https://${domain}/${webpath}"
+        assert_success
+        assert_output --partial "$webproof"
+    fi
+}
+
+#----------------------------------------------------------#
+#                     Backup / Restore                     #
+#----------------------------------------------------------#
+
+#Test backup
+#  Hestia v1.1.1 archive contains:
+#    user: hestia111
+#    web:
+#      - test.hestia.com (+SSL self-signed)
+#    dns:
+#      - test.hestia.com
+#    mail:
+#      - test.hestia.com
+#    mail acc:
+#      - testaccount@test.hestia.com
+#    db:
+#      - hestia111_db
+#    cron:
+#      - 1: /bin/true
+#  Hestia 1.3.1 archive contains (As zstd format)
+#    user: hestia131
+#    web:
+#      - test.hestia.com (+SSL self-signed)
+#    dns:
+#      - test.hestia.com
+#    mail:
+#      - test.hestia.com
+#    mail acc:
+#      - testaccount@test.hestia.com
+#    db:
+#      - hestia131_db
+#    cron:
+#      - 1: /bin/true 
+#  Vesta 0.9.8-23 archive contains:
+#    user: vesta09823
+#    web:
+#      - vesta09823.tld (+SSL self-signed)
+#    dns:
+#      - vesta09823.tld
+#    mail:
+#      - vesta09823.tld
+#    mail acc:
+#      - testaccount@vesta09823.tld
+#    db:
+#      - vesta09823_db
+#    cron:
+#      - 1: /bin/true
+#
+
+# Testing Hestia backups
+@test "Restore[1]: Hestia archive for a non-existing user" {
+    if [ -d "$HOMEDIR/$userbk" ]; then
+        run v-delete-user $userbk
+        assert_success
+        refute_output
+    fi
+
+    mkdir -p /backup
+
+    local archive_name="hestia111.2020-03-26"
+    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
+    assert_success
+
+    run v-restore-user $userbk "${archive_name}.tar"
+    assert_success
+
+    rm "/backup/${archive_name}.tar"
+}
+
+@test "Restore[1]: From Hestia [WEB]" {
+    local domain="test.hestia.com"
+    validate_web_domain $userbk $domain 'Hello Hestia'
+}
+
+@test "Restore[1]: From Hestia [DNS]" {
+    local domain="test.hestia.com"
+
+    run v-list-dns-domain $userbk $domain
+    assert_success
+
+    run nslookup $domain 127.0.0.1
+    assert_success
+}
+
+@test "Restore[1]: From Hestia [MAIL]" {
+    local domain="test.hestia.com"
+
+    run v-list-mail-domain $userbk $domain
+    assert_success
+}
+
+@test "Restore[1]: From Hestia [MAIL-Account]" {
+    local domain="test.hestia.com"
+
+    run v-list-mail-account $userbk $domain testaccount
+    assert_success
+}
+
+@test "Restore[1]: From Hestia [DB]" {
+    run v-list-database $userbk "${userbk}_db"
+    assert_success
+}
+
+@test "Restore[1]: From Hestia [CRON]" {
+    run v-list-cron-job $userbk 1
+    assert_success
+}
+
+@test "Restore[1]: From Hestia Cleanup" {
+    run v-delete-user $userbk
+    assert_success
+    refute_output
+}
+
+
+@test "Restore[2]: Hestia archive over a existing user" {
+    if [ -d "$HOMEDIR/$userbk" ]; then
+        run v-delete-user $userbk
+        assert_success
+        refute_output
+    fi
+
+    if [ ! -d "$HOMEDIR/$userbk" ]; then
+        run v-add-user $userbk $userbk test@hestia.com
+        assert_success
+    fi
+
+    mkdir -p /backup
+
+    local archive_name="hestia111.2020-03-26"
+    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
+    assert_success
+
+    run v-restore-user $userbk "${archive_name}.tar"
+    assert_success
+
+    rm "/backup/${archive_name}.tar"
+}
+
+@test "Restore[2]: From Hestia [WEB]" {
+    local domain="test.hestia.com"
+    validate_web_domain $userbk "${domain}" 'Hello Hestia'
+}
+
+@test "Restore[2]: From Hestia [DNS]" {
+    local domain="test.hestia.com"
+
+    run v-list-dns-domain $userbk $domain
+    assert_success
+
+    run nslookup $domain 127.0.0.1
+    assert_success
+}
+
+@test "Restore[2]: From Hestia [MAIL]" {
+    local domain="test.hestia.com"
+
+    run v-list-mail-domain $userbk $domain
+    assert_success
+}
+
+@test "Restore[2]: From Hestia [MAIL-Account]" {
+    local domain="test.hestia.com"
+
+    run v-list-mail-account $userbk $domain testaccount
+    assert_success
+}
+
+@test "Restore[2]: From Hestia [DB]" {
+    run v-list-database $userbk "${userbk}_db"
+    assert_success
+}
+
+@test "Restore[2]: From Hestia [CRON]" {
+    run v-list-cron-job $userbk 1
+    assert_success
+}
+
+@test "Restore[2]: From Hestia Cleanup" {
+    run v-delete-user $userbk
+    assert_success
+    refute_output
+}
+
+@test "Restore[3]: Hestia (zstd) archive for a non-existing user" {
+    if [ -d "$HOMEDIR/$userbk" ]; then
+        run v-delete-user $userbk
+        assert_success
+        refute_output
+    fi
+    
+    mkdir -p /backup
+    
+    local archive_name="hestia131.2020-12-12"
+    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
+    assert_success
+    
+    run v-restore-user $userbk "${archive_name}.tar"
+    assert_success
+    
+    rm "/backup/${archive_name}.tar"
+}
+
+@test "Restore[3]: From Hestia [WEB]" {
+    local domain="test.hestia.com"
+    validate_web_domain $userbk $domain 'Hello Hestia'
+}
+
+@test "Restore[3]: From Hestia [DNS]" {
+    local domain="test.hestia.com"
+    
+    run v-list-dns-domain $userbk $domain
+    assert_success
+    
+    run nslookup $domain 127.0.0.1
+    assert_success
+}
+
+@test "Restore[3]: From Hestia [MAIL]" {
+    local domain="test.hestia.com"
+    
+    run v-list-mail-domain $userbk $domain
+    assert_success
+}
+
+@test "Restore[3]: From Hestia [MAIL-Account]" {
+    local domain="test.hestia.com"
+    
+    run v-list-mail-account $userbk $domain testaccount
+    assert_success
+}
+
+@test "Restore[3]: From Hestia [DB]" {
+    run v-list-database $userbk "${userbk}_db"
+    assert_success
+}
+
+@test "Restore[3]: From Hestia [CRON]" {
+    run v-list-cron-job $userbk 1
+    assert_success
+}
+
+@test "Restore[3]: From Hestia Cleanup" {
+    run v-delete-user $userbk
+    assert_success
+    refute_output
+}
+
+@test "Restore[4]: Hestia (zstd) archive for a existing user" {
+    if [ -d "$HOMEDIR/$userbk" ]; then
+        run v-delete-user $userbk
+        assert_success
+        refute_output
+    fi
+
+    if [ ! -d "$HOMEDIR/$userbk" ]; then
+        run v-add-user $userbk $userbk test@hestia.com
+        assert_success
+    fi
+
+    mkdir -p /backup
+    
+    local archive_name="hestia131.2020-12-12"
+    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
+    assert_success
+    
+    run v-restore-user $userbk "${archive_name}.tar"
+    assert_success
+    
+    rm "/backup/${archive_name}.tar"
+}
+
+@test "Restore[4]: From Hestia [WEB]" {
+    local domain="test.hestia.com"
+    validate_web_domain $userbk $domain 'Hello Hestia'
+}
+
+@test "Restore[4]: From Hestia [DNS]" {
+    local domain="test.hestia.com"
+    
+    run v-list-dns-domain $userbk $domain
+    assert_success
+    
+    run nslookup $domain 127.0.0.1
+    assert_success
+}
+
+@test "Restore[4]: From Hestia [MAIL]" {
+    local domain="test.hestia.com"
+    
+    run v-list-mail-domain $userbk $domain
+    assert_success
+}
+
+@test "Restore[4]: From Hestia [MAIL-Account]" {
+    local domain="test.hestia.com"
+    
+    run v-list-mail-account $userbk $domain testaccount
+    assert_success
+}
+
+@test "Restore[4]: From Hestia [DB]" {
+    run v-list-database $userbk "${userbk}_db"
+    assert_success
+}
+
+@test "Restore[4]: From Hestia [CRON]" {
+    run v-list-cron-job $userbk 1
+    assert_success
+}
+
+@test "Restore[4]: From Hestia Cleanup" {
+    run v-delete-user $userbk
+    assert_success
+    refute_output
+}
+
+
+# Testing Vesta Backups
+@test "Restore[1]: Vesta archive for a non-existing user" {
+    if [ -d "$HOMEDIR/$userbk" ]; then
+        run v-delete-user $userbk
+        assert_success
+        refute_output
+    fi
+
+    mkdir -p /backup
+
+    local archive_name="vesta09823.2018-10-18"
+    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
+    assert_success
+
+    run v-restore-user $userbk "${archive_name}.tar"
+    assert_success
+
+    rm "/backup/${archive_name}.tar"
+}
+
+@test "Restore[1]: From Vesta [WEB]" {
+    local domain="vesta09823.tld"
+    validate_web_domain $userbk $domain 'Hello Vesta'
+}
+
+@test "Restore[1]: From Vesta [DNS]" {
+    local domain="vesta09823.tld"
+
+    run v-list-dns-domain $userbk $domain
+    assert_success
+
+    run nslookup $domain 127.0.0.1
+    assert_success
+}
+
+@test "Restore[1]: From Vesta [MAIL]" {
+    local domain="vesta09823.tld"
+
+    run v-list-mail-domain $userbk $domain
+    assert_success
+}
+
+@test "Restore[1]: From Vesta [MAIL-Account]" {
+    local domain="vesta09823.tld"
+
+    run v-list-mail-account $userbk $domain testaccount
+    assert_success
+}
+
+@test "Restore[1]: From Vesta [DB]" {
+    run v-list-database $userbk "${userbk}_db"
+    assert_success
+}
+
+@test "Restore[1]: From Vesta [CRON]" {
+    run v-list-cron-job $userbk 1
+    assert_success
+}
+
+@test "Restore[1]: From Vesta Cleanup" {
+    run v-delete-user $userbk
+    assert_success
+    refute_output
+}
+
+
+@test "Restore[2]: Vesta archive over a existing user" {
+    if [ -d "$HOMEDIR/$userbk" ]; then
+        run v-delete-user $userbk
+        assert_success
+        refute_output
+    fi
+
+    if [ ! -d "$HOMEDIR/$userbk" ]; then
+        run v-add-user $userbk $userbk test@hestia.com
+        assert_success
+    fi
+
+    mkdir -p /backup
+
+    local archive_name="vesta09823.2018-10-18"
+    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
+    assert_success
+
+    run v-restore-user $userbk "${archive_name}.tar"
+    assert_success
+
+    rm "/backup/${archive_name}.tar"
+}
+
+@test "Restore[2]: From Vesta [WEB]" {
+    local domain="vesta09823.tld"
+    validate_web_domain $userbk "${domain}" 'Hello Vesta'
+}
+
+@test "Restore[2]: From Vesta [DNS]" {
+    local domain="vesta09823.tld"
+
+    run v-list-dns-domain $userbk $domain
+    assert_success
+
+    run nslookup $domain 127.0.0.1
+    assert_success
+}
+
+@test "Restore[2]: From Vesta [MAIL]" {
+    local domain="vesta09823.tld"
+
+    run v-list-mail-domain $userbk $domain
+    assert_success
+}
+
+@test "Restore[2]: From Vesta [MAIL-Account]" {
+    local domain="vesta09823.tld"
+
+    run v-list-mail-account $userbk $domain testaccount
+    assert_success
+}
+
+@test "Restore[2]: From Vesta [DB]" {
+    run v-list-database $userbk "${userbk}_db"
+    assert_success
+}
+
+@test "Restore[2]: From Vesta [CRON]" {
+    run v-list-cron-job $userbk 1
+    assert_success
+}
+
+@test "Restore[2]: From Vesta Cleanup" {
+    run v-delete-user $userbk
+    assert_success
+    refute_output
+}

+ 196 - 477
test/test.bats

@@ -28,6 +28,9 @@ function setup() {
         echo 'subdomain=cdn.testhestiacp.com' >> /tmp/hestia-test-env.sh
         echo 'database=test-5285_database' >> /tmp/hestia-test-env.sh
         echo 'dbuser=test-5285_dbuser' >> /tmp/hestia-test-env.sh
+        echo 'pguser=test5290' >> /tmp/hestia-test-env.sh
+        echo 'pgdatabase=test5290_database' >> /tmp/hestia-test-env.sh
+        echo 'pgdbuser=test5290_dbuser' >> /tmp/hestia-test-env.sh
     fi
 
     source /tmp/hestia-test-env.sh
@@ -81,6 +84,32 @@ function validate_web_domain() {
     fi
 }
 
+function validate_headers_domain() {
+  local user=$1
+  local domain=$2
+  local webproof=$3
+  
+  refute [ -z "$user" ]
+  refute [ -z "$domain" ]
+  refute [ -z "$webproof" ]
+  
+  source $HESTIA/func/ip.sh
+  
+  run v-list-web-domain $user $domain
+  assert_success
+  
+  USER_DATA=$HESTIA/data/users/$user
+  local domain_ip=$(get_object_value 'web' 'DOMAIN' "$domain" '$IP')
+  SSL=$(get_object_value 'web' 'DOMAIN' "$domain" '$SSL')
+  domain_ip=$(get_real_ip "$domain_ip")
+  
+  # Test HTTP with  code redirect for some reasons due to 301 redirect it fails
+  curl -i --resolve "${domain}:80:${domain_ip}" "http://${domain}"
+  assert_success
+  assert_output --partial "$webproof"
+  
+}
+
 function validate_mail_domain() {
     local user=$1
     local domain=$2
@@ -161,11 +190,12 @@ function validate_webmail_domain() {
 }
 
 function validate_database(){
-    local database=$1
-    local dbuser=$2
-    local password=$3
+    local type=$1
+    local database=$2
+    local dbuser=$3
+    local password=$4
     
-    host_str=$(grep "HOST='localhost'" $HESTIA/conf/mysql.conf)
+    host_str=$(grep "HOST='localhost'" $HESTIA/conf/$type.conf)
     parse_object_kv_list "$host_str"
     if [ -z $PORT ]; then PORT=3306; fi
     
@@ -176,24 +206,33 @@ function validate_database(){
     refute [ -z "$password" ]
     
     
-    # Create an connection to verify correct username / password has been set correctly
-    tmpfile=$(mktemp /tmp/mysql.XXXXXX)
-    echo "[client]">$tmpfile
-    echo "host='$HOST'" >> $tmpfile
-    echo "user='$dbuser'" >> $tmpfile
-    echo "password='$password'" >> $tmpfile
-    echo "port='$PORT'" >> $tmpfile
-    chmod 600 $tmpfile
-    
-    sql_tmp=$(mktemp /tmp/query.XXXXXX)
-    echo "show databases;" > $sql_tmp
-    run mysql --defaults-file=$tmpfile < "$sql_tmp"
-    
-    assert_success
-    assert_output --partial "$database"
-    
-    rm -f "$sql_tmp"
-    rm -f "$tmpfile"
+    if [ "$type" = "mysql" ]; then 
+      # Create an connection to verify correct username / password has been set correctly
+      tmpfile=$(mktemp /tmp/mysql.XXXXXX)
+      echo "[client]">$tmpfile
+      echo "host='$HOST'" >> $tmpfile
+      echo "user='$dbuser'" >> $tmpfile
+      echo "password='$password'" >> $tmpfile
+      echo "port='$PORT'" >> $tmpfile
+      chmod 600 $tmpfile
+      
+      sql_tmp=$(mktemp /tmp/query.XXXXXX)
+      echo "show databases;" > $sql_tmp
+      run mysql --defaults-file=$tmpfile < "$sql_tmp"
+      
+      assert_success
+      assert_output --partial "$database"
+      
+      rm -f "$sql_tmp"
+      rm -f "$tmpfile"
+    else
+      
+      echo "*:*:*:$dbuser:$password" > /root/.pgpass
+      chmod 600 /root/.pgpass
+      run export PGPASSWORD="$password" | psql -h $HOST -U "$dbuser" -p $PORT -d "$database" --no-password  -c "\l"
+      assert_success
+      rm /root/.pgpass
+    fi
 }
 
 #----------------------------------------------------------#
@@ -479,7 +518,6 @@ function validate_database(){
     fi
 }
 
-
 #----------------------------------------------------------#
 #                         WEB                              #
 #----------------------------------------------------------#
@@ -553,10 +591,53 @@ function validate_database(){
     rm $HOMEDIR/$user/web/$domain/public_html/php-test.php
 }
 
-@test "WEB: Add ssl" {
-    cp -f $HESTIA/ssl/certificate.crt /tmp/$domain.crt
-    cp -f $HESTIA/ssl/certificate.key /tmp/$domain.key
+@test "WEB: Add redirect to www.domain.com" {
+    run v-add-web-domain-redirect $user $domain www.$domain 301
+    assert_success
+    refute_output 
+  
+    run validate_headers_domain $user $domain "301"
+}
+
+@test "WEB: Delete redirect to www.domain.com" {
+    run v-delete-web-domain-redirect $user $domain
+    assert_success
+    refute_output 
+}
+
+@test "WEB: Enable Fast CGI Cache" {
+    if [ "$WEB_SYSTEM" != "nginx" ]; then 
+      skip "FastCGI cache is not supported"
+    fi
+    
+    run v-add-fastcgi-cache $user $domain '1m' yes
+    assert_success
+    refute_output
+    
+    echo -e "<?php\necho 'Hestia Test:'.(4*3);" > $HOMEDIR/$user/web/$domain/public_html/php-test.php
+    run validate_headers_domain $user $domain "Miss"
+    run validate_headers_domain $user $domain "Hit"
+    rm $HOMEDIR/$user/web/$domain/public_html/php-test.php
+}
+
+@test "WEB: Disable Fast CGI Cache" {
+    if [ "$WEB_SYSTEM" != "nginx" ]; then 
+      skip "FastCGI cache is not supported"
+    fi
+    run v-delete-fastcgi-cache $user $domain '1m' yes
+    assert_success
+    refute_output
+}
+
 
+@test "WEB: Generate Self signed certificate" {
+    ssl=$(v-generate-ssl-cert "$domain" "info@$domain" US CA "Orange County" HestiaCP IT "mail.$domain" | tail -n1 | awk '{print $2}')
+    mv $ssl/$domain.crt /tmp/$domain.crt
+    mv $ssl/$domain.key /tmp/$domain.key
+}
+
+@test "WEB: Add ssl" {
+    # Use self signed certificates during last test
     run v-add-web-domain-ssl $user $domain /tmp
     assert_success
     refute_output
@@ -935,9 +1016,7 @@ function validate_database(){
 }
 
 @test "Mail: Add SSL to mail domain" {
-    cp -f $HESTIA/ssl/certificate.crt /tmp/$domain.crt
-    cp -f $HESTIA/ssl/certificate.key /tmp/$domain.key
-
+    # Use generated certificates during WEB Generate Self signed certificate  
     run v-add-mail-domain-ssl $user $domain /tmp
     assert_success
     refute_output
@@ -1110,519 +1189,161 @@ function validate_database(){
 #                         DB                               #
 #----------------------------------------------------------#
 
-@test "DB: Add database (mysql)" {
+@test "MYSQL: Add database" {
     run v-add-database $user database dbuser 1234 mysql
     assert_success
     refute_output
-    # validate_database database_name database_user password
-    validate_database $database $dbuser 1234
+    # validate_database mysql database_name database_user password
+    validate_database mysql $database $dbuser 1234
 }
-@test "DB: Add Database (mysql) (Duplicate)" {
+@test "MYSQL: Add Database (Duplicate)" {
     run v-add-database $user database dbuser 1234 mysql
     assert_failure $E_EXISTS
 }
 
-@test "DB: Rebuild Database (mysql)" {
+@test "MYSQL: Rebuild Database" {
     run v-rebuild-database $user $database
     assert_success
     refute_output 
 }
 
-@test "DB: Change database user password (mysql)" {
+@test "MYSQL: Change database user password" {
     run v-change-database-password $user $database 123456
     assert_success
     refute_output 
     
-    validate_database $database $dbuser 123456
+    validate_database mysql $database $dbuser 123456
 }
 
-@test "DB: Change database user (mysql)" {
+@test "MYSQL: Change database user" {
     run v-change-database-user $user $database database
     assert_success
     refute_output 
-    validate_database $database $database 123456
+    validate_database mysql $database $database 123456
 }
 
-@test "DB: Suspend database" {
+@test "MYSQL: Suspend database" {
     run v-suspend-database $user $database
     assert_success
     refute_output
 }
 
-@test "DB: Unsuspend database" {
+@test "MYSQL: Unsuspend database" {
     run v-unsuspend-database $user $database
     assert_success
     refute_output
 }
 
-@test "DB: Delete database" {
+@test "MYSQL: Delete database" {
     run v-delete-database $user $database
     assert_success
     refute_output 
 }
 
-@test "DB: Delete missing database" {
+@test "MYSQL: Delete missing database" {
     run v-delete-database $user $database
     assert_failure $E_NOTEXIST
 }
 
-#----------------------------------------------------------#
-#                     Backup / Restore                     #
-#----------------------------------------------------------#
-
-#Test backup
-#  Hestia v1.1.1 archive contains:
-#    user: hestia111
-#    web:
-#      - test.hestia.com (+SSL self-signed)
-#    dns:
-#      - test.hestia.com
-#    mail:
-#      - test.hestia.com
-#    mail acc:
-#      - testaccount@test.hestia.com
-#    db:
-#      - hestia111_db
-#    cron:
-#      - 1: /bin/true
-#  Hestia 1.3.1 archive contains (As zstd format)
-#    user: hestia131
-#    web:
-#      - test.hestia.com (+SSL self-signed)
-#    dns:
-#      - test.hestia.com
-#    mail:
-#      - test.hestia.com
-#    mail acc:
-#      - testaccount@test.hestia.com
-#    db:
-#      - hestia131_db
-#    cron:
-#      - 1: /bin/true 
-#  Vesta 0.9.8-23 archive contains:
-#    user: vesta09823
-#    web:
-#      - vesta09823.tld (+SSL self-signed)
-#    dns:
-#      - vesta09823.tld
-#    mail:
-#      - vesta09823.tld
-#    mail acc:
-#      - testaccount@vesta09823.tld
-#    db:
-#      - vesta09823_db
-#    cron:
-#      - 1: /bin/true
-#
-
-# Testing Hestia backups
-@test "Restore[1]: Hestia archive for a non-existing user" {
-    if [ -d "$HOMEDIR/$userbk" ]; then
-        run v-delete-user $userbk
-        assert_success
-        refute_output
-    fi
-
-    mkdir -p /backup
-
-    local archive_name="hestia111.2020-03-26"
-    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
-    assert_success
-
-    run v-restore-user $userbk "${archive_name}.tar"
-    assert_success
-
-    rm "/backup/${archive_name}.tar"
-}
-
-@test "Restore[1]: From Hestia [WEB]" {
-    local domain="test.hestia.com"
-    validate_web_domain $userbk $domain 'Hello Hestia'
-}
-
-@test "Restore[1]: From Hestia [DNS]" {
-    local domain="test.hestia.com"
-
-    run v-list-dns-domain $userbk $domain
-    assert_success
-
-    run nslookup $domain 127.0.0.1
-    assert_success
-}
-
-@test "Restore[1]: From Hestia [MAIL]" {
-    local domain="test.hestia.com"
-
-    run v-list-mail-domain $userbk $domain
-    assert_success
-}
-
-@test "Restore[1]: From Hestia [MAIL-Account]" {
-    local domain="test.hestia.com"
-
-    run v-list-mail-account $userbk $domain testaccount
-    assert_success
-}
-
-@test "Restore[1]: From Hestia [DB]" {
-    run v-list-database $userbk "${userbk}_db"
-    assert_success
-}
-
-@test "Restore[1]: From Hestia [CRON]" {
-    run v-list-cron-job $userbk 1
-    assert_success
-}
-
-@test "Restore[1]: From Hestia Cleanup" {
-    run v-delete-user $userbk
-    assert_success
-    refute_output
-}
-
-
-@test "Restore[2]: Hestia archive over a existing user" {
-    if [ -d "$HOMEDIR/$userbk" ]; then
-        run v-delete-user $userbk
-        assert_success
-        refute_output
-    fi
-
-    if [ ! -d "$HOMEDIR/$userbk" ]; then
-        run v-add-user $userbk $userbk test@hestia.com
-        assert_success
-    fi
-
-    mkdir -p /backup
-
-    local archive_name="hestia111.2020-03-26"
-    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
-    assert_success
-
-    run v-restore-user $userbk "${archive_name}.tar"
-    assert_success
-
-    rm "/backup/${archive_name}.tar"
-}
-
-@test "Restore[2]: From Hestia [WEB]" {
-    local domain="test.hestia.com"
-    validate_web_domain $userbk "${domain}" 'Hello Hestia'
-}
-
-@test "Restore[2]: From Hestia [DNS]" {
-    local domain="test.hestia.com"
-
-    run v-list-dns-domain $userbk $domain
-    assert_success
-
-    run nslookup $domain 127.0.0.1
-    assert_success
-}
-
-@test "Restore[2]: From Hestia [MAIL]" {
-    local domain="test.hestia.com"
-
-    run v-list-mail-domain $userbk $domain
-    assert_success
-}
-
-@test "Restore[2]: From Hestia [MAIL-Account]" {
-    local domain="test.hestia.com"
-
-    run v-list-mail-account $userbk $domain testaccount
-    assert_success
-}
-
-@test "Restore[2]: From Hestia [DB]" {
-    run v-list-database $userbk "${userbk}_db"
-    assert_success
-}
-
-@test "Restore[2]: From Hestia [CRON]" {
-    run v-list-cron-job $userbk 1
-    assert_success
-}
-
-@test "Restore[2]: From Hestia Cleanup" {
-    run v-delete-user $userbk
-    assert_success
-    refute_output
-}
-
-@test "Restore[3]: Hestia (zstd) archive for a non-existing user" {
-    if [ -d "$HOMEDIR/$userbk" ]; then
-        run v-delete-user $userbk
-        assert_success
-        refute_output
-    fi
-    
-    mkdir -p /backup
-    
-    local archive_name="hestia131.2020-12-12"
-    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
-    assert_success
-    
-    run v-restore-user $userbk "${archive_name}.tar"
-    assert_success
-    
-    rm "/backup/${archive_name}.tar"
-}
-
-@test "Restore[3]: From Hestia [WEB]" {
-    local domain="test.hestia.com"
-    validate_web_domain $userbk $domain 'Hello Hestia'
-}
-
-@test "Restore[3]: From Hestia [DNS]" {
-    local domain="test.hestia.com"
-    
-    run v-list-dns-domain $userbk $domain
-    assert_success
-    
-    run nslookup $domain 127.0.0.1
-    assert_success
-}
-
-@test "Restore[3]: From Hestia [MAIL]" {
-    local domain="test.hestia.com"
-    
-    run v-list-mail-domain $userbk $domain
-    assert_success
-}
-
-@test "Restore[3]: From Hestia [MAIL-Account]" {
-    local domain="test.hestia.com"
-    
-    run v-list-mail-account $userbk $domain testaccount
-    assert_success
-}
-
-@test "Restore[3]: From Hestia [DB]" {
-    run v-list-database $userbk "${userbk}_db"
-    assert_success
-}
-
-@test "Restore[3]: From Hestia [CRON]" {
-    run v-list-cron-job $userbk 1
-    assert_success
-}
-
-@test "Restore[3]: From Hestia Cleanup" {
-    run v-delete-user $userbk
-    assert_success
-    refute_output
-}
-
-@test "Restore[4]: Hestia (zstd) archive for a existing user" {
-    if [ -d "$HOMEDIR/$userbk" ]; then
-        run v-delete-user $userbk
-        assert_success
-        refute_output
-    fi
-
-    if [ ! -d "$HOMEDIR/$userbk" ]; then
-        run v-add-user $userbk $userbk test@hestia.com
-        assert_success
-    fi
-
-    mkdir -p /backup
-    
-    local archive_name="hestia131.2020-12-12"
-    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
-    assert_success
-    
-    run v-restore-user $userbk "${archive_name}.tar"
-    assert_success
-    
-    rm "/backup/${archive_name}.tar"
-}
-
-@test "Restore[4]: From Hestia [WEB]" {
-    local domain="test.hestia.com"
-    validate_web_domain $userbk $domain 'Hello Hestia'
-}
-
-@test "Restore[4]: From Hestia [DNS]" {
-    local domain="test.hestia.com"
-    
-    run v-list-dns-domain $userbk $domain
-    assert_success
-    
-    run nslookup $domain 127.0.0.1
-    assert_success
-}
-
-@test "Restore[4]: From Hestia [MAIL]" {
-    local domain="test.hestia.com"
-    
-    run v-list-mail-domain $userbk $domain
-    assert_success
-}
-
-@test "Restore[4]: From Hestia [MAIL-Account]" {
-    local domain="test.hestia.com"
-    
-    run v-list-mail-account $userbk $domain testaccount
-    assert_success
-}
-
-@test "Restore[4]: From Hestia [DB]" {
-    run v-list-database $userbk "${userbk}_db"
-    assert_success
-}
-
-@test "Restore[4]: From Hestia [CRON]" {
-    run v-list-cron-job $userbk 1
-    assert_success
-}
-
-@test "Restore[4]: From Hestia Cleanup" {
-    run v-delete-user $userbk
-    assert_success
-    refute_output
-}
-
-
-# Testing Vesta Backups
-@test "Restore[1]: Vesta archive for a non-existing user" {
-    if [ -d "$HOMEDIR/$userbk" ]; then
-        run v-delete-user $userbk
-        assert_success
-        refute_output
-    fi
-
-    mkdir -p /backup
-
-    local archive_name="vesta09823.2018-10-18"
-    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
-    assert_success
-
-    run v-restore-user $userbk "${archive_name}.tar"
-    assert_success
-
-    rm "/backup/${archive_name}.tar"
-}
-
-@test "Restore[1]: From Vesta [WEB]" {
-    local domain="vesta09823.tld"
-    validate_web_domain $userbk $domain 'Hello Vesta'
-}
-
-@test "Restore[1]: From Vesta [DNS]" {
-    local domain="vesta09823.tld"
-
-    run v-list-dns-domain $userbk $domain
-    assert_success
-
-    run nslookup $domain 127.0.0.1
-    assert_success
-}
-
-@test "Restore[1]: From Vesta [MAIL]" {
-    local domain="vesta09823.tld"
-
-    run v-list-mail-domain $userbk $domain
-    assert_success
+@test "PGSQL: Add database invalid user" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-add-database "$user" "database" "dbuser" "1234ABCD" "pgsql"
+  assert_failure $E_INVALID
 }
 
-@test "Restore[1]: From Vesta [MAIL-Account]" {
-    local domain="vesta09823.tld"
-
-    run v-list-mail-account $userbk $domain testaccount
-    assert_success
-}
-
-@test "Restore[1]: From Vesta [DB]" {
-    run v-list-database $userbk "${userbk}_db"
-    assert_success
-}
-
-@test "Restore[1]: From Vesta [CRON]" {
-    run v-list-cron-job $userbk 1
-    assert_success
+@test "PGSQL: Add database" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-add-user $pguser $pguser $user@hestiacp.com default "Super Test"
+  run v-add-database "$pguser" "database" "dbuser" "1234ABCD" "pgsql"
+  assert_success
+  refute_output
+  
+  validate_database pgsql $pgdatabase $pgdbuser "1234ABCD"
 }
 
-@test "Restore[1]: From Vesta Cleanup" {
-    run v-delete-user $userbk
-    assert_success
-    refute_output
+@test "PGSQL: Add Database (Duplicate)" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-add-database "$pguser" "database" "dbuser" "1234ABCD" "pgsql"
+  assert_failure $E_EXISTS
 }
 
-
-@test "Restore[2]: Vesta archive over a existing user" {
-    if [ -d "$HOMEDIR/$userbk" ]; then
-        run v-delete-user $userbk
-        assert_success
-        refute_output
-    fi
-
-    if [ ! -d "$HOMEDIR/$userbk" ]; then
-        run v-add-user $userbk $userbk test@hestia.com
-        assert_success
-    fi
-
-    mkdir -p /backup
-
-    local archive_name="vesta09823.2018-10-18"
-    run wget --quiet --tries=3 --timeout=15 --read-timeout=15 --waitretry=3 --no-dns-cache "https://hestiacp.com/testing/data/${archive_name}.tar" -O "/backup/${archive_name}.tar"
-    assert_success
-
-    run v-restore-user $userbk "${archive_name}.tar"
-    assert_success
-
-    rm "/backup/${archive_name}.tar"
+@test "PGSQL: Rebuild Database" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-rebuild-database $pguser $pgdatabase
+  assert_success
+  refute_output 
 }
 
-@test "Restore[2]: From Vesta [WEB]" {
-    local domain="vesta09823.tld"
-    validate_web_domain $userbk "${domain}" 'Hello Vesta'
+@test "PGSQL: Change database user password" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-change-database-password $pguser $pgdatabase "123456"
+  assert_success
+  refute_output 
+  
+  validate_database pgsql $pgdatabase $pgdbuser "123456"
 }
 
-@test "Restore[2]: From Vesta [DNS]" {
-    local domain="vesta09823.tld"
-
-    run v-list-dns-domain $userbk $domain
-    assert_success
-
-    run nslookup $domain 127.0.0.1
-    assert_success
+@test "PGSQL: Suspend database" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-suspend-database $pguser $pgdatabase
+  assert_success
+  refute_output
 }
 
-@test "Restore[2]: From Vesta [MAIL]" {
-    local domain="vesta09823.tld"
-
-    run v-list-mail-domain $userbk $domain
-    assert_success
+@test "PGSQL: Unsuspend database" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-unsuspend-database $pguser $pgdatabase
+  assert_success
+  refute_output
 }
 
-@test "Restore[2]: From Vesta [MAIL-Account]" {
-    local domain="vesta09823.tld"
-
-    run v-list-mail-account $userbk $domain testaccount
-    assert_success
+@test "PGSQL: Change database user" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  skip
+  run v-change-database-user $pguser $pgdatabase database
+  assert_success
+  refute_output 
+  validate_database pgsql $pgdatabase $pgdatabase 123456
 }
 
-@test "Restore[2]: From Vesta [DB]" {
-    run v-list-database $userbk "${userbk}_db"
-    assert_success
-}
 
-@test "Restore[2]: From Vesta [CRON]" {
-    run v-list-cron-job $userbk 1
-    assert_success
+@test "PGSQL: Delete database" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then  
+    skip "PostGreSQL is not installed"
+  fi
+  run v-delete-database $pguser $pgdatabase
+  assert_success
+  refute_output 
 }
 
-@test "Restore[2]: From Vesta Cleanup" {
-    run v-delete-user $userbk
-    assert_success
-    refute_output
+@test "PGSQL: Delete missing database" {
+  if [ -z "$(echo $DB_SYSTEM | grep -w "pgsql")" ]; then 
+    skip "PostGreSQL is not installed"
+  fi
+  run v-delete-database $pguser $pgdatabase
+  assert_failure $E_NOTEXIST
+  run v-delete-user $pguser
 }
 
 #----------------------------------------------------------#
 #                         System                           #
 #----------------------------------------------------------#
-
 @test "System: Set/Enable SMTP account for internal mail" {
   run v-add-sys-smtp $domain 587 STARTTLS info@$domain 1234-test noreply@$domain
   assert_success
@@ -1661,14 +1382,12 @@ function validate_database(){
 }
 
 @test "Delete user" {
-    # skip
     run v-delete-user $user
     assert_success
     refute_output
 }
 
 @test "Ip: Delete the test IP" {
-    # skip
     run v-delete-sys-ip 198.18.0.125
     assert_success
     refute_output