SparqlClientTest.php 4.8 KB

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