xref: /plugin/struct/_test/AssignmentsTest.php (revision 8fed17f342cc190557a6ce94d1787f9e2f63cb6c)
1*8fed17f3SAndreas Gohr<?php
2*8fed17f3SAndreas Gohr
3*8fed17f3SAndreas Gohrnamespace dokuwiki\plugin\struct\test;
4*8fed17f3SAndreas Gohr
5*8fed17f3SAndreas Gohr/**
6*8fed17f3SAndreas Gohr * @group plugin_struct
7*8fed17f3SAndreas Gohr * @group plugins
8*8fed17f3SAndreas Gohr *
9*8fed17f3SAndreas Gohr */
10*8fed17f3SAndreas Gohrclass AssignmentsTest extends StructTest
11*8fed17f3SAndreas Gohr{
12*8fed17f3SAndreas Gohr
13*8fed17f3SAndreas Gohr    public function test_patternmatching()
14*8fed17f3SAndreas Gohr    {
15*8fed17f3SAndreas Gohr        $ass = mock\Assignments::getInstance();
16*8fed17f3SAndreas Gohr
17*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('some:ns:page', 'some:ns:page'));
18*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('some:ns:*', 'some:ns:page'));
19*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('some:**', 'some:ns:page'));
20*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('**', 'some:ns:page'));
21*8fed17f3SAndreas Gohr
22*8fed17f3SAndreas Gohr        $this->assertFalse($ass->matchPagePattern('some:ns:page', 'some:ns:other'));
23*8fed17f3SAndreas Gohr        $this->assertFalse($ass->matchPagePattern('some:ns:*', 'some:ns:deep:other'));
24*8fed17f3SAndreas Gohr
25*8fed17f3SAndreas Gohr        // some regexes
26*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('/page/', 'somepagehere'));
27*8fed17f3SAndreas Gohr        $this->assertFalse($ass->matchPagePattern('/:page/', 'somepagehere'));
28*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('/:page/', 'some:pagehere'));
29*8fed17f3SAndreas Gohr        $this->assertTrue($ass->matchPagePattern('/:page/', 'pagehere'));
30*8fed17f3SAndreas Gohr    }
31*8fed17f3SAndreas Gohr
32*8fed17f3SAndreas Gohr    /**
33*8fed17f3SAndreas Gohr     * check clearing works
34*8fed17f3SAndreas Gohr     */
35*8fed17f3SAndreas Gohr    public function test_clear()
36*8fed17f3SAndreas Gohr    {
37*8fed17f3SAndreas Gohr        $ass = mock\Assignments::getInstance();
38*8fed17f3SAndreas Gohr        $this->assertTrue($ass->clear());
39*8fed17f3SAndreas Gohr        $ass->addPattern('foo', 'foo');
40*8fed17f3SAndreas Gohr        $ass->assignPageSchema('foo', 'foo');
41*8fed17f3SAndreas Gohr        $this->assertTrue($ass->clear());
42*8fed17f3SAndreas Gohr
43*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getAllPatterns());
44*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('foo', true));
45*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('foo', false));
46*8fed17f3SAndreas Gohr
47*8fed17f3SAndreas Gohr        // old page is still known
48*8fed17f3SAndreas Gohr        $this->assertEquals(['foo' => ['foo' => false]], $ass->getPages());
49*8fed17f3SAndreas Gohr
50*8fed17f3SAndreas Gohr        // now it's gone
51*8fed17f3SAndreas Gohr        $ass->clear(true);
52*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPages());
53*8fed17f3SAndreas Gohr    }
54*8fed17f3SAndreas Gohr
55*8fed17f3SAndreas Gohr    /**
56*8fed17f3SAndreas Gohr     * basic usage
57*8fed17f3SAndreas Gohr     */
58*8fed17f3SAndreas Gohr    public function test_patternassigns()
59*8fed17f3SAndreas Gohr    {
60*8fed17f3SAndreas Gohr        $ass = mock\Assignments::getInstance();
61*8fed17f3SAndreas Gohr        $ass->clear(true);
62*8fed17f3SAndreas Gohr
63*8fed17f3SAndreas Gohr        $ass->addPattern('a:single:page', 'singlepage');
64*8fed17f3SAndreas Gohr        $ass->addPattern('the:namespace:*', 'singlens');
65*8fed17f3SAndreas Gohr        $ass->addPattern('another:namespace:**', 'deepns');
66*8fed17f3SAndreas Gohr
67*8fed17f3SAndreas Gohr        $this->assertEquals(
68*8fed17f3SAndreas Gohr            [
69*8fed17f3SAndreas Gohr                [
70*8fed17f3SAndreas Gohr                    'pattern' => 'a:single:page',
71*8fed17f3SAndreas Gohr                    'tbl' => 'singlepage'
72*8fed17f3SAndreas Gohr                ],
73*8fed17f3SAndreas Gohr                [
74*8fed17f3SAndreas Gohr                    'pattern' => 'another:namespace:**',
75*8fed17f3SAndreas Gohr                    'tbl' => 'deepns'
76*8fed17f3SAndreas Gohr                ],
77*8fed17f3SAndreas Gohr                [
78*8fed17f3SAndreas Gohr                    'pattern' => 'the:namespace:*',
79*8fed17f3SAndreas Gohr                    'tbl' => 'singlens'
80*8fed17f3SAndreas Gohr                ]
81*8fed17f3SAndreas Gohr            ],
82*8fed17f3SAndreas Gohr            $ass->getAllPatterns()
83*8fed17f3SAndreas Gohr        );
84*8fed17f3SAndreas Gohr
85*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('foo'));
86*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('a:single'));
87*8fed17f3SAndreas Gohr        $this->assertEquals(['singlepage'], $ass->getPageAssignments('a:single:page'));
88*8fed17f3SAndreas Gohr
89*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('the:foo'));
90*8fed17f3SAndreas Gohr        $this->assertEquals(['singlens'], $ass->getPageAssignments('the:namespace:foo'));
91*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('the:namespace:foo:bar'));
92*8fed17f3SAndreas Gohr
93*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('another:foo'));
94*8fed17f3SAndreas Gohr        $this->assertEquals(['deepns'], $ass->getPageAssignments('another:namespace:foo'));
95*8fed17f3SAndreas Gohr        $this->assertEquals(['deepns'], $ass->getPageAssignments('another:namespace:foo:bar'));
96*8fed17f3SAndreas Gohr        $this->assertEquals(['deepns'], $ass->getPageAssignments('another:namespace:foo:bar:baz'));
97*8fed17f3SAndreas Gohr
98*8fed17f3SAndreas Gohr        $ass->removePattern('a:single:page', 'singlepage');
99*8fed17f3SAndreas Gohr        $ass->removePattern('the:namespace:*', 'singlens');
100*8fed17f3SAndreas Gohr        $ass->removePattern('another:namespace:**', 'deepns');
101*8fed17f3SAndreas Gohr
102*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getAllPatterns());
103*8fed17f3SAndreas Gohr    }
104*8fed17f3SAndreas Gohr
105*8fed17f3SAndreas Gohr    /**
106*8fed17f3SAndreas Gohr     * Check reevaluation of patterns for a specific page works
107*8fed17f3SAndreas Gohr     */
108*8fed17f3SAndreas Gohr    public function test_pagereassign()
109*8fed17f3SAndreas Gohr    {
110*8fed17f3SAndreas Gohr        $ass = mock\Assignments::getInstance();
111*8fed17f3SAndreas Gohr        $ass->clear(true);
112*8fed17f3SAndreas Gohr
113*8fed17f3SAndreas Gohr        // no assignment
114*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false));
115*8fed17f3SAndreas Gohr
116*8fed17f3SAndreas Gohr        // fake assign the page to some schema
117*8fed17f3SAndreas Gohr        $ass->assignPageSchema('wiki:syntax', 'foo');
118*8fed17f3SAndreas Gohr        $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false));
119*8fed17f3SAndreas Gohr
120*8fed17f3SAndreas Gohr        // reevaluate should deassign
121*8fed17f3SAndreas Gohr        $ass->reevaluatePageAssignments('wiki:syntax');
122*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false));
123*8fed17f3SAndreas Gohr
124*8fed17f3SAndreas Gohr        // add a pattern and deliberately deassign the page
125*8fed17f3SAndreas Gohr        $ass->addPattern('wiki:*', 'foo');
126*8fed17f3SAndreas Gohr        $ass->deassignPageSchema('wiki:syntax', 'foo');
127*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false));
128*8fed17f3SAndreas Gohr
129*8fed17f3SAndreas Gohr        // reevaluate should assign
130*8fed17f3SAndreas Gohr        $ass->reevaluatePageAssignments('wiki:syntax');
131*8fed17f3SAndreas Gohr        $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false));
132*8fed17f3SAndreas Gohr    }
133*8fed17f3SAndreas Gohr
134*8fed17f3SAndreas Gohr    /**
135*8fed17f3SAndreas Gohr     * Check the direct page assignments
136*8fed17f3SAndreas Gohr     */
137*8fed17f3SAndreas Gohr    public function test_pageassign()
138*8fed17f3SAndreas Gohr    {
139*8fed17f3SAndreas Gohr        $ass = mock\Assignments::getInstance();
140*8fed17f3SAndreas Gohr        $ass->clear(true);
141*8fed17f3SAndreas Gohr
142*8fed17f3SAndreas Gohr        // no assignment
143*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false));
144*8fed17f3SAndreas Gohr
145*8fed17f3SAndreas Gohr        // fake assign the page to some schema
146*8fed17f3SAndreas Gohr        $ass->assignPageSchema('wiki:syntax', 'foo');
147*8fed17f3SAndreas Gohr        $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false));
148*8fed17f3SAndreas Gohr
149*8fed17f3SAndreas Gohr        // removing any pattern of the same schema should recheck all existing assignments
150*8fed17f3SAndreas Gohr        $ass->removePattern('anything', 'foo');
151*8fed17f3SAndreas Gohr        $this->assertEquals([], $ass->getPageAssignments('wiki:syntax', false));
152*8fed17f3SAndreas Gohr
153*8fed17f3SAndreas Gohr        // now the page is known to once have had data for that schema, a new pattern will reassign it
154*8fed17f3SAndreas Gohr        $ass->addPattern('wiki:*', 'foo');
155*8fed17f3SAndreas Gohr        $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false));
156*8fed17f3SAndreas Gohr
157*8fed17f3SAndreas Gohr        // adding another pattern
158*8fed17f3SAndreas Gohr        $ass->addPattern('**', 'foo');
159*8fed17f3SAndreas Gohr        $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false));
160*8fed17f3SAndreas Gohr
161*8fed17f3SAndreas Gohr        // removing one of the patterns, while the other still covers the same schema
162*8fed17f3SAndreas Gohr        $ass->removePattern('wiki:*', 'foo');
163*8fed17f3SAndreas Gohr        $this->assertEquals(['foo'], $ass->getPageAssignments('wiki:syntax', false));
164*8fed17f3SAndreas Gohr
165*8fed17f3SAndreas Gohr        // new pattern will also update all known struct pages
166*8fed17f3SAndreas Gohr        $ass->addPattern('wiki:*', 'bar');
167*8fed17f3SAndreas Gohr        $this->assertEquals(['bar', 'foo'], $ass->getPageAssignments('wiki:syntax', false));
168*8fed17f3SAndreas Gohr
169*8fed17f3SAndreas Gohr        // page should deassign again
170*8fed17f3SAndreas Gohr        $ass->addPattern('*', 'baz');
171*8fed17f3SAndreas Gohr        $ass->assignPageSchema('attoplevel', 'baz');
172*8fed17f3SAndreas Gohr        $ass->assignPageSchema('attoplevel', 'foo');
173*8fed17f3SAndreas Gohr        $ass->removePattern('*', 'baz');
174*8fed17f3SAndreas Gohr        $ass->removePattern('**', 'foo');
175*8fed17f3SAndreas Gohr
176*8fed17f3SAndreas Gohr        // check that all pages are known
177*8fed17f3SAndreas Gohr        $expect = [
178*8fed17f3SAndreas Gohr            'attoplevel' => [
179*8fed17f3SAndreas Gohr                'baz' => false,
180*8fed17f3SAndreas Gohr                'foo' => false
181*8fed17f3SAndreas Gohr            ],
182*8fed17f3SAndreas Gohr            'wiki:syntax' => [
183*8fed17f3SAndreas Gohr                'bar' => true,
184*8fed17f3SAndreas Gohr                'foo' => false
185*8fed17f3SAndreas Gohr            ]
186*8fed17f3SAndreas Gohr        ];
187*8fed17f3SAndreas Gohr        $this->assertEquals($expect, $ass->getPages());
188*8fed17f3SAndreas Gohr
189*8fed17f3SAndreas Gohr        // limit to certain schema
190*8fed17f3SAndreas Gohr        $expect = [
191*8fed17f3SAndreas Gohr            'attoplevel' => [
192*8fed17f3SAndreas Gohr                'baz' => false,
193*8fed17f3SAndreas Gohr            ],
194*8fed17f3SAndreas Gohr        ];
195*8fed17f3SAndreas Gohr        $this->assertEquals($expect, $ass->getPages('baz'));
196*8fed17f3SAndreas Gohr
197*8fed17f3SAndreas Gohr        // show current assignments only
198*8fed17f3SAndreas Gohr        $expect = [
199*8fed17f3SAndreas Gohr            'wiki:syntax' => [
200*8fed17f3SAndreas Gohr                'bar' => true,
201*8fed17f3SAndreas Gohr            ]
202*8fed17f3SAndreas Gohr        ];
203*8fed17f3SAndreas Gohr        $this->assertEquals($expect, $ass->getPages(null, true));
204*8fed17f3SAndreas Gohr    }
205*8fed17f3SAndreas Gohr}
206