Completed
Push — master ( e429fa...789203 )
by Daniel
25s
created

ItemPatcherTest::testSiteLinksArePatched()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 26
rs 8.8571
cc 1
eloc 17
nc 1
nop 0
1
<?php
2
3
namespace Wikibase\DataModel\Services\Tests\Diff;
4
5
use Diff\DiffOp\Diff\Diff;
6
use Diff\DiffOp\DiffOpAdd;
7
use Diff\DiffOp\DiffOpChange;
8
use Diff\DiffOp\DiffOpRemove;
9
use PHPUnit_Framework_TestCase;
10
use Wikibase\DataModel\Services\Diff\ItemDiff;
11
use Wikibase\DataModel\Services\Diff\ItemPatcher;
12
use Wikibase\DataModel\Entity\Item;
13
use Wikibase\DataModel\Entity\Property;
14
use Wikibase\DataModel\SiteLink;
15
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
16
use Wikibase\DataModel\Statement\Statement;
17
18
/**
19
 * @covers Wikibase\DataModel\Services\Diff\ItemPatcher
20
 *
21
 * @license GPL-2.0+
22
 * @author Jeroen De Dauw < [email protected] >
23
 */
24
class ItemPatcherTest extends PHPUnit_Framework_TestCase {
25
26
	public function testGivenEmptyDiff_itemIsReturnedAsIs() {
27
		$item = new Item();
28
		$item->getFingerprint()->setLabel( 'en', 'foo' );
29
		$item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'bar' );
30
31
		$patchedItem = $this->getPatchedItem( $item, new ItemDiff() );
32
33
		$this->assertInstanceOf( 'Wikibase\DataModel\Entity\Item', $patchedItem );
34
		$this->assertTrue( $item->equals( $patchedItem ) );
35
	}
36
37
	private function getPatchedItem( Item $item, ItemDiff $patch ) {
38
		$patchedItem = $item->copy();
39
40
		$patcher = new ItemPatcher();
41
		$patcher->patchEntity( $patchedItem, $patch );
42
43
		return $patchedItem;
44
	}
45
46
	public function testCanPatchEntityType() {
47
		$patcher = new ItemPatcher();
48
		$this->assertTrue( $patcher->canPatchEntityType( 'item' ) );
49
		$this->assertFalse( $patcher->canPatchEntityType( 'property' ) );
50
		$this->assertFalse( $patcher->canPatchEntityType( '' ) );
51
		$this->assertFalse( $patcher->canPatchEntityType( null ) );
52
	}
53
54
	public function testGivenNonItem_exceptionIsThrown() {
55
		$patcher = new ItemPatcher();
56
57
		$this->setExpectedException( 'InvalidArgumentException' );
58
		$patcher->patchEntity( Property::newFromType( 'kittens' ), new ItemDiff() );
59
	}
60
61
	public function testPatchesLabels() {
62
		$item = new Item();
63
		$item->getFingerprint()->setLabel( 'en', 'foo' );
64
		$item->getFingerprint()->setLabel( 'de', 'bar' );
65
66
		$patch = new ItemDiff( array(
67
			'label' => new Diff( array(
68
				'en' => new DiffOpChange( 'foo', 'spam' ),
69
				'nl' => new DiffOpAdd( 'baz' ),
70
			) )
71
		) );
72
73
		$patchedItem = $this->getPatchedItem( $item, $patch );
74
75
		$this->assertSame(
76
			array(
77
				'en' => 'spam',
78
				'de' => 'bar',
79
				'nl' => 'baz',
80
			),
81
			$patchedItem->getFingerprint()->getLabels()->toTextArray()
82
		);
83
	}
84
85
	public function testDescriptionsArePatched() {
86
		$property = new Item();
87
		$property->setDescription( 'en', 'foo' );
88
		$property->setDescription( 'de', 'bar' );
89
90
		$patch = new ItemDiff( array(
91
			'description' => new Diff( array(
92
				'en' => new DiffOpChange( 'foo', 'spam' ),
93
				'nl' => new DiffOpAdd( 'baz' ),
94
			) ),
95
		) );
96
97
		$patcher = new ItemPatcher();
98
		$patcher->patchEntity( $property, $patch );
99
100
		$this->assertSame( array(
101
			'en' => 'spam',
102
			'de' => 'bar',
103
			'nl' => 'baz',
104
		), $property->getFingerprint()->getDescriptions()->toTextArray() );
105
	}
106
107
	public function testStatementsArePatched() {
108
		$removedStatement = new Statement( new PropertyNoValueSnak( 1 ), null, null, 's1' );
109
		$addedStatement = new Statement( new PropertyNoValueSnak( 2 ), null, null, 's2' );
110
111
		$item = new Item();
112
		$item->getStatements()->addStatement( $removedStatement );
113
114
		$patch = new ItemDiff( array(
115
			'claim' => new Diff( array(
116
				's1' => new DiffOpRemove( $removedStatement ),
117
				's2' => new DiffOpAdd( $addedStatement ),
118
			) ),
119
		) );
120
121
		$expected = new Item();
122
		$expected->getStatements()->addStatement( $addedStatement );
123
124
		$patcher = new ItemPatcher();
125
		$patcher->patchEntity( $item, $patch );
126
		$this->assertTrue( $expected->equals( $item ) );
127
	}
128
129
	public function testSiteLinksArePatched() {
130
		$removedSiteLink = new SiteLink( 'rewiki', 'Removed' );
131
		$addedSiteLink = new SiteLink( 'adwiki', 'Added' );
132
133
		$item = new Item();
134
		$item->getSiteLinkList()->addSiteLink( $removedSiteLink );
135
136
		$patch = new ItemDiff( array(
137
			'links' => new Diff( array(
138
				'rewiki' => new Diff( array(
139
					'name' => new DiffOpRemove( 'Removed' ),
140
				) ),
141
				'adwiki' => new Diff( array(
142
					'name' => new DiffOpAdd( 'Added' ),
143
					'badges' => new Diff(),
144
				) ),
145
			) ),
146
		) );
147
148
		$expected = new Item();
149
		$expected->getSiteLinkList()->addSiteLink( $addedSiteLink );
150
151
		$patcher = new ItemPatcher();
152
		$patcher->patchEntity( $item, $patch );
153
		$this->assertTrue( $expected->equals( $item ) );
154
	}
155
156
}
157