xref: /plugin/acknowledge/_test/StatsTest.php (revision 21913a6d9b851a00667f66bc614ba0dda97d3508)
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