1*21913a6dSAnna Dabrowska<?php 2*21913a6dSAnna Dabrowska 3*21913a6dSAnna Dabrowskanamespace dokuwiki\plugin\acknowledge\test; 4*21913a6dSAnna Dabrowska 5*21913a6dSAnna Dabrowskause DokuWikiTest; 6*21913a6dSAnna Dabrowska 7*21913a6dSAnna Dabrowska/** 8*21913a6dSAnna Dabrowska * Tests for the acknowledgement statistics aggregation 9*21913a6dSAnna Dabrowska * (helper_plugin_acknowledge::getStatistics). 10*21913a6dSAnna Dabrowska * 11*21913a6dSAnna Dabrowska * Verifies the per-namespace and wiki-wide completion counts, @group expansion, 12*21913a6dSAnna Dabrowska * and the current-vs-outdated semantics. 13*21913a6dSAnna Dabrowska * 14*21913a6dSAnna Dabrowska * @group plugin_acknowledge 15*21913a6dSAnna Dabrowska * @group plugins 16*21913a6dSAnna Dabrowska */ 17*21913a6dSAnna Dabrowskaclass StatsTest extends DokuWikiTest 18*21913a6dSAnna Dabrowska{ 19*21913a6dSAnna Dabrowska /** @var array */ 20*21913a6dSAnna Dabrowska protected $pluginsEnabled = ['acknowledge', 'sqlite']; 21*21913a6dSAnna Dabrowska 22*21913a6dSAnna Dabrowska /** @var \helper_plugin_acknowledge */ 23*21913a6dSAnna Dabrowska protected $helper; 24*21913a6dSAnna Dabrowska 25*21913a6dSAnna Dabrowska public static function setUpBeforeClass(): void 26*21913a6dSAnna Dabrowska { 27*21913a6dSAnna Dabrowska parent::setUpBeforeClass(); 28*21913a6dSAnna Dabrowska /** @var \auth_plugin_authplain $auth */ 29*21913a6dSAnna Dabrowska global $auth; 30*21913a6dSAnna Dabrowska $auth->createUser('max', 'none', 'max', 'max@example.com', ['super']); 31*21913a6dSAnna Dabrowska $auth->createUser('regular', 'none', 'regular', 'regular@example.com', ['user']); 32*21913a6dSAnna Dabrowska } 33*21913a6dSAnna Dabrowska 34*21913a6dSAnna Dabrowska public function setUp(): void 35*21913a6dSAnna Dabrowska { 36*21913a6dSAnna Dabrowska parent::setUp(); 37*21913a6dSAnna Dabrowska $this->helper = plugin_load('helper', 'acknowledge'); 38*21913a6dSAnna Dabrowska 39*21913a6dSAnna Dabrowska $db = $this->helper->getDB(); 40*21913a6dSAnna Dabrowska 41*21913a6dSAnna Dabrowska // pages across two top-level namespaces (lastmod 1000), incl. a sub-namespace page 42*21913a6dSAnna Dabrowska // that must roll up into its top-level namespace, plus a tracked page without assignees 43*21913a6dSAnna Dabrowska $db->query( 44*21913a6dSAnna Dabrowska "REPLACE INTO pages(page,lastmod) VALUES 45*21913a6dSAnna Dabrowska ('stats1:a', 1000), 46*21913a6dSAnna Dabrowska ('stats1:b', 1000), 47*21913a6dSAnna Dabrowska ('stats1:sub:d', 1000), 48*21913a6dSAnna Dabrowska ('stats2:c', 1000), 49*21913a6dSAnna Dabrowska ('stats1:noassign', 1000)" 50*21913a6dSAnna Dabrowska ); 51*21913a6dSAnna Dabrowska 52*21913a6dSAnna Dabrowska // stats1:a -> required {regular, max(@super)}; regular current, max outdated 53*21913a6dSAnna Dabrowska $this->helper->setPageAssignees('stats1:a', 'regular, @super'); 54*21913a6dSAnna Dabrowska $this->helper->importAcknowledgement('stats1:a', 'regular', 2000); 55*21913a6dSAnna Dabrowska $this->helper->importAcknowledgement('stats1:a', 'max', 500); 56*21913a6dSAnna Dabrowska 57*21913a6dSAnna Dabrowska // stats1:b -> required {regular}; current -> fully acknowledged 58*21913a6dSAnna Dabrowska $this->helper->setPageAssignees('stats1:b', 'regular'); 59*21913a6dSAnna Dabrowska $this->helper->importAcknowledgement('stats1:b', 'regular', 2000); 60*21913a6dSAnna Dabrowska 61*21913a6dSAnna Dabrowska // stats1:sub:d -> required {regular}; current -> fully acknowledged; rolls up into 'stats1' 62*21913a6dSAnna Dabrowska $this->helper->setPageAssignees('stats1:sub:d', 'regular'); 63*21913a6dSAnna Dabrowska $this->helper->importAcknowledgement('stats1:sub:d', 'regular', 2000); 64*21913a6dSAnna Dabrowska 65*21913a6dSAnna Dabrowska // stats2:c -> required {max(@super)}; never acknowledged 66*21913a6dSAnna Dabrowska $this->helper->setPageAssignees('stats2:c', '@super'); 67*21913a6dSAnna Dabrowska } 68*21913a6dSAnna Dabrowska 69*21913a6dSAnna Dabrowska /** 70*21913a6dSAnna Dabrowska * Whole-wiki aggregation across both namespaces. 71*21913a6dSAnna Dabrowska */ 72*21913a6dSAnna Dabrowska public function testTotals() 73*21913a6dSAnna Dabrowska { 74*21913a6dSAnna Dabrowska $stats = $this->helper->getStatistics(); 75*21913a6dSAnna Dabrowska 76*21913a6dSAnna Dabrowska self::assertEquals( 77*21913a6dSAnna Dabrowska ['required' => 5, 'acked' => 3, 'pages' => 4], 78*21913a6dSAnna Dabrowska $stats['total'] 79*21913a6dSAnna Dabrowska ); 80*21913a6dSAnna Dabrowska } 81*21913a6dSAnna Dabrowska 82*21913a6dSAnna Dabrowska /** 83*21913a6dSAnna Dabrowska * Root drill-down: pages are grouped by their top-level namespace, plus @group expansion, 84*21913a6dSAnna Dabrowska * current-vs-outdated handling, and the haschildren flag for namespaces with deeper content. 85*21913a6dSAnna Dabrowska */ 86*21913a6dSAnna Dabrowska public function testNamespaceBreakdown() 87*21913a6dSAnna Dabrowska { 88*21913a6dSAnna Dabrowska $stats = $this->helper->getStatistics(); 89*21913a6dSAnna Dabrowska $ns = $stats['namespaces']; 90*21913a6dSAnna Dabrowska 91*21913a6dSAnna Dabrowska self::assertEquals( 92*21913a6dSAnna Dabrowska ['required' => 4, 'acked' => 3, 'pages' => 3, 'haschildren' => true], 93*21913a6dSAnna Dabrowska $ns['stats1'] 94*21913a6dSAnna Dabrowska ); 95*21913a6dSAnna Dabrowska 96*21913a6dSAnna Dabrowska self::assertEquals( 97*21913a6dSAnna Dabrowska ['required' => 1, 'acked' => 0, 'pages' => 1, 'haschildren' => false], 98*21913a6dSAnna Dabrowska $ns['stats2'] 99*21913a6dSAnna Dabrowska ); 100*21913a6dSAnna Dabrowska } 101*21913a6dSAnna Dabrowska 102*21913a6dSAnna Dabrowska /** 103*21913a6dSAnna Dabrowska * Pages without assignees are excluded from the statistics. 104*21913a6dSAnna Dabrowska */ 105*21913a6dSAnna Dabrowska public function testPageWithoutAssigneesExcluded() 106*21913a6dSAnna Dabrowska { 107*21913a6dSAnna Dabrowska $stats = $this->helper->getStatistics(); 108*21913a6dSAnna Dabrowska 109*21913a6dSAnna Dabrowska // only stats1 and stats2 namespaces, noassign contributes nothing 110*21913a6dSAnna Dabrowska self::assertEquals(['stats1', 'stats2'], array_keys($stats['namespaces'])); 111*21913a6dSAnna Dabrowska self::assertSame(4, $stats['total']['pages']); 112*21913a6dSAnna Dabrowska } 113*21913a6dSAnna Dabrowska 114*21913a6dSAnna Dabrowska /** 115*21913a6dSAnna Dabrowska * Drilling into a namespace groups pages by their immediate child namespace, while the 116*21913a6dSAnna Dabrowska * total stays wiki-wide. 117*21913a6dSAnna Dabrowska */ 118*21913a6dSAnna Dabrowska public function testDrilldown() 119*21913a6dSAnna Dabrowska { 120*21913a6dSAnna Dabrowska $stats = $this->helper->getStatistics('stats1'); 121*21913a6dSAnna Dabrowska 122*21913a6dSAnna Dabrowska // total is always the whole wiki, regardless of the drill-down namespace 123*21913a6dSAnna Dabrowska self::assertEquals( 124*21913a6dSAnna Dabrowska ['required' => 5, 'acked' => 3, 'pages' => 4], 125*21913a6dSAnna Dabrowska $stats['total'] 126*21913a6dSAnna Dabrowska ); 127*21913a6dSAnna Dabrowska 128*21913a6dSAnna Dabrowska // within stats1: direct pages (a + b) group under 'stats1', the sub-namespace page 129*21913a6dSAnna Dabrowska // groups under 'stats1:sub'; stats2 is out of scope 130*21913a6dSAnna Dabrowska self::assertEquals(['stats1', 'stats1:sub'], array_keys($stats['namespaces'])); 131*21913a6dSAnna Dabrowska 132*21913a6dSAnna Dabrowska // 'stats1' self group = direct pages a + b: required max+regular(a)+regular(b) = 3, 133*21913a6dSAnna Dabrowska // acked regular(a)+regular(b) = 2; no pages deeper than stats1:* here -> haschildren false 134*21913a6dSAnna Dabrowska self::assertEquals( 135*21913a6dSAnna Dabrowska ['required' => 3, 'acked' => 2, 'pages' => 2, 'haschildren' => false], 136*21913a6dSAnna Dabrowska $stats['namespaces']['stats1'] 137*21913a6dSAnna Dabrowska ); 138*21913a6dSAnna Dabrowska 139*21913a6dSAnna Dabrowska // 'stats1:sub' = page sub:d: required regular = 1, acked regular = 1 140*21913a6dSAnna Dabrowska self::assertEquals( 141*21913a6dSAnna Dabrowska ['required' => 1, 'acked' => 1, 'pages' => 1, 'haschildren' => false], 142*21913a6dSAnna Dabrowska $stats['namespaces']['stats1:sub'] 143*21913a6dSAnna Dabrowska ); 144*21913a6dSAnna Dabrowska } 145*21913a6dSAnna Dabrowska} 146