Completed
Push — master ( b08b65...b78d2e )
by mw
230:52 queued 205:17
created

testAskToQueryEndpointOnMockedHttpRequest()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 34
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 23
nc 1
nop 2
dl 0
loc 34
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
namespace SMW\Tests\SPARQLStore\RepositoryConnectors;
4
5
use SMW\SPARQLStore\RepositoryClient;
6
use SMW\Tests\Utils\Fixtures\Results\FakeRawResultProvider;
7
8
/**
9
 * @covers \SMW\SPARQLStore\RepositoryConnectors\FusekiHttpRepositoryConnector
10
 * @covers \SMW\SPARQLStore\RepositoryConnectors\FourstoreHttpRepositoryConnector
11
 * @covers \SMW\SPARQLStore\RepositoryConnectors\VirtuosoHttpRepositoryConnector
12
 * @covers \SMW\SPARQLStore\RepositoryConnectors\GenericHttpRepositoryConnector
13
 *
14
 * @group semantic-mediawiki
15
 *
16
 * @license GNU GPL v2+
17
 * @since 2.0
18
 *
19
 * @author mwjames
20
 */
21
class RepositoryConnectorsIntegrityTest extends \PHPUnit_Framework_TestCase {
22
23
	private $databaseConnectors = array(
24
		'\SMW\SPARQLStore\RepositoryConnectors\GenericHttpRepositoryConnector',
25
		'\SMW\SPARQLStore\RepositoryConnectors\FusekiHttpRepositoryConnector',
26
		'\SMW\SPARQLStore\RepositoryConnectors\FourstoreHttpRepositoryConnector',
27
		'\SMW\SPARQLStore\RepositoryConnectors\VirtuosoHttpRepositoryConnector',
28
29
		// Legacy and should be removed once obsolete
30
		'SMWSparqlDatabase4Store',
31
		'SMWSparqlDatabaseVirtuoso',
32
		'SMWSparqlDatabase'
33
	);
34
35
	/**
36
	 * @dataProvider httpDatabaseConnectorInstanceNameForAskProvider
37
	 *
38
	 * @see https://www.w3.org/TR/rdf-sparql-query/#ask
39
	 */
40
	public function testAskToQueryEndpointOnMockedHttpRequest( $httpDatabaseConnector, $expectedPostField ) {
41
42
		$rawResultProvider = new FakeRawResultProvider();
43
44
		$httpRequest = $this->getMockBuilder( '\Onoi\HttpRequest\HttpRequest' )
45
			->disableOriginalConstructor()
46
			->getMock();
47
48
		$httpRequest->expects( $this->at( 8 ) )
49
			->method( 'setOption' )
50
			->with(
51
				$this->equalTo( CURLOPT_POSTFIELDS ),
52
				$this->stringContains( $expectedPostField ) )
53
			->will( $this->returnValue( true ) );
54
55
		$httpRequest->expects( $this->once() )
56
			->method( 'execute' )
57
			->will( $this->returnValue( $rawResultProvider->getEmptySparqlResultXml() ) );
58
59
		$instance = new $httpDatabaseConnector(
60
			new RepositoryClient( 'http://foo/myDefaultGraph', 'http://localhost:9999/query' ),
61
			$httpRequest
62
		);
63
64
		$repositoryResult = $instance->ask(
65
			'?x foaf:name "Foo"',
66
			array( 'foaf' => 'http://xmlns.com/foaf/0.1/>' )
67
		);
68
69
		$this->assertInstanceOf(
70
			'\SMW\SPARQLStore\QueryEngine\RepositoryResult',
71
			$repositoryResult
72
		);
73
	}
74
75
	/**
76
	 * @dataProvider httpDatabaseConnectorInstanceNameForDeleteProvider
77
	 *
78
	 * @see http://www.w3.org/TR/sparql11-update/#deleteInsert
79
	 */
80
	public function testDeleteToUpdateEndpointOnMockedHttpRequest( $httpDatabaseConnector, $expectedPostField ) {
81
82
		$httpRequest = $this->getMockBuilder( '\Onoi\HttpRequest\HttpRequest' )
83
			->disableOriginalConstructor()
84
			->getMock();
85
86
		$httpRequest->expects( $this->at( 7 ) )
87
			->method( 'setOption' )
88
			->with(
89
				$this->equalTo( CURLOPT_POSTFIELDS ),
90
				$this->stringContains( $expectedPostField ) )
91
			->will( $this->returnValue( true ) );
92
93
		$httpRequest->expects( $this->once() )
94
			->method( 'getLastErrorCode' )
95
			->will( $this->returnValue( 0 ) );
96
97
		$instance = new $httpDatabaseConnector(
98
			new RepositoryClient(
99
				'http://foo/myDefaultGraph',
100
				'http://localhost:9999/query',
101
				'http://localhost:9999/update'
102
			),
103
			$httpRequest
104
		);
105
106
		$this->assertTrue(
107
			$instance->delete( 'wiki:Foo ?p ?o', 'wiki:Foo ?p ?o' )
108
		);
109
	}
110
111
	/**
112
	 * @dataProvider httpDatabaseConnectorInstanceNameForInsertProvider
113
	 *
114
	 * @see http://www.w3.org/TR/sparql11-http-rdf-update/#http-post
115
	 */
116
	public function testInsertViaHttpPostToDataPointOnMockedHttpRequest( $httpDatabaseConnector ) {
117
118
		$httpRequest = $this->getMockBuilder( '\Onoi\HttpRequest\HttpRequest' )
119
			->disableOriginalConstructor()
120
			->getMock();
121
122
		$httpRequest->expects( $this->once() )
123
			->method( 'getLastErrorCode' )
124
			->will( $this->returnValue( 0 ) );
125
126
		$instance = new $httpDatabaseConnector(
127
			new RepositoryClient(
128
				'http://foo/myDefaultGraph',
129
				'http://localhost:9999/query',
130
				'http://localhost:9999/update',
131
				'http://localhost:9999/data'
132
			),
133
			$httpRequest
134
		);
135
136
		$this->assertTrue(
137
			$instance->insertData( 'property:Foo  wiki:Bar;' )
138
		);
139
	}
140
141
	public function httpDatabaseConnectorInstanceNameForAskProvider() {
142
143
		$provider = array();
144
		$encodedDefaultGraph = urlencode( 'http://foo/myDefaultGraph' );
145
146
		foreach ( $this->databaseConnectors as $databaseConnector ) {
147
148
			switch ( $databaseConnector ) {
149
				case '\SMW\SPARQLStore\RepositoryConnectors\FusekiHttpRepositoryConnector':
150
					$expectedPostField = '&default-graph-uri=' . $encodedDefaultGraph . '&output=xml';
151
					break;
152
				case 'SMWSparqlDatabase4Store':
153
				case '\SMW\SPARQLStore\RepositoryConnectors\FourstoreHttpRepositoryConnector':
154
					$expectedPostField = "&restricted=1" . '&default-graph-uri=' . $encodedDefaultGraph;
155
					break;
156
				default:
157
					$expectedPostField = '&default-graph-uri=' . $encodedDefaultGraph;
158
					break;
159
			};
160
161
			$provider[] = array( $databaseConnector, $expectedPostField );
162
		}
163
164
		return $provider;
165
	}
166
167
	public function httpDatabaseConnectorInstanceNameForDeleteProvider() {
168
169
		$provider = array();
170
171
		foreach ( $this->databaseConnectors as $databaseConnector ) {
172
173
			switch ( $databaseConnector ) {
174
				case 'SMWSparqlDatabaseVirtuoso':
175
				case '\SMW\SPARQLStore\RepositoryConnectors\VirtuosoHttpRepositoryConnector':
176
					$expectedPostField = 'query=';
177
					break;
178
				default:
179
					$expectedPostField = 'update=';
180
					break;
181
			};
182
183
			$provider[] = array( $databaseConnector, $expectedPostField );
184
		}
185
186
		return $provider;
187
	}
188
189
	public function httpDatabaseConnectorInstanceNameForInsertProvider() {
190
191
		$provider = array();
192
193
		foreach ( $this->databaseConnectors as $databaseConnector ) {
194
			$provider[] = array( $databaseConnector );
195
		}
196
197
		return $provider;
198
	}
199
200
}
201