diff --git a/.travis.yml b/.travis.yml
index 57433c05..9871ba7d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,6 +22,7 @@ env:
- WP_VERSION=4.2.7 WP_MULTISITE=0
- WP_VERSION=4.3.3 WP_MULTISITE=0
- WP_VERSION=4.4.2 WP_MULTISITE=0
+ - WP_VERSION=nightly WP_MULTISITE=0
matrix:
exclude:
@@ -43,6 +44,7 @@ matrix:
env: WP_VERSION=4.2.7 WP_MULTISITE=0
allow_failures:
- php: hhvm
+ - env: WP_VERSION=nightly WP_MULTISITE=0
fast_finish: true
before_script:
diff --git a/src/Frontend/ReportList.php b/src/Frontend/ReportList.php
index 1cd2bd8e..262bf071 100644
--- a/src/Frontend/ReportList.php
+++ b/src/Frontend/ReportList.php
@@ -25,6 +25,13 @@ class ReportList
*/
private $columns;
+ /**
+ * Gibt an, ob die Tabelle in kompakter Form, also ohne Trennung zwischen den Jahren angezeigt werden soll
+ *
+ * @var bool
+ */
+ private $compact;
+
/**
* Array mit Spalten-IDs, die nicht mit einem Link zum Einsatzbericht versehen werden dürfen
*
@@ -86,6 +93,13 @@ class ReportList
*/
private static $settings;
+ /**
+ * Gibt an, ob oberhalb einer Tabelle die Überschrift mit der Jahreszahl angezeigt werden soll
+ *
+ * @var bool
+ */
+ private $showHeading;
+
/**
* Gibt an, ob nach jedem Monat eine Trennung eingefügt werden soll
*
@@ -142,11 +156,14 @@ private function constructList($reports, $args)
'linkToAddForces' => $this->options->getBoolOption('einsatzvw_list_ext_link'),
'columnsWithLink' => array('title'),
'linkEmptyReports' => true,
+ 'showHeading' => true,
+ 'compact' => false,
);
$parsedArgs = wp_parse_args($args, $defaults);
// Variablen setzen
- $this->splitMonths = (true === $parsedArgs['splitMonths']);
+ $this->compact = (bool) $parsedArgs['compact'];
+ $this->splitMonths = (bool) $parsedArgs['splitMonths'] && !$this->compact;
$this->columns = $this->utilities->sanitizeColumnsArray($parsedArgs['columns']);
$this->numberOfColumns = count($this->columns);
$this->linkToVehicles = (true === $parsedArgs['linkToVehicles']);
@@ -156,6 +173,7 @@ private function constructList($reports, $args)
$this->columnsWithLink = $this->utilities->sanitizeColumnsArray($this->columnsWithLink);
}
$this->linkEmptyReports = (true === $parsedArgs['linkEmptyReports']);
+ $this->showHeading = (bool) $parsedArgs['showHeading'];
// Berichte abarbeiten
$currentYear = null;
@@ -163,6 +181,10 @@ private function constructList($reports, $args)
$previousYear = null;
$previousMonth = null;
$monthlyCounter = 0;
+ if ($this->compact) {
+ $this->beginTable(false);
+ $this->insertTableHeader();
+ }
/** @var IncidentReport $report */
foreach ($reports as $report) {
$timeOfAlerting = $report->getTimeOfAlerting();
@@ -170,7 +192,7 @@ private function constructList($reports, $args)
$currentMonth = intval($timeOfAlerting->format('m'));
// Ein neues Jahr beginnt
- if ($currentYear != $previousYear) {
+ if (!$this->compact && $currentYear != $previousYear) {
// Wenn mindestens schon ein Jahr ausgegeben wurde
if ($previousYear != null) {
$previousMonth = null;
@@ -236,11 +258,13 @@ public function printList($reports, $args)
/**
* Beginnt eine neue Tabelle für ein bestimmtes Jahr
*
- * @param int $year Das Kalenderjahr für die Überschrift
+ * @param bool|int $year Das Kalenderjahr für die Überschrift oder false um keine Überschrift auszugeben
*/
private function beginTable($year)
{
- $this->string .= '
Einsätze '.$year.'
';
+ if ($this->showHeading && $year !== false) {
+ $this->string .= 'Einsätze '.$year.'
';
+ }
$this->string .= '';
}
diff --git a/src/Model/IncidentReport.php b/src/Model/IncidentReport.php
index 096f0fa7..f76d27cc 100644
--- a/src/Model/IncidentReport.php
+++ b/src/Model/IncidentReport.php
@@ -253,7 +253,15 @@ public function getTimeOfAlerting()
return false;
}
- $time = $this->post->post_date;
+ // Solange der Einsatzbericht ein Entwurf ist, wird die Alarmzeit in Postmeta vorgehalten
+ if ($this->isDraft()) {
+ $time = $this->getPostMeta('_einsatz_timeofalerting');
+ }
+
+ if (empty($time)) {
+ $time = $this->post->post_date;
+ }
+
return DateTime::createFromFormat('Y-m-d H:i:s', $time);
}
@@ -369,6 +377,16 @@ public function hasContent()
return !empty($this->post->post_content);
}
+ /**
+ * Gibt zurück, ob der Einsatzbericht noch im Entwurfsstadium ist
+ *
+ * @return bool
+ */
+ private function isDraft()
+ {
+ return in_array($this->post->post_status, array('draft', 'pending', 'auto-draft'));
+ }
+
/**
* Gibt zurück, ob es sich um einen Fehlalarm handelte
*
diff --git a/src/Util/Formatter.php b/src/Util/Formatter.php
index 9fdc50fe..9f94252e 100644
--- a/src/Util/Formatter.php
+++ b/src/Util/Formatter.php
@@ -79,30 +79,40 @@ private function format($post, $pattern, $tag)
switch ($tag) {
case '%title%':
- return str_replace('%title%', get_the_title($post), $pattern);
+ $replace = get_the_title($post);
+ break;
case '%date%':
- return str_replace('%date%', date_i18n($this->options->getDateFormat(), $timeOfAlerting->getTimestamp()), $pattern);
+ $replace = date_i18n($this->options->getDateFormat(), $timeOfAlerting->getTimestamp());
+ break;
case '%time%':
- return str_replace('%time%', date_i18n($this->options->getTimeFormat(), $timeOfAlerting->getTimestamp()), $pattern);
+ $replace = date_i18n($this->options->getTimeFormat(), $timeOfAlerting->getTimestamp());
+ break;
case '%duration%':
- return str_replace('%duration%', $this->utilities->getDurationString(Data::getDauer($incidentReport)), $pattern);
+ $replace = $this->utilities->getDurationString(Data::getDauer($incidentReport));
+ break;
case '%incidentType%':
- return str_replace(
- '%incidentType%',
- $this->getTypeOfIncident($incidentReport, false, false, false),
- $pattern
- );
+ $replace = $this->getTypeOfIncident($incidentReport, false, false, false);
+ break;
case '%url%':
- return str_replace('%url%', get_permalink($post->ID), $pattern);
+ $replace = get_permalink($post->ID);
+ break;
case '%location%':
- return str_replace('%location%', $incidentReport->getLocation(), $pattern);
+ $replace = $incidentReport->getLocation();
+ break;
case '%feedUrl%':
- return str_replace('%feedUrl%', get_post_type_archive_feed_link('einsatz'), $pattern);
+ $replace = get_post_type_archive_feed_link('einsatz');
+ break;
case '%number%':
- return str_replace('%number%', $incidentReport->getNumber(), $pattern);
+ $replace = $incidentReport->getNumber();
+ break;
+ case '%seqNum%':
+ $replace = $incidentReport->getSequentialNumber();
+ break;
default:
return $pattern;
}
+
+ return str_replace($tag, $replace, $pattern);
}
/**
@@ -120,6 +130,7 @@ public function getTags()
'%location%' => __('Ort des Einsatzes', 'einsatzverwaltung'),
'%feedUrl%' => __('URL zum Feed', 'einsatzverwaltung'),
'%number%' => __('Einsatznummer', 'einsatzverwaltung'),
+ '%seqNum%' => 'Laufende Nummer',
);
}
diff --git a/src/Widgets/RecentIncidents.php b/src/Widgets/RecentIncidents.php
index 6fe485f6..5bfc6b50 100644
--- a/src/Widgets/RecentIncidents.php
+++ b/src/Widgets/RecentIncidents.php
@@ -33,7 +33,10 @@ public function __construct()
parent::__construct(
'einsatzverwaltung_widget', // Base ID
'Letzte Einsätze', // Name
- array('description' => __('Zeigt die neuesten Einsätze an.', 'einsatzverwaltung'),) // Args
+ array(
+ 'description' => __('Zeigt die neuesten Einsätze an.', 'einsatzverwaltung'),
+ 'customize_selective_refresh' => true,
+ ) // Args
);
}
diff --git a/src/Widgets/RecentIncidentsFormatted.php b/src/Widgets/RecentIncidentsFormatted.php
index 10540fc6..277e204a 100644
--- a/src/Widgets/RecentIncidentsFormatted.php
+++ b/src/Widgets/RecentIncidentsFormatted.php
@@ -107,7 +107,7 @@ class RecentIncidentsFormatted extends WP_Widget
'afterContent' => ''
);
private $allowedTagsPattern = array('%title%', '%date%', '%time%', '%location%', '%duration%', '%incidentType%',
- '%url%', '%number%');
+ '%url%', '%number%', '%seqNum%');
private $allowedTagsAfter = array('%feedUrl%');
/**
@@ -120,7 +120,8 @@ public function __construct()
'Letzte Einsätze (eigenes Format)',
array(
'description' => __('Zeigt die neuesten Einsätze an.', 'einsatzverwaltung') . ' ' .
- __('Das Aussehen kann vollständig mit eigenem HTML bestimmt werden.', 'einsatzverwaltung')
+ __('Das Aussehen kann vollständig mit eigenem HTML bestimmt werden.', 'einsatzverwaltung'),
+ 'customize_selective_refresh' => true,
)
);
}
diff --git a/src/einsatzverwaltung-core.php b/src/einsatzverwaltung-core.php
index b4318794..5674ff28 100644
--- a/src/einsatzverwaltung-core.php
+++ b/src/einsatzverwaltung-core.php
@@ -31,7 +31,7 @@
*/
class Core
{
- const VERSION = '1.2.1';
+ const VERSION = '1.2.2';
const DB_VERSION = 10;
public $pluginFile;
diff --git a/src/einsatzverwaltung-data.php b/src/einsatzverwaltung-data.php
index a771945c..4ad755a0 100644
--- a/src/einsatzverwaltung-data.php
+++ b/src/einsatzverwaltung-data.php
@@ -147,6 +147,11 @@ public function savePostdata($postId, $post)
return;
}
+ // Schreibrechte prüfen
+ if (!current_user_can('edit_einsatzbericht', $postId)) {
+ return;
+ }
+
// Prüfen, ob Aufruf über das Formular erfolgt ist
if (!array_key_exists('einsatzverwaltung_nonce', $_POST) ||
!wp_verify_nonce($_POST['einsatzverwaltung_nonce'], 'save_einsatz_details')
@@ -154,11 +159,6 @@ public function savePostdata($postId, $post)
return;
}
- // Schreibrechte prüfen
- if (!current_user_can('edit_einsatzbericht', $postId)) {
- return;
- }
-
$updateArgs = array();
// Alarmzeit validieren
@@ -168,6 +168,12 @@ public function savePostdata($postId, $post)
}
if (empty($alarmzeit)) {
$alarmzeit = date_create($post->post_date);
+ }
+
+ // Solange der Einsatzbericht ein Entwurf ist, soll kein Datum gesetzt werden (vgl. wp_update_post()).
+ if (in_array($post->post_status, array('draft', 'pending', 'auto-draft'))) {
+ // Wird bis zur Veröffentlichung in Postmeta zwischengespeichert.
+ update_post_meta($postId, '_einsatz_timeofalerting', date_format($alarmzeit, 'Y-m-d H:i:s'));
} else {
$updateArgs['post_date'] = date_format($alarmzeit, 'Y-m-d H:i:s');
$updateArgs['post_date_gmt'] = get_gmt_from_date($updateArgs['post_date']);
@@ -277,6 +283,9 @@ public function onPublish($postId, $post)
$this->utilities->removePostFromCategory($postId, $category);
}
}
+
+ // Zwischenspeicher wird nur in der Entwurfsphase benötigt
+ delete_post_meta($postId, '_einsatz_timeofalerting');
}
/**
diff --git a/src/einsatzverwaltung-frontend.php b/src/einsatzverwaltung-frontend.php
index 684a620e..ce4fce18 100644
--- a/src/einsatzverwaltung-frontend.php
+++ b/src/einsatzverwaltung-frontend.php
@@ -319,6 +319,12 @@ public function addReportsToQuery($query)
} else {
$postTypes = array('post');
}
+
+ // Einsatzberichte nur zusammen mit Beiträgen abfragen
+ if (!in_array('post', $postTypes)) {
+ return;
+ }
+
$postTypes[] = 'einsatz';
$query->set('post_type', $postTypes);
diff --git a/src/einsatzverwaltung-shortcodes.php b/src/einsatzverwaltung-shortcodes.php
index 8806d48d..77e82985 100644
--- a/src/einsatzverwaltung-shortcodes.php
+++ b/src/einsatzverwaltung-shortcodes.php
@@ -68,10 +68,13 @@ public function einsatzliste($atts)
// Optionen auswerten
$rawOptions = array_map('trim', explode(',', $shortcodeParams['options']));
- $possibleOptions = array('special', 'noLinkWithoutContent');
+ $possibleOptions = array('special', 'noLinkWithoutContent', 'noHeading', 'compact');
$filteredOptions = array_intersect($possibleOptions, $rawOptions);
$showOnlySpecialReports = in_array('special', $filteredOptions);
$linkEmptyReports = !in_array('noLinkWithoutContent', $filteredOptions);
+ $showHeading = !in_array('noHeading', $filteredOptions);
+ $compact = in_array('compact', $filteredOptions);
+
$columnsWithLink = explode(',', $shortcodeParams['link']);
if (in_array('none', $columnsWithLink)) {
$columnsWithLink = false;
@@ -101,7 +104,9 @@ public function einsatzliste($atts)
'splitMonths' => ($shortcodeParams['monatetrennen'] == 'ja'),
'columns' => $this->options->getEinsatzlisteEnabledColumns(),
'columnsWithLink' => $columnsWithLink,
- 'linkEmptyReports' => $linkEmptyReports
+ 'linkEmptyReports' => $linkEmptyReports,
+ 'showHeading' => $showHeading,
+ 'compact' => $compact,
)
);
}
diff --git a/src/einsatzverwaltung.php b/src/einsatzverwaltung.php
index fc1a361f..c344fe24 100644
--- a/src/einsatzverwaltung.php
+++ b/src/einsatzverwaltung.php
@@ -3,7 +3,7 @@
Plugin Name: Einsatzverwaltung
Plugin URI: https://einsatzverwaltung.abrain.de
Description: Verwaltung und Darstellung von Einsatzberichten der Feuerwehr und anderer Hilfsorganisationen
-Version: 1.2.1
+Version: 1.2.2
Author: Andreas Brain
Author URI: https://www.abrain.de
License: GPLv2
diff --git a/src/readme.txt b/src/readme.txt
index 213bc79d..adf61b72 100644
--- a/src/readme.txt
+++ b/src/readme.txt
@@ -3,8 +3,8 @@ Contributors: abrain
Donate link: https://einsatzverwaltung.abrain.de/unterstuetzen/
Tags: Feuerwehr, Einsatz, Rettung, Rettungsdienst, THW, HiOrg, Wasserwacht, Bergrettung
Requires at least: 3.7.0
-Tested up to: 4.4
-Stable tag: 1.2.1
+Tested up to: 4.5
+Stable tag: 1.2.2
License: GPLv2
License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -70,6 +70,23 @@ Nein, mehr gibt es [hier](https://einsatzverwaltung.abrain.de/faq/).
== Changelog ==
+= 1.2.2 =
+Verbesserungen:
+
+* Einsatzliste: Trennung zwischen den Kalenderjahren kann abgeschalten werden
+* Einsatzliste: Jahresüberschrift kann ausgeblendet werden
+* Widget Letzte Einsätze (eigenes Format): Neuer Tag für laufende Nummer
+* Widgets unterstützen Selective Refresh (neues Feature in der Live-Vorschau)
+
+Fehlerbehebungen:
+
+* Einsatzberichte konnten im Frontend anderer Plugins auftauchen
+* Alarmzeit wurde bei Entwürfen falsch gespeichert
+
+Sonstiges:
+
+* Getestet mit WordPress 4.5
+
= 1.2.1 =
Verbesserungen:
diff --git a/tests/Admin/ReportEditTest.php b/tests/Admin/ReportEditTest.php
new file mode 100644
index 00000000..c08f90b4
--- /dev/null
+++ b/tests/Admin/ReportEditTest.php
@@ -0,0 +1,142 @@
+factory->user->create_and_get();
+ $userAuthor->add_cap('edit_einsatzberichte');
+
+ // Einsatzbericht anlegen
+ wp_set_current_user($userAuthor->ID);
+ $reportFactory = new ReportFactory();
+ $post = $reportFactory->create_and_get(array(
+ 'post_status' => 'auto-draft'
+ ));
+ $initialReport = new IncidentReport($post);
+ $this->assertEquals('auto-draft', get_post_status($initialReport->getPostId()));
+
+ $initialPostDate = $post->post_date;
+ /** @var DateTime $dateCreate */
+ $dateCreate = date_create($initialPostDate);
+ $dateCreate->modify('-5 minutes');
+ $timeOfAlerting = $dateCreate->format('Y-m-d H:i:s');
+
+ // Einsatzbericht als Entwurf speichern
+ $_POST = array(
+ 'einsatzverwaltung_nonce' => wp_create_nonce('save_einsatz_details'),
+ 'einsatzverwaltung_nummer' => '',
+ 'einsatzverwaltung_alarmzeit' => $timeOfAlerting,
+ 'einsatzverwaltung_einsatzende' => '',
+ 'einsatzverwaltung_einsatzort' => '',
+ 'einsatzverwaltung_einsatzleiter' => '',
+ 'einsatzverwaltung_mannschaft' => '',
+ );
+ wp_update_post(array(
+ 'ID' => $post->ID,
+ 'post_status' => 'draft',
+ ));
+
+ $report = new IncidentReport($post->ID);
+ $this->assertEquals('draft', get_post_status($report->getPostId()));
+ $this->assertEquals(
+ $timeOfAlerting,
+ $report->getTimeOfAlerting()->format('Y-m-d H:i:s'),
+ 'Alarmzeit wurde nicht im Entwurf gespeichert'
+ );
+ }
+
+ public function testTimeOfAlertingSurvivesReviewAndPublish()
+ {
+ /** @var WP_User $userAuthor */
+ $userAuthor = $this->factory->user->create_and_get();
+ $userAuthor->add_cap('edit_einsatzberichte');
+
+ /** @var WP_User $userEditor */
+ $userEditor = $this->factory->user->create_and_get();
+ $userEditor->add_cap('edit_einsatzberichte');
+ $userEditor->add_cap('edit_others_einsatzberichte');
+ $userEditor->add_cap('edit_published_einsatzberichte');
+ $userEditor->add_cap('publish_einsatzberichte');
+
+ // Einsatzbericht anlegen
+ wp_set_current_user($userAuthor->ID);
+ $reportFactory = new ReportFactory();
+ $post = $reportFactory->create_and_get(array(
+ 'post_status' => 'auto-draft'
+ ));
+ $initialPostDate = $post->post_date;
+ /** @var DateTime $dateCreate */
+ $dateCreate = date_create($initialPostDate);
+ $dateCreate->modify('-5 minutes');
+ $timeOfAlerting = $dateCreate->format('Y-m-d H:i:s');
+
+ // Einsatzbericht zur Freigabe vorlegen
+ $_POST = array(
+ 'einsatzverwaltung_nonce' => wp_create_nonce('save_einsatz_details'),
+ 'einsatzverwaltung_nummer' => '',
+ 'einsatzverwaltung_alarmzeit' => $timeOfAlerting,
+ 'einsatzverwaltung_einsatzende' => '',
+ 'einsatzverwaltung_einsatzort' => '',
+ 'einsatzverwaltung_einsatzleiter' => '',
+ 'einsatzverwaltung_mannschaft' => '',
+ );
+ wp_update_post(array(
+ 'ID' => $post->ID,
+ 'post_status' => 'pending',
+ ));
+
+ $pendingReport = new IncidentReport($post->ID);
+ $this->assertEquals('pending', get_post_status($pendingReport->getPostId()));
+ $this->assertEquals(
+ $timeOfAlerting,
+ $pendingReport->getTimeOfAlerting()->format('Y-m-d H:i:s'),
+ 'Alarmzeit wurde nicht im Entwurf gespeichert'
+ );
+
+ // Einsatzbericht freigeben
+ wp_set_current_user($userEditor->ID);
+ $_POST = array(
+ 'einsatzverwaltung_nonce' => wp_create_nonce('save_einsatz_details'),
+ 'einsatzverwaltung_nummer' => '',
+ 'einsatzverwaltung_alarmzeit' => $pendingReport->getTimeOfAlerting()->format('Y-m-d H:i:s'),
+ 'einsatzverwaltung_einsatzende' => '',
+ 'einsatzverwaltung_einsatzort' => '',
+ 'einsatzverwaltung_einsatzleiter' => '',
+ 'einsatzverwaltung_mannschaft' => '',
+ );
+ wp_update_post(array(
+ 'ID' => $post->ID,
+ 'post_status' => 'publish',
+ ));
+
+ $report = new IncidentReport($post->ID);
+ $this->assertEquals('publish', get_post_status($report->getPostId()));
+ $this->assertEquals(
+ $timeOfAlerting,
+ $report->getTimeOfAlerting()->format('Y-m-d H:i:s'),
+ 'Alarmzeit wurde nicht im veröffentlichten Bericht gespeichert'
+ );
+ }
+}
diff --git a/tests/ReportFactory.php b/tests/ReportFactory.php
new file mode 100644
index 00000000..7605ea07
--- /dev/null
+++ b/tests/ReportFactory.php
@@ -0,0 +1,80 @@
+ '',
+ 'einsatz_einsatzleiter' => '',
+ 'einsatz_einsatzort' => '',
+ 'einsatz_fehlalarm' => 0,
+ 'einsatz_mannschaft' => '',
+ 'einsatz_special' => 0,
+ );
+
+ /**
+ * ReportFactory constructor.
+ *
+ * @param object $factory Global factory that can be used to create other objects on the system
+ */
+ public function __construct($factory = null)
+ {
+ parent::__construct($factory);
+ $this->default_generation_definitions['post_type'] = 'einsatz';
+ }
+
+ /**
+ * Sorgt dafür, dass die zusätzlichen Angaben (postmeta) einen Standardwert haben
+ *
+ * @param array $args
+ * @param array|null $generation_definitions
+ * @param callable|null $callbacks
+ *
+ * @return array|\WP_Error
+ */
+ public function generate_args($args = array(), $generation_definitions = null, &$callbacks = null)
+ {
+ $generatedArgs = parent::generate_args($args, $generation_definitions, $callbacks);
+
+ if (is_wp_error($generatedArgs)) {
+ return $generatedArgs;
+ }
+
+ if (!array_key_exists('meta_input', $generatedArgs)) {
+ $generatedArgs['meta_input'] = array();
+ }
+
+ $generatedArgs['meta_input'] = wp_parse_args($generatedArgs['meta_input'], $this->defaultMetaInput);
+
+ return $generatedArgs;
+ }
+
+ /**
+ * @param $args
+ * @return int|\WP_Error
+ */
+ public function create_object($args)
+ {
+ $post = parent::create_object($args);
+
+ if (is_wp_error($post) || 0 === $post) {
+ return $post;
+ }
+
+ // meta_input ist erst ab WP 4.4 nutzbar
+ if (version_compare(get_bloginfo('version'), '4.4', '<')) {
+ foreach ($this->defaultMetaInput as $metaKey => $metaValue) {
+ add_post_meta((int) $post, $metaKey, $metaValue);
+ }
+ }
+
+ return $post;
+ }
+}
diff --git a/tests/WordPress/WPQueryTest.php b/tests/WordPress/WPQueryTest.php
new file mode 100644
index 00000000..a6c25088
--- /dev/null
+++ b/tests/WordPress/WPQueryTest.php
@@ -0,0 +1,196 @@
+factory->post->create_many(7);
+
+ // Einsatzberichte
+ $reportFactory = new ReportFactory();
+ $reports = $reportFactory->create_many(5);
+ update_post_meta($reports[0], 'einsatz_special', 1);
+ update_post_meta($reports[2], 'einsatz_special', 1);
+
+ // Beiträge eines fremden Plugins
+ $this->factory->post->create_many(3, array('post_type' => 'thirdparty'));
+ }
+
+ /**
+ * Es sollen nur WordPress-Beiträge abgerufen werden
+ */
+ public function testOnlyPosts()
+ {
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 0);
+
+ // Without post_type
+ $query = new WP_Query(array(
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(7, $query->found_posts);
+
+ // Empty post_type
+ $query1 = new WP_Query(array(
+ 'post_type' => '',
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(7, $query1->found_posts);
+
+ // With single post_type
+ $query2 = new WP_Query(array(
+ 'post_type' => 'post',
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(7, $query2->found_posts);
+
+ // With post_type array
+ $query3 = new WP_Query(array(
+ 'post_type' => array('post'),
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(7, $query3->found_posts);
+ }
+
+ /**
+ * Die Einsatzberichte sollen zwischen den Beiträgen erscheinen
+ */
+ public function testPostsWithReports()
+ {
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 1);
+
+ // Without post_type
+ $query = new WP_Query(array(
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(12, $query->found_posts);
+
+ // With single post_type
+ $query2 = new WP_Query(array(
+ 'post_type' => 'post',
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(12, $query2->found_posts);
+
+ // With post_type array
+ $query3 = new WP_Query(array(
+ 'post_type' => array('post'),
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(12, $query3->found_posts);
+ }
+
+ /**
+ * Beitragstypen anderer Plugins sollen nicht gestört werden
+ */
+ public function testOnlyThirdParty()
+ {
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 0);
+
+ // With single post_type
+ $query = new WP_Query(array(
+ 'post_type' => 'thirdparty',
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(3, $query->found_posts);
+
+ // With post_type array
+ $query2 = new WP_Query(array(
+ 'post_type' => array('thirdparty'),
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(3, $query2->found_posts);
+ }
+
+ /**
+ * Beitragstypen anderer Plugins sollen auch dann nicht gestört werden, wenn die Einsatzberichte zwischen den
+ * Beiträgen erscheinen sollen
+ */
+ public function testOnlyThirdPartyMainloop()
+ {
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 1);
+
+ // With single post_type
+ $query = new WP_Query(array(
+ 'post_type' => 'thirdparty',
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(3, $query->found_posts);
+
+ // With post_type array
+ $query2 = new WP_Query(array(
+ 'post_type' => array('thirdparty'),
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(3, $query2->found_posts);
+ }
+
+ /**
+ * Werden fremde Beitragstypen zusammen mit Beiträgen abgefragt, werden die Einsatzberichte hinzugenommen, sofern
+ * die Option, die Einsatzberichte zwischen den Beiträgen anzuzeigen, aktiviert ist
+ */
+ public function testThirdPartyWithPosts()
+ {
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 0);
+
+ // With post_type array
+ $query = new WP_Query(array(
+ 'post_type' => array('post', 'thirdparty'),
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(10, $query->found_posts);
+
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 1);
+
+ // With post_type array
+ $query2 = new WP_Query(array(
+ 'post_type' => array('post', 'thirdparty'),
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(15, $query2->found_posts);
+ }
+
+ /**
+ * Optional können nur als besonders markierte Einsatzberichte zusammen mit den Beiträgen angezeigt werden
+ */
+ public function testPostsAndOnlySpecialReports()
+ {
+ update_option('einsatzvw_show_einsatzberichte_mainloop', 1);
+ update_option('einsatzvw_loop_only_special', 1);
+
+ // Without post_type
+ $query = new WP_Query(array(
+ 'post_status' => 'publish',
+ 'posts_per_page' => '-1',
+ ));
+ $this->assertEquals(9, $query->found_posts);
+ }
+}
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index 7708ec93..699cc4b8 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -12,3 +12,5 @@
});
require $_tests_dir . '/includes/bootstrap.php';
+
+require_once 'ReportFactory.php';