Making WordPress.org

Changeset 14061


Ignore:
Timestamp:
09/18/2024 02:32:35 AM (2 years ago)
Author:
dd32
Message:

Make: PHPUnit Test Reporter: Update to v0.2 from GitHub:
https://github.com/WordPress/phpunit-test-reporter/releases/tag/v0.2.0

Props desrosj.
Fixes #7777.

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter
Files:
1 added
6 edited
1 moved

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/parts/result-set-single.php

    r14060 r14061  
    22use PTR\Display;
    33
    4 echo Display::get_display_css(); ?>
     4echo Display::get_display_css();
    55
    6 <table>
     6foreach ( $revisions as $revision ) :
     7
     8  $rev_id = (int) ltrim( $revision->post_name, 'r' );
     9?>
     10
     11<div class="ptr-test-reporter-single-revision">
     12        <a href="<?php echo esc_url( sprintf( 'https://core.trac.wordpress.org/changeset/%d', $rev_id ) ); ?>">
     13                r<?php echo $rev_id; ?>
     14        </a>: <?php echo esc_attr( apply_filters( 'the_title', $revision->post_title ) ); ?>
     15</div>
     16
     17<table class="ptr-test-reporter-table alignwide">
    718        <thead>
    819                <tr>
    9                         <th style="width:100px">Revision</th>
    10                         <th>Host</th>
    11                         <th>PHP Version</th>
     20                        <th style="width:100px">Status</th>
     21                        <th style="width:150px">PHP Version</th>
    1222                        <th>Database Version</th>
    1323                </tr>
    1424        </thead>
    1525        <tbody>
    16                 <?php
    17                 $total_cols = 5;
    18                 foreach ( $revisions as $revision ) :
    19                         $rev_id = (int) ltrim( $revision->post_name, 'r' );
    20                         ?>
    21                         <tr>
    22                                 <th colspan="<?php echo (int) $total_cols; ?>"><a href="<?php echo esc_url( sprintf( 'https://core.trac.wordpress.org/changeset/%d', $rev_id ) ); ?>">r<?php echo (int) $rev_id; ?></a>: <?php echo wp_kses_post( apply_filters( 'the_title', $revision->post_title ) ); ?></th>
    23                         </tr>
     26
    2427                        <?php
    25                         $query_args   = array(
     28                        $query_args = array(
    2629                                'posts_per_page' => $posts_per_page,
     30                                'author'         => $post_author ?? null,
    2731                                'post_type'      => 'result',
    2832                                'post_parent'    => $revision->ID,
    29                                 'orderby'        => 'post_title',
    30                                 'order'          => 'ASC',
     33                                'orderby'        => [ 'author' => 'ASC', 'env_name_clause' => 'ASC' ],
     34                                'meta_query'     => array(
     35                                        'relation' => 'OR',
     36                                        'env_name_clause' => array(
     37                                                'key'     => 'environment_name',
     38                                                'compare' => 'EXISTS',
     39                                        ),
     40                                        array(
     41                                                'key'     => 'environment_name',
     42                                                'compare' => 'NOT EXISTS',
     43                                        )
     44                                ),
    3145                        );
    3246                        $report_query = new WP_Query( $query_args );
    3347                        if ( ! empty( $report_query->posts ) ) :
     48
     49          $prev_author = null;
     50
    3451                                foreach ( $report_query->posts as $report ) :
    3552                                        $status       = 'Errored';
     
    5673                                                        )
    5774                                                );
    58                                                 if ( ! empty( $user->user_url ) ) {
    59                                                         $host .= '</a>';
    60                                                 }
    61                                                 if ( ! empty( $user->user_url ) ) {
    62                                                         $host .= '<a target="_blank" rel="nofollow" href="' . esc_url( $user->user_url ) . '">';
    63                                                 }
    64                                                 $host .= $user->display_name;
     75
     76                                                $host .= Display::get_display_reporter_name( $report->post_author );
     77
    6578                                                if ( ! empty( $user->user_url ) ) {
    6679                                                        $host .= '</a>';
     
    6881                                        }
    6982                                        ?>
     83        <?php if ( $prev_author !== $host ): ?>
     84          <tr>
     85            <td colspan="3">
     86              <?php echo wp_kses_post( $host ); ?>
     87            </td>
     88          </tr>
     89
     90        <?php endif; ?>
    7091                                <tr>
    71                                         <td><a href="<?php echo esc_url( get_permalink( $report->ID ) ); ?>" title="<?php echo esc_attr( $status_title ); ?>" class="<?php echo esc_attr( 'ptr-status-badge ptr-status-badge-' . strtolower( $status ) ); ?>"><?php echo esc_html( $status ); ?></a></td>
    72                                         <td><?php echo wp_kses_post( $host ); ?></td>
     92                                        <td>
     93                                                <a href="<?php echo esc_url( get_permalink( $report->ID ) ); ?>" title="<?php echo esc_attr( $status_title ); ?>" class="<?php echo esc_attr( 'ptr-status-badge ptr-status-badge-' . strtolower( $status ) ); ?>">
     94                                                        <?php echo esc_html( $status ); ?>
     95                                                </a>
     96                                        </td>
    7397                                        <td><?php echo esc_html( Display::get_display_php_version( $report->ID ) ); ?></td>
    7498                                        <td><?php echo esc_html( Display::get_display_mysql_version( $report->ID ) ); ?></td>
    7599                                </tr>
    76100                                        <?php
     101                            $prev_author = $host;
    77102                                endforeach;
    78103                        else :
    79104                                ?>
    80105                                <tr>
    81                                         <td></td>
    82                                         <td colspan="<?php echo (int) $total_cols - 1; ?>">
     106                                        <td colspan="3">
    83107                                                No reports for changeset.
    84108                                        </td>
    85109                                </tr>
    86110                        <?php endif; ?>
    87                 <?php endforeach; ?>
    88111        </tbody>
    89112</table>
     113<?php endforeach;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/parts/single-result.php

    r10346 r14061  
    2525                )
    2626        );
    27         if ( ! empty( $user->user_url ) ) {
    28                 $host .= '</a>';
    29         }
    30         if ( ! empty( $user->user_url ) ) {
    31                 $host .= '<a target="_blank" rel="nofollow" href="' . esc_url( $user->user_url ) . '">';
    32         }
    3327        $host .= $user->display_name;
    3428        if ( ! empty( $user->user_url ) ) {
     
    5448                <td><strong>Host</strong></td>
    5549                <td><?php echo wp_kses_post( $host ); ?></td>
     50        </tr>
     51        <tr>
     52                <td><strong>Test Date</strong></td>
     53                <td>
     54                        <?php the_date(); ?>
     55                        <?php the_time(); ?>
     56                </td>
     57        </tr>
     58        <tr>
     59                <td><strong>Execution Time</strong></td>
     60                <td>
     61                        <?php echo esc_html( Display::get_display_time( $report->ID ) ); ?>
     62                </td>
     63        </tr>
     64        <tr>
     65                <td><strong>Environment Name</strong></td>
     66                <td>
     67                        <?php echo esc_html( Display::get_display_environment_name( $report->ID ) ); ?>
     68                </td>
    5669        </tr>
    5770        <tr>
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/phpunit-test-reporter.php

    r11328 r14061  
    88 * Text Domain:     ptr
    99 * Domain Path:     /languages
    10  * Version:         0.1.3
     10 * Version:         0.2.0
    1111 * License:         GPL v3
    1212 *
     
    3030add_action( 'the_content', array( 'PTR\Display', 'filter_the_content' ) );
    3131add_action( 'rest_api_init', array( 'PTR\RestAPI', 'register_routes' ) );
    32 
    3332add_action( 'load-edit.php', 'ptr_load_edit_php' );
    3433
     
    9493        return ob_get_clean();
    9594}
     95
     96/**
     97 * Counts the number of failing or passing test reports for a revision.
     98 *
     99 * @param int    $revision_parent_id The current revision's post ID.
     100 * @param string $status             The status term slug to count.
     101 *
     102 * @return int The number of reports for the given revision.
     103 */
     104function ptr_count_test_results( $revision_parent_id, $status = 'passed' ) {
     105        $report_query = new WP_Query(
     106                array(
     107                        'post_type'      => 'result',
     108                        'post_parent'    => $revision_parent_id,
     109                        'fields'         => 'ids',
     110                        'posts_per_page' => 1,
     111                        'tax_query'      => array(
     112                                array(
     113                                        'taxonomy'   => 'report-result',
     114                                        'terms'      => $status,
     115                                        'field'      => 'slug',
     116                                ),
     117                        )
     118                )
     119        );
     120
     121        if ( ! $report_query->have_posts() ) {
     122                return 0;
     123        }
     124
     125        return $report_query->found_posts;
     126}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/readme.txt

    r10290 r14061  
    11=== PHPUnit Test Reporter ===
    2 Contributors: octalmage, danielbachhuber, wpamitkumar, mikeschroder, pfefferle
     2Contributors: octalmage, danielbachhuber, wpamitkumar, kirasong, pfefferle, desrosj, crixu
    33Tags: phpunit
    44Requires at least: 4.7
    55Tested up to: 5.5
    6 Stable tag: 0.1.3
     6Stable tag: 0.2.0
    77License: GPLv3
    88License URI: http://www.gnu.org/licenses/gpl-3.0.html
     
    4545* Include errors along with failures on the error report page ([PR](https://github.com/WordPress/phpunit-test-reporter/pull/84)).
    4646* Change to `integer` built-in type for `commit` field, following updates in WordPress 5.5.
     47
     48
     49= 0.2.0 (September 17th, 2024) =
     50* Prevent invalid HTML markup on test result pages.
     51* Add a custom Post_List_Table for the results post type that lacks inline edit/quick edit.
     52* Don't use _get_list_table() as that create the object and triggers some queries. Including the file directly works just as well.
     53* Allow for multiple reports per commit for the same test bot.
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/src/class-content-model.php

    r9884 r14061  
    4343                        )
    4444                );
     45
     46                register_taxonomy(
     47                        'php-version',
     48                        array( 'result' ),
     49                        array(
     50                                'labels'       => array(
     51                                        'name'          => __( 'PHP Versions', 'ptr' ),
     52                                        'singular_name' => __( 'PHP Version', 'ptr' ),
     53                                ),
     54                                'hierarchical'               => false,
     55                                'public'                     => false,
     56                                'show_ui'                    => true,
     57                                'show_admin_column'          => true,
     58                                'show_in_nav_menus'          => false,
     59                                'show_tagcloud'              => false,
     60                                'show_in_rest'               => true,
     61                        )
     62                );
     63
     64                register_taxonomy(
     65                        'db-version',
     66                        array( 'result' ),
     67                        array(
     68                                'labels'       => array(
     69                                        'name'          => __( 'Database Versions', 'ptr' ),
     70                                        'singular_name' => __( 'Database Version', 'ptr' ),
     71                                ),
     72                                'hierarchical'               => false,
     73                                'public'                     => false,
     74                                'show_ui'                    => true,
     75                                'show_admin_column'          => true,
     76                                'show_in_nav_menus'          => false,
     77                                'show_tagcloud'              => false,
     78                                'show_in_rest'               => true,
     79                        )
     80                );
     81
     82                register_taxonomy(
     83                        'report-result',
     84                        array( 'result' ),
     85                        array(
     86                                'labels'       => array(
     87                                        'name'          => __( 'Result Status', 'ptr' ),
     88                                        'singular_name' => __( 'Result Status', 'ptr' ),
     89                                ),
     90                                'hierarchical'               => false,
     91                                'public'                     => false,
     92                                'show_ui'                    => true,
     93                                'show_admin_column'          => true,
     94                                'show_in_nav_menus'          => false,
     95                                'show_tagcloud'              => false,
     96                                'show_in_rest'               => true,
     97                        )
     98                );
    4599        }
    46100
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/src/class-display.php

    r9884 r14061  
    7575                } else {
    7676                        $content = ptr_get_template_part(
    77                                 'result-set',
     77                                'result-set-single',
    7878                                array(
    7979                                        'posts_per_page' => 500,
     
    9393         */
    9494        public static function render_results( $atts ) {
    95 
    96                 $output     = '';
    97                 $query_args = array(
    98                         'posts_per_page' => 3,
     95                $current_user = null;
     96                $output       = '';
     97                $query_args   = array(
     98                        'posts_per_page' => 20,
    9999                        'post_type'      => 'result',
    100100                        'post_parent'    => 0,
     
    102102                        'order'          => 'DESC',
    103103                );
    104                 $paged      = isset( $_GET['rpage'] ) ? (int) $_GET['rpage'] : 0;
     104                $paged        = isset( $_GET['rpage'] ) ? (int) $_GET['rpage'] : 0;
    105105                if ( $paged ) {
    106106                        $query_args['paged'] = $paged;
     
    118118                }
    119119                $output .= self::get_display_css();
    120                 if ( $paged <= 1 ) {
     120
     121                if ($paged <= 1) {
    121122                        $output .= self::get_reporter_avatars();
    122123                }
     124
    123125                $output .= ptr_get_template_part(
    124                         'result-set',
    125                         array(
    126                                 'posts_per_page' => 50,
    127                                 'revisions'      => $rev_query->posts,
    128                         )
     126                                'result-set-all',
     127                                array(
     128                                                'revisions' => $rev_query->posts,
     129                                )
    129130                );
     131
    130132                ob_start();
    131133                self::pagination( $rev_query );
     
    143145                ?>
    144146                <style>
    145                         a.ptr-status-badge {
    146                                 color: #FFF;
     147                        .ptr-status-badge {
     148                                color: #fff !important;
     149                                text-decoration: none !important;
    147150                                display: inline-block;
    148151                                padding-left: 8px;
     
    153156                                font-weight: normal;
    154157                        }
    155                         a.ptr-status-badge-passed {
     158                        .ptr-status-badge-passed {
    156159                                background-color: #39BC00;
    157160                        }
    158                         a.ptr-status-badge-failed {
     161                        .ptr-status-badge-failed {
    159162                                background-color: #CD543A;
    160163                        }
    161                         a.ptr-status-badge-errored {
     164                        .ptr-status-badge-errored {
    162165                                background-color: #909090;
    163166                        }
     
    170173                        .pagination-centered ul.pagination li {
    171174                                display: inline-block;
     175                                margin: 0 5px;
    172176                        }
    173177                        .pagination-centered ul.pagination li a {
    174178                                cursor: pointer;
     179                        }
     180                        .ptr-test-reporter-table th {
     181                                text-align: center;
     182                        }
     183                        .ptr-test-reporter-table td {
     184                                text-align: center;
     185                        }
     186                        .ptr-test-reporter-table td[colspan] {
     187                                text-align: left;
    175188                        }
    176189                        .ptr-test-reporter-list {
     
    194207                                margin-top: 6px;
    195208                                margin-bottom: 6px;
     209                                text-transform: none;
    196210                        }
    197211                        .ptr-test-reporter-list.ptr-test-reporter-inactive li h5.avatar-name {
     
    239253                if ( ! empty( $all_time_reporters ) ) {
    240254                        $all_time_reporters = array_map( 'intval', $all_time_reporters );
    241                         $output            .= '<h4>Registered, but no reports in >25 Revisions</h4>' . PHP_EOL;
    242255                        $users              = get_users(
    243256                                array(
     
    251264                                }
    252265                        }
     266                        if ( ! empty( $users ) ) {
     267                                $output .= '<h4>Registered, but no reports in >25 Revisions</h4>' . PHP_EOL;
     268                        }
    253269                        $output .= self::get_user_list( $users, 'inactive' );
    254270                }
     
    293309                        return '';
    294310                }
    295                 $minutes = floor( ( (int) $results['time'] / 60 ) % 60 );
    296                 $seconds = (int) $results['time'] % 60;
     311                $minutes = floor( ( (int) ( $results['time'] / 60 ) )% 60 );
     312                $seconds = ( ( (int) $results['time'] ) % 60 );
    297313                return "{$minutes}m {$seconds}s";
    298314        }
     
    307323                $php_version = 'Unknown';
    308324                $env         = get_post_meta( $report_id, 'env', true );
     325
    309326                if ( ! empty( $env['php_version'] ) ) {
    310327                        $php_version = 'PHP ' . $env['php_version'];
     
    326343                        $mysql_version = $bits[0];
    327344                }
     345
    328346                return $mysql_version;
     347        }
     348
     349        /**
     350         * Get the environment name for display
     351         *
     352         * @param integer $report_id Report ID.
     353         * @return string
     354         */
     355        public static function get_display_environment_name( $report_id ) {
     356                $env_name = get_post_meta( $report_id, 'environment_name', true );
     357
     358                if ( ! empty( $env_name ) ) {
     359                        return esc_html( $env_name );
     360                }
     361
     362                return 'Unknown';
     363        }
     364
     365        /**
     366         * Get the test reporter's display name.
     367         *
     368         * @param integer $reporter_id Reporter's user ID.
     369         * @return string
     370         */
     371        public static function get_display_reporter_name( $reporter_id ) {
     372                $reporter = new \WP_User( $reporter_id );
     373
     374                if ( empty( $reporter->display_name ) ) {
     375                        return esc_html( $reporter->display_name );
     376                }
     377
     378                return $reporter->user_nicename;
    329379        }
    330380
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/phpunit-test-reporter/src/class-restapi.php

    r10290 r14061  
    114114                }
    115115
     116                $env = isset( $parameters['env'] ) ? json_decode( $parameters['env'], true ) : array();
     117
     118                $php_version = '';
     119                if ( isset( $env['php_version'] ) ) {
     120                        $parts = explode( '.', $env['php_version'] );
     121                        $php_version = $parts[0] . '.' . $parts[1];
     122                }
     123
     124                $db_version = ! empty( $parameters['mysql_version'] ) ? $parameters['mysql_version'] : 'Unknown';
     125                $env_name   = ! empty( $env['label'] ) ? wp_kses( $env['label'], [] ) : '';
     126
    116127                $current_user = wp_get_current_user();
    117 
    118                 $args = array(
     128                $tax_query    = [
     129                        'relation' => 'AND',
     130                ];
     131
     132                if ( $php_version ) {
     133                        $tax_query[] = array(
     134                                'taxonomy' => 'php-version',
     135                                'terms'    => [ $php_version ],
     136                                'field'    => 'name',
     137                        );
     138                }
     139
     140                if ( $db_version ) {
     141                        $tax_query[] = array(
     142                                'taxonomy' => 'db-version',
     143                                'terms'    => [ $db_version ],
     144                                'field'    => 'name',
     145                        );
     146                }
     147
     148                $meta_query = [];
     149
     150                if ( $env_name ) {
     151                        $meta_query[] = array(
     152                                'key'   => 'environment_name',
     153                                'value' => $env_name,
     154                        );
     155                }
     156
     157                // Check to see if the test result already exist.
     158                $results = get_posts( array(
    119159                        'post_parent' => $parent_id,
    120160                        'post_type'   => 'result',
    121161                        'numberposts' => 1,
    122162                        'author'      => $current_user->ID,
    123                 );
    124 
    125                 // Check to see if the test result already exist.
    126                 $results = get_posts( $args );
     163                        'tax_query'   => $tax_query,
     164                        'meta_query'  => $meta_query,
     165                ) );
     166
    127167                if ( $results ) {
    128168                        $post_id = $results[0]->ID;
    129169                } else {
    130                         $results = array(
    131                                 'post_title'   => $current_user->user_login . ' - ' . $slug,
     170                        $post_title = $current_user->user_login . ' - ' . $slug;
     171
     172                        if ( $env_name ) {
     173                                $post_title .= ' - ' . $env_name;
     174                        }
     175
     176                        if ( $php_version ) {
     177                                $post_title .= ' - ' . $php_version;
     178                        }
     179
     180                        if ( $db_version ) {
     181                                $post_title .= ' - ' . $db_version;
     182                        }
     183
     184                        $args = array(
     185                                'post_title'   => $post_title,
    132186                                'post_content' => '',
    133187                                'post_status'  => 'publish',
     
    138192
    139193                        // Store the results.
    140                         $post_id = wp_insert_post( $results, true );
     194                        $post_id = wp_insert_post( $args, true );
    141195                }
    142196
     
    145199                }
    146200
     201                wp_set_object_terms( $post_id, array( $php_version ), 'php-version' );
     202                wp_set_object_terms( $post_id, array( $db_version ), 'db-version' );
     203
    147204                $env     = isset( $parameters['env'] ) ? json_decode( $parameters['env'], true ) : array();
    148205                $results = isset( $parameters['results'] ) ? json_decode( $parameters['results'], true ) : array();
     
    150207                update_post_meta( $post_id, 'env', $env );
    151208                update_post_meta( $post_id, 'results', $results );
     209                update_post_meta( $post_id, 'environment_name', $env_name );
     210
     211                $outcome = 'Unknown';
     212
     213                if ( ! empty( $results['failures'] ) ) {
     214                        $outcome = 'Failed';
     215                } elseif ( ! empty( $results['errors'] ) ) {
     216                        $outcome = 'Errored';
     217                } else {
     218                        $outcome = 'Passed';
     219                }
     220
     221                wp_set_object_terms( $post_id, $outcome, 'report-result' );
    152222
    153223                self::maybe_send_email_notifications( $parent_id );
     
    167237
    168238                return $response;
     239        }
     240
     241        private static function get_new_failures( $post_id ) {
     242                $p         = get_post( $post_id );
     243                $parent_id = $p->post_parent;
     244
     245                $post_terms = wp_get_object_terms( $post_id, array( 'php-version', 'db-version' ) );
     246
     247                if ( is_wp_error( $post_terms ) ) {
     248                        return [];
     249                }
     250
     251                $tax_query  = [];
     252                $meta_query = [];
     253
     254                foreach ( $post_terms as $term ) {
     255                        if ( 'php-version' === $term['taxonomy'] ) {
     256                                $tax_query[] = array(
     257                                        'taxonomy' => 'php-version',
     258                                        'terms'    => [ $term['term_id'] ],
     259                                );
     260                        }
     261
     262                        if ( 'db-version' === $term['taxonomy'] ) {
     263                                $tax_query[] = array(
     264                                        'taxonomy' => 'db-version',
     265                                        'terms'    => [ $term['term_id'] ],
     266                                );
     267                        }
     268                }
     269
     270                $env_name = get_post_meta( $post_id, 'environment_name', true );
     271
     272                if ( ! empty( $env_name ) ) {
     273                        $meta_query [] = array(
     274                                'key'   => 'environment_name',
     275                                'value' => $env_name,
     276                        );
     277                }
     278
     279                $previous_results = get_posts( array(
     280                        'post_parent__not_in' => [ $parent_id ],
     281                        'post_type'           => 'result',
     282                        'numberposts'         => 1,
     283                        'author'              => $p->post_author,
     284                        'tax_query'           => $tax_query,
     285                        'meta_query'          => $meta_query,
     286                ) );
     287
     288                $new_failures      = [];
     289                $current_failures  = self::get_failures( $post_id );
     290                $previous_failures = [];
     291
     292                if ( ! empty( $previous_results ) )  {
     293                        $previous_failures = self::get_failures( $previous_results[0]->ID );
     294                }
     295
     296                // Find new failures that didn't exist in the previous run.
     297
     298                foreach( $current_failures as $test_suite => $test_cases ) {
     299                        foreach( $test_cases as $test_case ) {
     300                                if (
     301                                  ! isset( $previous_failures[ $test_suite] ) ||
     302                                  ! in_array( $test_case, $previous_failures[ $test_suite ] )
     303                                ) {
     304                                        $new_failures[] = "$test_suite::$test_case";
     305                                }
     306                        }
     307                }
     308
     309                return $new_failures;
     310        }
     311
     312        private static function get_failures( $post_id ) {
     313                $results = get_post_meta( $post_id, 'results', true );
     314                if ( empty( $results['failures'] ) && empty( $results['errors'] ) ) {
     315                        return [];
     316                }
     317
     318                $failures = [];
     319
     320                foreach ( $results['testsuites'] as $suite_name => $testsuite ) {
     321                        $failures[ $suite_name ] = array_keys( $testsuite['testcases'] );
     322                }
     323
     324                return $failures;
    169325        }
    170326
     
    205361                                continue;
    206362                        }
     363
    207364                        // If the test result is failed and we haven't yet sent an
    208365                        // email notification, then let the reporter know.
    209                         if ( self::is_failed_result( $result )
    210                                 && ! get_post_meta( $result->ID, 'ptr_reported_failure', true ) ) {
     366                        if (
     367                          self::is_failed_result( $result )     &&
     368                          ! get_post_meta( $result->ID, 'ptr_reported_failure', true )
     369                        ) {
     370                                $new_failures = self::get_new_failures( $result->ID );
     371
     372                                if ( empty( $new_failures ) ) {
     373                                        continue;
     374                                }
     375
    211376                                $user = get_user_by( 'id', $result->post_author );
    212                                 if ( $user ) {
    213                                         $subject = '[Host Test Results] Test failure for ' . $result->post_name;
    214                                         $body    = 'Hi there,' . PHP_EOL . PHP_EOL
    215                                                 . "We've detected a WordPress PHPUnit test failure on your hosting environment. Please review when you have a moment: "
    216                                                 . get_permalink( $result->ID ) . PHP_EOL . PHP_EOL
    217                                                 . 'Thanks,' . PHP_EOL . PHP_EOL
    218                                                 . 'WordPress.org Hosting Community';
    219                                         wp_mail( $user->user_email, $subject, $body );
    220                                         update_post_meta( $result->ID, 'ptr_reported_failure', true );
     377                                if ( ! $user ) {
     378                                        continue;
    221379                                }
     380
     381                                $subject = '[Host Test Results] Test failure for ' . $result->post_name;
     382                                $body    = 'Hi there,' . PHP_EOL . PHP_EOL
     383                                        . "We've detected a new WordPress PHPUnit test failure on your hosting environment. Please review when you have a moment: "
     384                                        . get_permalink( $result->ID ) . PHP_EOL . PHP_EOL
     385                                        . 'New failures:' . PHP_EOL . PHP_EOL
     386                                        . implode( PHP_EOL, $new_failures ) . PHP_EOL . PHP_EOL
     387                                        . 'Thanks,' . PHP_EOL . PHP_EOL
     388                                        . 'WordPress.org Hosting Community';
     389
     390                                wp_mail( $user->user_email, $subject, $body );
     391                                update_post_meta( $result->ID, 'ptr_reported_failure', true );
    222392                        }
    223393                }
     
    228398         * Whether or not a given result is a failed result.
    229399         *
    230          * @param WP_Post $post Result post object.
     400         * @param \WP_Post $post Result post object.
    231401         * @return boolean
    232402         */
Note: See TracChangeset for help on using the changeset viewer.