testGetArticleForSiteLinkWithLoad()   B
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 46
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 46
rs 8.9411
c 0
b 0
f 0
cc 1
eloc 36
nc 1
nop 0
1
<?php
2
3
namespace PPP\Wikidata\Wikipedia;
4
5
use Doctrine\Common\Cache\ArrayCache;
6
use Mediawiki\Api\SimpleRequest;
7
use PPP\Wikidata\Cache\PerSiteLinkCache;
8
use Wikibase\DataModel\SiteLink;
9
10
/**
11
 * @covers PPP\Wikidata\Wikipedia\MediawikiArticleProvider
12
 *
13
 * @licence AGPLv3+
14
 * @author Thomas Pellissier Tanon
15
 * TODO: test continue
16
 */
17
class MediawikiArticleProviderTest extends \PHPUnit_Framework_TestCase {
18
19
	public function testGetArticleForSiteLinkWithImage() {
20
		$mediawikiApiMock = $this->getMockBuilder('Mediawiki\Api\MediawikiApi')
21
			->disableOriginalConstructor()
22
			->getMock();
23
		$mediawikiApiMock->expects($this->once())
24
			->method('getRequest')
25
			->with($this->equalTo(new SimpleRequest(
26
				'query',
27
				array(
28
					'action' => 'query',
29
					'titles' => 'Bar',
30
					'prop' => 'extracts|info|pageimages',
31
					'inprop' => 'url',
32
					'redirects' => true,
33
					'exintro' => true,
34
					'exsectionformat' => 'plain',
35
					'explaintext' => true,
36
					'exsentences' => 3,
37
					'exlimit' => 20,
38
					'piprop' => 'thumbnail|name',
39
					'pithumbsize' => 300,
40
					'pilimit' => 20,
41
					'continue' => ''
42
				)
43
			)))
44
			->will($this->returnValue(array(
45
				'query' => array(
46
					'pages' => array(
47
						array(
48
							'title' => 'Bar',
49
							'extract' => 'foo',
50
							'pagelanguage' => 'en',
51
							'canonicalurl' => 'http://en.wikipedia.org/wiki/Bar',
52
							'thumbnail' => array(
53
								'source' => 'http://test.org',
54
								'width' => 1,
55
								'height' => 1
56
							),
57
							'pageimage' => 'foo'
58
						)
59
					)
60
				)
61
			)));
62
63
		$provider = new MediawikiArticleProvider(array('enwiki' => $mediawikiApiMock), new PerSiteLinkCache(new ArrayCache(), 'mahp'));
64
65
		$this->assertEquals(
66
			new MediawikiArticle(
67
				new SiteLink('enwiki', 'Bar'),
68
				'foo',
69
				'en',
70
				'http://en.wikipedia.org/wiki/Bar',
71
				new MediawikiArticleImage('http://test.org', 1, 1, 'foo')
72
			),
73
			$provider->getArticleForSiteLink(new SiteLink('enwiki', 'Bar'))
74
		);
75
	}
76
77
	public function testGetArticleForSiteLinkWithoutImage() {
78
		$mediawikiApiMock = $this->getMockBuilder('Mediawiki\Api\MediawikiApi')
79
			->disableOriginalConstructor()
80
			->getMock();
81
		$mediawikiApiMock->expects($this->once())
82
			->method('getRequest')
83
			->with($this->equalTo(new SimpleRequest(
84
				'query',
85
				array(
86
					'action' => 'query',
87
					'titles' => 'Bar',
88
					'prop' => 'extracts|info|pageimages',
89
					'inprop' => 'url',
90
					'redirects' => true,
91
					'exintro' => true,
92
					'exsectionformat' => 'plain',
93
					'explaintext' => true,
94
					'exsentences' => 3,
95
					'exlimit' => 20,
96
					'piprop' => 'thumbnail|name',
97
					'pithumbsize' => 300,
98
					'pilimit' => 20,
99
					'continue' => ''
100
				)
101
			)))
102
			->will($this->returnValue(array(
103
				'query' => array(
104
					'pages' => array(
105
						array(
106
							'title' => 'Bar',
107
							'extract' => 'foo',
108
							'pagelanguage' => 'en',
109
							'canonicalurl' => 'http://en.wikipedia.org/wiki/Bar'
110
						)
111
					)
112
				)
113
			)));
114
115
		$provider = new MediawikiArticleProvider(array('enwiki' => $mediawikiApiMock), new PerSiteLinkCache(new ArrayCache(), 'mahp'));
116
117
		$this->assertEquals(
118
			new MediawikiArticle(new SiteLink('enwiki', 'Bar'), 'foo', 'en', 'http://en.wikipedia.org/wiki/Bar'),
119
			$provider->getArticleForSiteLink(new SiteLink('enwiki', 'Bar'))
120
		);
121
	}
122
123
	public function testGetArticleForSiteLinkWithException() {
124
		$this->setExpectedException('\OutOfBoundsException');
125
126
		$mediawikiApiMock = $this->getMockBuilder('Mediawiki\Api\MediawikiApi')
127
			->disableOriginalConstructor()
128
			->getMock();
129
		$mediawikiApiMock->expects($this->once())
130
			->method('getRequest')
131
			->will($this->returnValue(array('query' => array('pages' => array()))));
132
133
		$provider = new MediawikiArticleProvider(array('enwiki' => $mediawikiApiMock), new PerSiteLinkCache(new ArrayCache(), 'mahp'));
134
		$provider->getArticleForSiteLink(new SiteLink('enwiki', 'bar'));
135
	}
136
137
	public function testGetArticleForSiteLinkWithCache() {
138
		$mediawikiApiMock = $this->getMockBuilder('Mediawiki\Api\MediawikiApi')
139
			->disableOriginalConstructor()
140
			->getMock();
141
142
		$cache = new PerSiteLinkCache(new ArrayCache(), 'mahp');
143
		$cache->save(new MediawikiArticle(new SiteLink('enwiki', 'bar'), 'foo', 'en', 'http://test.org'));
144
145
		$provider = new MediawikiArticleProvider(array('enwiki' => $mediawikiApiMock), $cache);
146
147
		$this->assertEquals(
148
			new MediawikiArticle(new SiteLink('enwiki', 'bar'), 'foo', 'en', 'http://test.org'),
149
			$provider->getArticleForSiteLink(new SiteLink('enwiki', 'bar'))
150
		);
151
	}
152
153
	public function testGetArticleForSiteLinkWithLoad() {
154
		$mediawikiApiMock = $this->getMockBuilder('Mediawiki\Api\MediawikiApi')
155
			->disableOriginalConstructor()
156
			->getMock();
157
		$mediawikiApiMock->expects($this->once())
158
			->method('getRequest')
159
			->with($this->equalTo(new SimpleRequest(
160
				'query',
161
				array(
162
					'action' => 'query',
163
					'titles' => 'Bar',
164
					'prop' => 'extracts|info|pageimages',
165
					'inprop' => 'url',
166
					'redirects' => true,
167
					'exintro' => true,
168
					'exsectionformat' => 'plain',
169
					'explaintext' => true,
170
					'exsentences' => 3,
171
					'exlimit' => 20,
172
					'piprop' => 'thumbnail|name',
173
					'pithumbsize' => 300,
174
					'pilimit' => 20,
175
					'continue' => ''
176
				)
177
			)))
178
			->will($this->returnValue(array(
179
				'query' => array(
180
					'pages' => array(
181
						array(
182
							'title' => 'Bar',
183
							'extract' => 'foo',
184
							'pagelanguage' => 'en',
185
							'canonicalurl' => 'http://en.wikipedia.org/wiki/Bar'
186
						)
187
					)
188
				)
189
			)));
190
191
		$provider = new MediawikiArticleProvider(array('enwiki' => $mediawikiApiMock), new PerSiteLinkCache(new ArrayCache(), 'mahp'));
192
193
		$provider->loadFromSiteLinks(array(new SiteLink('enwiki', 'Bar'), new SiteLink('dewiki', 'Bar')));
194
		$this->assertEquals(
195
			new MediawikiArticle(new SiteLink('enwiki', 'Bar'), 'foo', 'en', 'http://en.wikipedia.org/wiki/Bar'),
196
			$provider->getArticleForSiteLink(new SiteLink('enwiki', 'Bar'))
197
		);
198
	}
199
200
	public function testIsWikiIdSupported() {
201
		$mediawikiApiMock = $this->getMockBuilder('Mediawiki\Api\MediawikiApi')
202
			->disableOriginalConstructor()
203
			->getMock();
204
205
		$provider = new MediawikiArticleProvider(array('enwiki' => $mediawikiApiMock), new PerSiteLinkCache(new ArrayCache(), 'mahp'));
206
207
		$this->assertTrue($provider->isWikiIdSupported('enwiki'));
208
		$this->assertFalse($provider->isWikiIdSupported('dewiki'));
209
	}
210
}
211