From 72df1995bd052c8d81544ba86f5a2f7580ec72d3 Mon Sep 17 00:00:00 2001
From: Marc Egger <marc.egger@uzh.ch>
Date: Tue, 6 Oct 2020 14:25:08 +0200
Subject: [PATCH] Fix Unittests: add index to backup file if it already exists

---
 extension/Classes/Core/Form/FormAsFile.php    | 14 +++++++----
 .../Classes/Core/Report/ReportAsFile.php      | 13 +++++++---
 extension/Tests/Readme.md                     | 24 +++++++++++++++++++
 3 files changed, 44 insertions(+), 7 deletions(-)
 create mode 100644 extension/Tests/Readme.md

diff --git a/extension/Classes/Core/Form/FormAsFile.php b/extension/Classes/Core/Form/FormAsFile.php
index 958af1bf1..2e31b9726 100644
--- a/extension/Classes/Core/Form/FormAsFile.php
+++ b/extension/Classes/Core/Form/FormAsFile.php
@@ -584,7 +584,7 @@ class FormAsFile
         }
         return $jsonFileNames = array_reduce($files, function ($result, $file) {
             $fileInfo = pathinfo($file);
-            if ($fileInfo['extension'] === 'json') {
+            if (array_key_exists('extension', $fileInfo) && $fileInfo['extension'] === 'json') {
                 $result[] = $fileInfo['filename'];
             }
             return $result;
@@ -681,10 +681,16 @@ class FormAsFile
             }
         }
 
-        // throw exception if backup file exists
         $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$tag.json");
-        if (file_exists($cwdToBackupFile)) {
-            Thrower::userFormException('Error while trying to backup form file.', "Backup file already exists: $cwdToBackupFile");
+
+        // add index to filename if backup file with current timestamp already exists
+        $index = 1;
+        while (file_exists($cwdToBackupFile)) {
+            $cwdToBackupFile = Path::join($cwdToBackup, $formName . '.' . date('YmdHis') . ".$index.$tag.json");
+            $index ++;
+            if ($index > 100) {
+                Thrower::userFormException('Error while trying to backup form file.', 'Infinite loop.');
+            }
         }
         return $cwdToBackupFile;
     }
diff --git a/extension/Classes/Core/Report/ReportAsFile.php b/extension/Classes/Core/Report/ReportAsFile.php
index 4b9c44f17..d6d9ab993 100644
--- a/extension/Classes/Core/Report/ReportAsFile.php
+++ b/extension/Classes/Core/Report/ReportAsFile.php
@@ -215,11 +215,18 @@ class ReportAsFile
             }
         }
 
-        // throw exception if backup file exists
         $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".json");
-        if (file_exists($cwdToBackupFile)) {
-            Thrower::userFormException('Error while trying to backup report file.', "Backup file already exists: $cwdToBackupFile");
+
+        // add index to filename if backup file with current timestamp already exists
+        $index = 1;
+        while (file_exists($cwdToBackupFile)) {
+            $cwdToBackupFile = Path::join($cwdToBackup, basename($cwdToReportFile, REPORT_FILE_EXTENSION) . '.' . date('YmdHis') . ".$index.json");
+            $index ++;
+            if ($index > 100) {
+                Thrower::userFormException('Error while trying to backup report file.', 'Infinite loop.');
+            }
         }
+
         return $cwdToBackupFile;
     }
 
diff --git a/extension/Tests/Readme.md b/extension/Tests/Readme.md
new file mode 100644
index 000000000..3b973c2e0
--- /dev/null
+++ b/extension/Tests/Readme.md
@@ -0,0 +1,24 @@
+
+# QFQ Tests
+
+## PhpUnit
+
+### Run unit tests from CLI:
+
+Make sure dev dependencies are installed:
+```shell script
+# in extension directory
+composer update --dev
+```
+
+Run all tests:
+```shell script
+# in extension directory
+vendor/bin/phpunit --configuration phpunit.xml
+```
+
+Run single test:
+```shell script
+# in extension directory
+vendor/bin/phpunit --configuration phpunit.xml --filter <test_name>
+```
-- 
GitLab