testEntityIdParsingExceptionsAreNotCaught()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Wikibase\DataModel\Services\Tests\EntityId;
4
5
use PHPUnit\Framework\TestCase;
6
use Wikibase\DataModel\Entity\BasicEntityIdParser;
7
use Wikibase\DataModel\Entity\EntityId;
8
use Wikibase\DataModel\Entity\EntityIdParser;
9
use Wikibase\DataModel\Entity\EntityIdParsingException;
10
use Wikibase\DataModel\Entity\ItemId;
11
use Wikibase\DataModel\Entity\ItemIdParser;
12
use Wikibase\DataModel\Entity\PropertyId;
13
use Wikibase\DataModel\Services\EntityId\PrefixMappingEntityIdParser;
14
use Wikimedia\Assert\ParameterAssertionException;
15
16
/**
17
 * @covers \Wikibase\DataModel\Services\EntityId\PrefixMappingEntityIdParser
18
 *
19
 * @license GPL-2.0-or-later
20
 */
21
class PrefixMappingEntityIdParserTest extends TestCase {
22
23
	private function getRegularParser() {
24
		return new BasicEntityIdParser();
25
	}
26
27
	/**
28
	 * @dataProvider provideValidIdSerialization
29
	 */
30
	public function testGivenOnlyDefaultPrefixMapping_prefixIsAddedToIdSerialization(
31
		array $prefixMapping, $input, EntityId $expectedId
32
	) {
33
		$parser = new PrefixMappingEntityIdParser(
34
			$prefixMapping,
35
			$this->getRegularParser()
36
		);
37
		$this->assertEquals( $expectedId, $parser->parse( $input ) );
38
	}
39
40
	public function provideValidIdSerialization() {
41
		return [
42
			[ [ '' => 'wikidata' ], 'Q1337', new ItemId( 'wikidata:Q1337' ) ],
43
			[ [ '' => '' ], 'Q1337', new ItemId( 'Q1337' ) ],
44
			[ [ '' => 'foo' ], 'P123', new PropertyId( 'foo:P123' ) ],
45
			[ [ '' => 'foo' ], 'bar:Q1337', new ItemId( 'foo:bar:Q1337' ) ],
46
			[ [ '' => 'foo' ], 'foo:Q1337', new ItemId( 'foo:foo:Q1337' ) ],
47
		];
48
	}
49
50
	/**
51
	 * @dataProvider provideMappedSerializationId
52
	 */
53
	public function testGivenPrefixIsMapped_mappedOneIsUsed(
54
		array $prefixMapping,
55
		$foreignId,
56
		EntityId $expectedEntityId
57
	) {
58
		$regularParser = $this->getRegularParser();
59
		$parser = new PrefixMappingEntityIdParser( $prefixMapping, $regularParser );
60
		$this->assertEquals( $expectedEntityId, $parser->parse( $foreignId ) );
61
	}
62
63
	public function provideMappedSerializationId() {
64
		return [
65
			[ [ '' => 'foo', 'bar' => 'wd' ], 'bar:Q1337', new ItemId( 'wd:Q1337' ) ],
66
			[ [ '' => 'foo', 'bar' => 'wd' ], 'bar:x:Q1337', new ItemId( 'wd:x:Q1337' ) ],
67
		];
68
	}
69
70
	public function testGivenPrefixIsNotMapped_defaultPrefixIsAddedToIdSerialization() {
71
		$expectedId = new ItemId( 'foo:x:bar:Q1337' );
72
		$regularParser = $this->getRegularParser();
73
		$parser = new PrefixMappingEntityIdParser( [ '' => 'foo', 'bar' => 'wd' ], $regularParser );
74
		$this->assertEquals( $expectedId, $parser->parse( 'x:bar:Q1337' ) );
75
	}
76
77
	public function testEntityIdParsingExceptionsAreNotCaught() {
78
		$regularParser = $this->createMock( EntityIdParser::class );
79
		$regularParser->expects( $this->any() )
80
			->method( 'parse' )
81
			->will( $this->throwException( new EntityIdParsingException() ) );
82
		$parser = new PrefixMappingEntityIdParser( [ '' => 'wikidata' ], $regularParser );
0 ignored issues
show
Documentation introduced by
$regularParser is of type object<PHPUnit\Framework\MockObject\MockObject>, but the function expects a object<Wikibase\DataModel\Entity\EntityIdParser>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
83
		$this->expectException( EntityIdParsingException::class );
84
		$parser->parse( 'QQQ' );
85
	}
86
87
	/**
88
	 * @dataProvider provideInvalidPrefixMapping
89
	 */
90
	public function testGivenInvalidPrefixMapping_exceptionIsThrown( array $prefixMapping ) {
91
		$this->expectException( ParameterAssertionException::class );
92
		new PrefixMappingEntityIdParser( $prefixMapping, new ItemIdParser() );
93
	}
94
95
	public function provideInvalidPrefixMapping() {
96
		return [
97
			'no empty-string key in prefix mapping' => [ [] ],
98
			'non-string values in prefix mapping' => [ [ '' => 123 ] ],
99
			'non-string keys in prefix mapping' => [ [ '' => 'foo', 0 => 'wd' ] ],
100
			'prefix mapping values containing colons' => [ [ '' => 'wikidata:' ] ],
101
		];
102
	}
103
104
}
105