e07e425930eed272022600d5b62b14117fdcfab3
[lhc/web/wiklou.git] / tests / phpunit / includes / sparql / SparqlClientTest.php
1 <?php
2 namespace MediaWiki\Sparql;
3
4 use Http;
5 use MediaWiki\Http\HttpRequestFactory;
6 use MWHttpRequest;
7 use PHPUnit_Framework_TestCase;
8
9 /**
10 * @covers \MediaWiki\Sparql\SparqlClient
11 */
12 class SparqlClientTest extends PHPUnit_Framework_TestCase {
13
14 private function getRequestFactory( $request ) {
15 $requestFactory = $this->getMock( HttpRequestFactory::class );
16 $requestFactory->method( 'create' )->willReturn( $request );
17 return $requestFactory;
18 }
19
20 private function getRequestMock( $content ) {
21 $request = $this->getMockBuilder( MWHttpRequest::class )->disableOriginalConstructor()->getMock();
22 $request->method( 'execute' )->willReturn( \Status::newGood( 200 ) );
23 $request->method( 'getContent' )->willReturn( $content );
24 return $request;
25 }
26
27 public function testQuery() {
28 $json = <<<JSON
29 {
30 "head" : {
31 "vars" : [ "x", "y", "z" ]
32 },
33 "results" : {
34 "bindings" : [ {
35 "x" : {
36 "type" : "uri",
37 "value" : "http://wikiba.se/ontology#Dump"
38 },
39 "y" : {
40 "type" : "uri",
41 "value" : "http://creativecommons.org/ns#license"
42 },
43 "z" : {
44 "type" : "uri",
45 "value" : "http://creativecommons.org/publicdomain/zero/1.0/"
46 }
47 }, {
48 "x" : {
49 "type" : "uri",
50 "value" : "http://wikiba.se/ontology#Dump"
51 },
52 "z" : {
53 "type" : "literal",
54 "value" : "0.1.0"
55 }
56 } ]
57 }
58 }
59 JSON;
60
61 $request = $this->getRequestMock( $json );
62 $client = new SparqlClient( 'http://acme.test/', $this->getRequestFactory( $request ) );
63
64 // values only
65 $result = $client->query( "TEST SPARQL" );
66 $this->assertCount( 2, $result );
67 $this->assertEquals( 'http://wikiba.se/ontology#Dump', $result[0]['x'] );
68 $this->assertEquals( 'http://creativecommons.org/ns#license', $result[0]['y'] );
69 $this->assertEquals( '0.1.0', $result[1]['z'] );
70 $this->assertNull( $result[1]['y'] );
71 // raw data format
72 $result = $client->query( "TEST SPARQL 2", true );
73 $this->assertCount( 2, $result );
74 $this->assertEquals( 'uri', $result[0]['x']['type'] );
75 $this->assertEquals( 'http://wikiba.se/ontology#Dump', $result[0]['x']['value'] );
76 $this->assertEquals( 'literal', $result[1]['z']['type'] );
77 $this->assertEquals( '0.1.0', $result[1]['z']['value'] );
78 $this->assertNull( $result[1]['y'] );
79 }
80
81 /**
82 * @expectedException \Mediawiki\Sparql\SparqlException
83 */
84 public function testBadQuery() {
85 $request = $this->getMockBuilder( MWHttpRequest::class )->disableOriginalConstructor()->getMock();
86 $client = new SparqlClient( 'http://acme.test/', $this->getRequestFactory( $request ) );
87
88 $request->method( 'execute' )->willReturn( \Status::newFatal( "Bad query" ) );
89 $result = $client->query( "TEST SPARQL 3" );
90 }
91
92 public function optionsProvider() {
93 return [
94 'defaults' => [
95 'TEST ั‚ะตัั‚ SPARQL 4 ',
96 null,
97 null,
98 [
99 'http://acme.test/',
100 'query=TEST+%D1%82%D0%B5%D1%81%D1%82+SPARQL+4+',
101 'format=json',
102 'maxQueryTimeMillis=30000',
103 ],
104 [
105 'method' => 'GET',
106 'userAgent' => Http::userAgent() ." SparqlClient",
107 'timeout' => 30
108 ]
109 ],
110 'big query' => [
111 str_repeat( 'ZZ', SparqlClient::MAX_GET_SIZE ),
112 null,
113 null,
114 [
115 'format=json',
116 'maxQueryTimeMillis=30000',
117 ],
118 [
119 'method' => 'POST',
120 'postData' => 'query=' . str_repeat( 'ZZ', SparqlClient::MAX_GET_SIZE ),
121 ]
122 ],
123 'timeout 1s' => [
124 'TEST SPARQL 4',
125 null,
126 1,
127 [
128 'maxQueryTimeMillis=1000',
129 ],
130 [
131 'timeout' => 1
132 ]
133 ],
134 'more options' => [
135 'TEST SPARQL 5',
136 [
137 'userAgent' => 'My Test',
138 'randomOption' => 'duck',
139 ],
140 null,
141 [],
142 [
143 'userAgent' => 'My Test',
144 'randomOption' => 'duck',
145 ]
146 ],
147
148 ];
149 }
150
151 /**
152 * @dataProvider optionsProvider
153 * @param string $sparql
154 * @param array|null $options
155 * @param int|null $timeout
156 * @param array $expectedUrl
157 * @param array $expectedOptions
158 */
159 public function testOptions( $sparql, $options, $timeout, $expectedUrl, $expectedOptions ) {
160 $requestFactory = $this->getMock( HttpRequestFactory::class );
161 $client = new SparqlClient( 'http://acme.test/', $requestFactory );
162
163 $request = $this->getRequestMock( '{}' );
164
165 $requestFactory->method( 'create' )->willReturnCallback(
166 function ( $url, $options ) use ( $request, $expectedUrl, $expectedOptions ) {
167 foreach ( $expectedUrl as $eurl ) {
168 $this->assertContains( $eurl, $url );
169 }
170 foreach ( $expectedOptions as $ekey => $evalue ) {
171 $this->assertArrayHasKey( $ekey, $options );
172 $this->assertEquals( $options[$ekey], $evalue );
173 }
174 return $request;
175 }
176 );
177
178 if ( !is_null( $options ) ) {
179 $client->setClientOptions( $options );
180 }
181 if ( !is_null( $timeout ) ) {
182 $client->setTimeout( $timeout );
183 }
184
185 $result = $client->query( $sparql );
186 }
187
188 }