Completed
Pull Request — master (#250)
by Daniel
08:40
created

testDeserializeBadPropertyId()   A

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 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
				new PropertyNoValueSnak( new PropertyId( 'foo:P42' ) ),
120
				[
121
					'snaktype' => 'novalue',
122
					'property' => 'foo:P42',
123
					'hash' => 'not a valid hash'
124
				]
125
			],
126
		];
127
	}
128
129
	/**
130
	 * @dataProvider invalidDeserializationProvider
131
	 */
132
	public function testInvalidSerialization( $serialization ) {
133
		$this->setExpectedException( DeserializationException::class );
134
		$this->buildDeserializer()->deserialize( $serialization );
135
	}
136
137
	public function invalidDeserializationProvider() {
138
		return [
139
			[
140
				[
141
					'snaktype' => 'somevalue'
142
				]
143
			],
144
			[
145
				[
146
					'snaktype' => 'value',
147
					'property' => 'P42'
148
				]
149
			],
150
		];
151
	}
152
153
	public function testDeserializePropertyIdFilterItemId() {
154
		$deserializer = new SnakDeserializer( new BasicEntityIdParser(), new DataValueDeserializer() );
155
156
		$this->setExpectedException( InvalidAttributeException::class );
157
		$deserializer->deserialize( [
158
			'snaktype' => 'somevalue',
159
			'property' => 'Q42'
160
		] );
161
	}
162
163
	public function testDeserializeBadPropertyId() {
164
		$deserializer = new SnakDeserializer( new BasicEntityIdParser(), new DataValueDeserializer() );
165
166
		$this->setExpectedException( InvalidAttributeException::class );
167
		$deserializer->deserialize( [
168
			'snaktype' => 'somevalue',
169
			'property' => 'xyz'
170
		] );
171
	}
172
173
	public function testGivenInvalidDataValue_unDeserializableValueIsConstructed() {
174
		$serialization = [
175
			'snaktype' => 'value',
176
			'property' => 'P42',
177
			'datavalue' => [
178
				'type' => 'string',
179
				'value' => 1337
180
			]
181
		];
182
183
		$snak = $this->buildDeserializer()->deserialize( $serialization );
184
185
		$this->assertInstanceOf( PropertyValueSnak::class, $snak );
186
		$this->assertSnakHasUnDeserializableValue( $snak );
187
	}
188
189
	public function testGivenInvalidDataValue_unDeserializableValueWithErrorText() {
190
		$serialization = [
191
			'snaktype' => 'value',
192
			'property' => 'P42',
193
			'datavalue' => [
194
				'type' => 'string',
195
				'value' => 1337,
196
				'error' => 'omg, an error!'
197
			]
198
		];
199
200
		$snak = $this->buildDeserializer()->deserialize( $serialization );
201
202
		$expectedValue = new UnDeserializableValue( 1337, 'string', 'omg, an error!' );
203
204
		$this->assertTrue( $snak->getDataValue()->equals( $expectedValue ) );
205
	}
206
207
	private function assertSnakHasUnDeserializableValue( PropertyValueSnak $snak ) {
208
		$this->assertEquals( new PropertyId( 'P42' ), $snak->getPropertyId() );
209
210
		$dataValue = $snak->getDataValue();
211
212
		/**
213
		 * @var UnDeserializableValue $dataValue
214
		 */
215
		$this->assertInstanceOf( UnDeserializableValue::class, $dataValue );
216
217
		$this->assertEquals( $dataValue->getTargetType(), 'string' );
218
		$this->assertEquals( $dataValue->getValue(), 1337 );
219
	}
220
221
}
222