Merge "Add SPARQL client to core"
[lhc/web/wiklou.git] / tests / phpunit / includes / api / query / ApiQueryTest.php
1 <?php
2
3 /**
4 * @group API
5 * @group Database
6 * @group medium
7 * @covers ApiQuery
8 */
9 class ApiQueryTest extends ApiTestCase {
10 protected function setUp() {
11 parent::setUp();
12 $this->doLogin();
13
14 // Setup apiquerytestiw: as interwiki prefix
15 $this->setMwGlobals( 'wgHooks', [
16 'InterwikiLoadPrefix' => [
17 function ( $prefix, &$data ) {
18 if ( $prefix == 'apiquerytestiw' ) {
19 $data = [ 'iw_url' => 'wikipedia' ];
20 }
21 return false;
22 }
23 ]
24 ] );
25 }
26
27 public function testTitlesGetNormalized() {
28 global $wgMetaNamespace;
29
30 $this->setMwGlobals( [
31 'wgCapitalLinks' => true,
32 ] );
33
34 $data = $this->doApiRequest( [
35 'action' => 'query',
36 'titles' => 'Project:articleA|article_B' ] );
37
38 $this->assertArrayHasKey( 'query', $data[0] );
39 $this->assertArrayHasKey( 'normalized', $data[0]['query'] );
40
41 // Forge a normalized title
42 $to = Title::newFromText( $wgMetaNamespace . ':ArticleA' );
43
44 $this->assertEquals(
45 [
46 'fromencoded' => false,
47 'from' => 'Project:articleA',
48 'to' => $to->getPrefixedText(),
49 ],
50 $data[0]['query']['normalized'][0]
51 );
52
53 $this->assertEquals(
54 [
55 'fromencoded' => false,
56 'from' => 'article_B',
57 'to' => 'Article B'
58 ],
59 $data[0]['query']['normalized'][1]
60 );
61 }
62
63 public function testTitlesAreRejectedIfInvalid() {
64 $title = false;
65 while ( !$title || Title::newFromText( $title )->exists() ) {
66 $title = md5( mt_rand( 0, 100000 ) );
67 }
68
69 $data = $this->doApiRequest( [
70 'action' => 'query',
71 'titles' => $title . '|Talk:' ] );
72
73 $this->assertArrayHasKey( 'query', $data[0] );
74 $this->assertArrayHasKey( 'pages', $data[0]['query'] );
75 $this->assertEquals( 2, count( $data[0]['query']['pages'] ) );
76
77 $this->assertArrayHasKey( -2, $data[0]['query']['pages'] );
78 $this->assertArrayHasKey( -1, $data[0]['query']['pages'] );
79
80 $this->assertArrayHasKey( 'missing', $data[0]['query']['pages'][-2] );
81 $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
82 }
83
84 public function testTitlesWithWhitespaces() {
85 $data = $this->doApiRequest( [
86 'action' => 'query',
87 'titles' => ' '
88 ] );
89
90 $this->assertArrayHasKey( 'query', $data[0] );
91 $this->assertArrayHasKey( 'pages', $data[0]['query'] );
92 $this->assertEquals( 1, count( $data[0]['query']['pages'] ) );
93 $this->assertArrayHasKey( -1, $data[0]['query']['pages'] );
94 $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
95 }
96
97 /**
98 * Test the ApiBase::titlePartToKey function
99 *
100 * @param string $titlePart
101 * @param int $namespace
102 * @param string $expected
103 * @param string $expectException
104 * @dataProvider provideTestTitlePartToKey
105 */
106 function testTitlePartToKey( $titlePart, $namespace, $expected, $expectException ) {
107 $this->setMwGlobals( [
108 'wgCapitalLinks' => true,
109 ] );
110
111 $api = new MockApiQueryBase();
112 $exceptionCaught = false;
113 try {
114 $this->assertEquals( $expected, $api->titlePartToKey( $titlePart, $namespace ) );
115 } catch ( ApiUsageException $e ) {
116 $exceptionCaught = true;
117 }
118 $this->assertEquals( $expectException, $exceptionCaught,
119 'ApiUsageException thrown by titlePartToKey' );
120 }
121
122 function provideTestTitlePartToKey() {
123 return [
124 [ 'a b c', NS_MAIN, 'A_b_c', false ],
125 [ 'x', NS_MAIN, 'X', false ],
126 [ 'y ', NS_MAIN, 'Y_', false ],
127 [ 'template:foo', NS_CATEGORY, 'Template:foo', false ],
128 [ 'apiquerytestiw:foo', NS_CATEGORY, 'Apiquerytestiw:foo', false ],
129 [ "\xF7", NS_MAIN, null, true ],
130 [ 'template:foo', NS_MAIN, null, true ],
131 [ 'apiquerytestiw:foo', NS_MAIN, null, true ],
132 ];
133 }
134
135 /**
136 * Test if all classes in the query module manager exists
137 */
138 public function testClassNamesInModuleManager() {
139 $api = new ApiMain(
140 new FauxRequest( [ 'action' => 'query', 'meta' => 'siteinfo' ] )
141 );
142 $queryApi = new ApiQuery( $api, 'query' );
143 $modules = $queryApi->getModuleManager()->getNamesWithClasses();
144
145 foreach ( $modules as $name => $class ) {
146 $this->assertTrue(
147 class_exists( $class ),
148 'Class ' . $class . ' for api module ' . $name . ' does not exist (with exact case)'
149 );
150 }
151 }
152 }