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';