3 namespace MediaWiki\Tests\Storage
;
5 use MediaWiki\Storage\RevisionSlots
;
6 use MediaWiki\Storage\RevisionSlotsUpdate
;
7 use MediaWiki\Storage\RevisionAccessException
;
8 use MediaWiki\Storage\SlotRecord
;
13 * @covers \MediaWiki\Storage\RevisionSlotsUpdate
15 class RevisionSlotsUpdateTest
extends MediaWikiTestCase
{
17 public function provideNewFromRevisionSlots() {
18 $slotA = SlotRecord
::newUnsaved( 'A', new WikitextContent( 'A' ) );
19 $slotB = SlotRecord
::newUnsaved( 'B', new WikitextContent( 'B' ) );
20 $slotC = SlotRecord
::newUnsaved( 'C', new WikitextContent( 'C' ) );
22 $slotB2 = SlotRecord
::newUnsaved( 'B', new WikitextContent( 'B2' ) );
24 $parentSlots = new RevisionSlots( [
30 $newSlots = new RevisionSlots( [
35 yield
[ $newSlots, null, [ 'A', 'B' ], [] ];
36 yield
[ $newSlots, $parentSlots, [ 'B' ], [ 'C' ] ];
40 * @dataProvider provideNewFromRevisionSlots
42 * @param RevisionSlots $newSlots
43 * @param RevisionSlots $parentSlots
47 public function testNewFromRevisionSlots(
48 RevisionSlots
$newSlots,
49 RevisionSlots
$parentSlots = null,
53 $update = RevisionSlotsUpdate
::newFromRevisionSlots( $newSlots, $parentSlots );
55 $this->assertEquals( $modified, $update->getModifiedRoles() );
56 $this->assertEquals( $removed, $update->getRemovedRoles() );
58 foreach ( $modified as $role ) {
59 $this->assertSame( $newSlots->getSlot( $role ), $update->getModifiedSlot( $role ) );
63 public function testConstructor() {
64 $update = new RevisionSlotsUpdate();
66 $this->assertEmpty( $update->getModifiedRoles() );
67 $this->assertEmpty( $update->getRemovedRoles() );
69 $slotA = SlotRecord
::newUnsaved( 'A', new WikitextContent( 'A' ) );
70 $update = new RevisionSlotsUpdate( [ 'A' => $slotA ] );
72 $this->assertEquals( [ 'A' ], $update->getModifiedRoles() );
73 $this->assertEmpty( $update->getRemovedRoles() );
75 $update = new RevisionSlotsUpdate( [ 'A' => $slotA ], [ 'X' ] );
77 $this->assertEquals( [ 'A' ], $update->getModifiedRoles() );
78 $this->assertEquals( [ 'X' ], $update->getRemovedRoles() );
81 public function testModifySlot() {
82 $slots = new RevisionSlotsUpdate();
84 $this->assertSame( [], $slots->getModifiedRoles() );
85 $this->assertSame( [], $slots->getRemovedRoles() );
87 $slotA = SlotRecord
::newUnsaved( 'some', new WikitextContent( 'A' ) );
88 $slots->modifySlot( $slotA );
89 $this->assertTrue( $slots->isModifiedSlot( 'some' ) );
90 $this->assertFalse( $slots->isRemovedSlot( 'some' ) );
91 $this->assertSame( $slotA, $slots->getModifiedSlot( 'some' ) );
92 $this->assertSame( [ 'some' ], $slots->getModifiedRoles() );
93 $this->assertSame( [], $slots->getRemovedRoles() );
95 $slotB = SlotRecord
::newUnsaved( 'other', new WikitextContent( 'B' ) );
96 $slots->modifySlot( $slotB );
97 $this->assertTrue( $slots->isModifiedSlot( 'other' ) );
98 $this->assertFalse( $slots->isRemovedSlot( 'other' ) );
99 $this->assertSame( $slotB, $slots->getModifiedSlot( 'other' ) );
100 $this->assertSame( [ 'some', 'other' ], $slots->getModifiedRoles() );
101 $this->assertSame( [], $slots->getRemovedRoles() );
103 // modify slot A again
104 $slots->modifySlot( $slotA );
105 $this->assertArrayEquals( [ 'some', 'other' ], $slots->getModifiedRoles() );
107 // remove modified slot
108 $slots->removeSlot( 'some' );
109 $this->assertSame( [ 'other' ], $slots->getModifiedRoles() );
110 $this->assertSame( [ 'some' ], $slots->getRemovedRoles() );
112 // modify removed slot
113 $slots->modifySlot( $slotA );
114 $this->assertArrayEquals( [ 'some', 'other' ], $slots->getModifiedRoles() );
115 $this->assertSame( [], $slots->getRemovedRoles() );
118 public function testRemoveSlot() {
119 $slots = new RevisionSlotsUpdate();
121 $slotA = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
122 $slots->modifySlot( $slotA );
124 $this->assertSame( [ 'main' ], $slots->getModifiedRoles() );
126 $slots->removeSlot( 'main' );
127 $slots->removeSlot( 'other' );
128 $this->assertSame( [], $slots->getModifiedRoles() );
129 $this->assertSame( [ 'main', 'other' ], $slots->getRemovedRoles() );
130 $this->assertTrue( $slots->isRemovedSlot( 'main' ) );
131 $this->assertTrue( $slots->isRemovedSlot( 'other' ) );
132 $this->assertFalse( $slots->isModifiedSlot( 'main' ) );
134 // removing the same slot again should not trigger an error
135 $slots->removeSlot( 'main' );
137 // getting a slot after removing it should fail
138 $this->setExpectedException( RevisionAccessException
::class );
139 $slots->getModifiedSlot( 'main' );
142 public function testGetModifiedRoles() {
143 $slots = new RevisionSlotsUpdate( [], [ 'xyz' ] );
145 $this->assertSame( [], $slots->getModifiedRoles() );
147 $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
148 $slots->modifyContent( 'foo', new WikitextContent( 'Foo' ) );
149 $this->assertSame( [ 'main', 'foo' ], $slots->getModifiedRoles() );
151 $slots->removeSlot( 'main' );
152 $this->assertSame( [ 'foo' ], $slots->getModifiedRoles() );
155 public function testGetRemovedRoles() {
156 $slotA = SlotRecord
::newUnsaved( 'main', new WikitextContent( 'A' ) );
157 $slots = new RevisionSlotsUpdate( [ $slotA ] );
159 $this->assertSame( [], $slots->getRemovedRoles() );
161 $slots->removeSlot( 'main', new WikitextContent( 'A' ) );
162 $slots->removeSlot( 'foo', new WikitextContent( 'Foo' ) );
164 $this->assertSame( [ 'main', 'foo' ], $slots->getRemovedRoles() );
166 $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
167 $this->assertSame( [ 'foo' ], $slots->getRemovedRoles() );
170 public function provideHasSameUpdates() {
171 $fooX = SlotRecord
::newUnsaved( 'x', new WikitextContent( 'Foo' ) );
172 $barZ = SlotRecord
::newUnsaved( 'z', new WikitextContent( 'Bar' ) );
174 $a = new RevisionSlotsUpdate();
175 $a->modifySlot( $fooX );
176 $a->modifySlot( $barZ );
177 $a->removeSlot( 'Q' );
179 $a2 = new RevisionSlotsUpdate();
180 $a2->modifySlot( $fooX );
181 $a2->modifySlot( $barZ );
182 $a2->removeSlot( 'Q' );
184 $b = new RevisionSlotsUpdate();
185 $b->modifySlot( $barZ );
186 $b->removeSlot( 'Q' );
188 $c = new RevisionSlotsUpdate();
189 $c->modifySlot( $fooX );
190 $c->modifySlot( $barZ );
192 yield
'same instance' => [ $a, $a, true ];
193 yield
'same udpates' => [ $a, $a2, true ];
195 yield
'different modified' => [ $a, $b, false ];
196 yield
'different removed' => [ $a, $c, false ];
200 * @dataProvider provideHasSameUpdates
202 public function testHasSameUpdates( RevisionSlotsUpdate
$a, RevisionSlotsUpdate
$b, $same ) {
203 $this->assertSame( $same, $a->hasSameUpdates( $b ) );
204 $this->assertSame( $same, $b->hasSameUpdates( $a ) );