Align homepage and category discovery, modern widgets, admin controls, quotes, and comments with the reference theme. Remove superseded paths and add rendering and behavior coverage. Update stale asset and finance contracts; all 760 Node tests and 139 widget assertions pass.
95 lines
3.3 KiB
PHP
95 lines
3.3 KiB
PHP
<?php
|
|
/**
|
|
* Exercise the hottest comments_clauses hook without booting WordPress.
|
|
* Run with: php tests/widget-system/comment-order-behavior.php
|
|
*/
|
|
|
|
define('ABSPATH', __DIR__ . '/');
|
|
|
|
final class WP_Comment_Query {
|
|
/** @var array<string,mixed> */
|
|
public array $query_vars;
|
|
|
|
/** @param array<string,mixed> $query_vars */
|
|
public function __construct(array $query_vars) {
|
|
$this->query_vars = $query_vars;
|
|
}
|
|
}
|
|
|
|
final class AKSRT_Test_WPDB {
|
|
public string $comments = 'wp_comments';
|
|
public string $commentmeta = 'wp_commentmeta';
|
|
}
|
|
|
|
$GLOBALS['wpdb'] = new AKSRT_Test_WPDB();
|
|
$GLOBALS['aksrt_test_filters'] = [];
|
|
|
|
function add_filter(string $tag, callable $callback, int $priority = 10, int $accepted_args = 1): void {
|
|
$GLOBALS['aksrt_test_filters'][$tag][] = [$callback, $priority, $accepted_args];
|
|
}
|
|
|
|
function sanitize_key(string $key): string {
|
|
return strtolower(preg_replace('/[^a-z0-9_\-]/', '', $key) ?? '');
|
|
}
|
|
|
|
function wp_unslash($value) {
|
|
return $value;
|
|
}
|
|
|
|
function aksrt_test_apply_comments_clauses(array $clauses, WP_Comment_Query $query): array {
|
|
$filters = $GLOBALS['aksrt_test_filters']['comments_clauses'] ?? [];
|
|
usort($filters, static fn (array $a, array $b): int => $a[1] <=> $b[1]);
|
|
foreach ($filters as [$callback, $priority, $accepted_args]) {
|
|
$clauses = $callback($clauses, $query);
|
|
}
|
|
return $clauses;
|
|
}
|
|
|
|
require __DIR__ . '/../../inc/helpers/aksrt-comments.php';
|
|
|
|
$newest_args = aksrt_comments_template_query_args(['order' => 'ASC']);
|
|
if (($newest_args['order'] ?? '') !== 'DESC' || ($newest_args['orderby'] ?? '') !== 'comment_date_gmt') {
|
|
throw new RuntimeException('The newest tab must use descending comment date order regardless of the WordPress discussion setting.');
|
|
}
|
|
|
|
$_GET['aksrt_comment_order'] = 'hottest';
|
|
$hottest_args = aksrt_comments_template_query_args([]);
|
|
if (empty($hottest_args['aksrt_hottest_order']) || ($hottest_args['order'] ?? '') !== 'DESC') {
|
|
throw new RuntimeException('The hottest tab must set a descending, query-local hottest marker.');
|
|
}
|
|
unset($_GET['aksrt_comment_order']);
|
|
|
|
$base = [
|
|
'join' => '',
|
|
'where' => 'wp_comments.comment_post_ID = 42',
|
|
'orderby' => 'wp_comments.comment_date_gmt DESC',
|
|
];
|
|
|
|
$hot = aksrt_test_apply_comments_clauses($base, new WP_Comment_Query([
|
|
'post_id' => 42,
|
|
'aksrt_hottest_order' => true,
|
|
]));
|
|
|
|
if (!str_contains($hot['join'], 'LEFT JOIN wp_commentmeta AS aksrt_cm_hot')) {
|
|
throw new RuntimeException('Hottest ordering must use LEFT JOIN so comments without like metadata remain in the result.');
|
|
}
|
|
if (!str_contains($hot['orderby'], 'COALESCE(aksrt_cm_hot.meta_value, 0) AS UNSIGNED) DESC')) {
|
|
throw new RuntimeException('Hottest ordering must sort likes from high to low and treat missing metadata as zero.');
|
|
}
|
|
if (!str_contains($hot['orderby'], 'wp_comments.comment_date_gmt DESC')) {
|
|
throw new RuntimeException('Equal like counts must use newest date as the stable tie-breaker.');
|
|
}
|
|
if ($hot['where'] !== $base['where']) {
|
|
throw new RuntimeException('Hottest sorting must not alter the query scope.');
|
|
}
|
|
|
|
$ordinary = aksrt_test_apply_comments_clauses($base, new WP_Comment_Query([
|
|
'post_id' => 99,
|
|
'orderby' => 'comment_date_gmt',
|
|
]));
|
|
if ($ordinary !== $base) {
|
|
throw new RuntimeException('Queries without the hottest marker must remain unchanged.');
|
|
}
|
|
|
|
fwrite(STDOUT, "Hottest comment query behavior passed.\n");
|