Passed
Push — master ( 09bf08...d6f936 )
by Marius
01:27
created

SnakDeserializerTest   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 191
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 11
dl 0
loc 191
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A buildDeserializer() 0 8 1
A deserializableProvider() 0 26 1
A nonDeserializableProvider() 0 20 1
A deserializationProvider() 0 38 1
A testInvalidSerialization() 0 4 1
A invalidDeserializationProvider() 0 15 1
A testDeserializePropertyIdFilterItemId() 0 9 1
A testDeserializeBadPropertyId() 0 9 1
A testGivenInvalidDataValue_unDeserializableValueIsConstructed() 0 15 1
A testGivenInvalidDataValue_unDeserializableValueWithErrorText() 0 17 1
A assertSnakHasUnDeserializableValue() 0 13 1
1
<?php
2
3
namespace Tests\Wikibase\DataModel\Deserializers;
4
5
use DataValues\Deserializers\DataValueDeserializer;
6
use DataValues\StringValue;
7
use DataValues\UnDeserializableValue;
8
use Deserializers\Exceptions\DeserializationException;
9
use Deserializers\Exceptions\InvalidAttributeException;
10
use Wikibase\DataModel\Deserializers\SnakDeserializer;
11
use Wikibase\DataModel\Entity\BasicEntityIdParser;
12
use Wikibase\DataModel\Entity\PropertyId;
13
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
14
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
15
use Wikibase\DataModel\Snak\PropertyValueSnak;
16
17
/**
18
 * @covers Wikibase\DataModel\Deserializers\SnakDeserializer
19
 *
20
 * @license GPL-2.0+
21
 * @author Thomas Pellissier Tanon
22
 */
23
class SnakDeserializerTest extends DispatchableDeserializerTest {
24
25
	protected function buildDeserializer() {
26
		return new SnakDeserializer(
27
			new BasicEntityIdParser(),
28
			new DataValueDeserializer( [
29
				'string' => StringValue::class,
30
			] )
31
		);
32
	}
33
34
	public function deserializableProvider() {
35
		return [
36
			[
37
				[
38
					'snaktype' => 'novalue',
39
					'property' => 'P42'
40
				]
41
			],
42
			[
43
				[
44
					'snaktype' => 'somevalue',
45
					'property' => 'P42'
46
				]
47
			],
48
			[
49
				[
50
					'snaktype' => 'value',
51
					'property' => 'P42',
52
					'datavalue' => [
53
						'type' => 'string',
54
						'value' => 'hax'
55
					]
56
				]
57
			],
58
		];
59
	}
60
61
	public function nonDeserializableProvider() {
62
		return [
63
			[
64
				42
65
			],
66
			[
67
				[]
68
			],
69
			[
70
				[
71
					'id' => 'P10'
72
				]
73
			],
74
			[
75
				[
76
					'snaktype' => '42value'
77
				]
78
			],
79
		];
80
	}
81
82
	public function deserializationProvider() {
83
		return [
84
			[
85
				new PropertyNoValueSnak( 42 ),
86
				[
87
					'snaktype' => 'novalue',
88
					'property' => 'P42',
89
					'hash' => '5c33520fbfb522444868b4168a35d4b919370018'
90
				]
91
			],
92
			[
93
				new PropertySomeValueSnak( 42 ),
94
				[
95
					'snaktype' => 'somevalue',
96
					'property' => 'P42'
97
				]
98
			],
99
			[
100
				new PropertyValueSnak( 42, new StringValue( 'hax' ) ),
101
				[
102
					'snaktype' => 'value',
103
					'property' => 'P42',
104
					'datavalue' => [
105
						'type' => 'string',
106
						'value' => 'hax'
107
					]
108
				]
109
			],
110
			[
111
				new PropertyNoValueSnak( 42 ),
112
				[
113
					'snaktype' => 'novalue',
114
					'property' => 'P42',
115
					'hash' => 'not a valid hash'
116
				]
117
			],
118
		];
119
	}
120
121
	/**
122
	 * @dataProvider invalidDeserializationProvider
123
	 */
124
	public function testInvalidSerialization( $serialization ) {
125
		$this->setExpectedException( DeserializationException::class );
126
		$this->buildDeserializer()->deserialize( $serialization );
127
	}
128
129
	public function invalidDeserializationProvider() {
130
		return [
131
			[
132
				[
133
					'snaktype' => 'somevalue'
134
				]
135
			],
136
			[
137
				[
138
					'snaktype' => 'value',
139
					'property' => 'P42'
140
				]
141
			],
142
		];
143
	}
144
145
	public function testDeserializePropertyIdFilterItemId() {
146
		$deserializer = new SnakDeserializer( new BasicEntityIdParser(), new DataValueDeserializer() );
147
148
		$this->setExpectedException( InvalidAttributeException::class );
149
		$deserializer->deserialize( [
150
			'snaktype' => 'somevalue',
151
			'property' => 'Q42'
152
		] );
153
	}
154
155
	public function testDeserializeBadPropertyId() {
156
		$deserializer = new SnakDeserializer( new BasicEntityIdParser(), new DataValueDeserializer() );
157
158
		$this->setExpectedException( InvalidAttributeException::class );
159
		$deserializer->deserialize( [
160
			'snaktype' => 'somevalue',
161
			'property' => 'xyz'
162
		] );
163
	}
164
165
	public function testGivenInvalidDataValue_unDeserializableValueIsConstructed() {
166
		$serialization = [
167
			'snaktype' => 'value',
168
			'property' => 'P42',
169
			'datavalue' => [
170
				'type' => 'string',
171
				'value' => 1337
172
			]
173
		];
174
175
		$snak = $this->buildDeserializer()->deserialize( $serialization );
176
177
		$this->assertInstanceOf( PropertyValueSnak::class, $snak );
178
		$this->assertSnakHasUnDeserializableValue( $snak );
179
	}
180
181
	public function testGivenInvalidDataValue_unDeserializableValueWithErrorText() {
182
		$serialization = [
183
			'snaktype' => 'value',
184
			'property' => 'P42',
185
			'datavalue' => [
186
				'type' => 'string',
187
				'value' => 1337,
188
				'error' => 'omg, an error!'
189
			]
190
		];
191
192
		$snak = $this->buildDeserializer()->deserialize( $serialization );
193
194
		$expectedValue = new UnDeserializableValue( 1337, 'string', 'omg, an error!' );
195
196
		$this->assertTrue( $snak->getDataValue()->equals( $expectedValue ) );
197
	}
198
199
	private function assertSnakHasUnDeserializableValue( PropertyValueSnak $snak ) {
200
		$this->assertEquals( new PropertyId( 'P42' ), $snak->getPropertyId() );
201
202
		$dataValue = $snak->getDataValue();
203
204
		/**
205
		 * @var UnDeserializableValue $dataValue
206
		 */
207
		$this->assertInstanceOf( UnDeserializableValue::class, $dataValue );
208
209
		$this->assertEquals( $dataValue->getTargetType(), 'string' );
210
		$this->assertEquals( $dataValue->getValue(), 1337 );
211
	}
212
213
}
214