/** * Build item resource from a changeset * * @param ChangeSet $changeSet * @return array */ protected function getChangeSetResource(ChangeSet $changeSet) { $hal = ['_links' => ['self' => ['href' => $this->SetLink($changeSet->ID)]], 'ID' => $changeSet->ID, 'Name' => $changeSet->Name, 'Created' => $changeSet->Created, 'LastEdited' => $changeSet->LastEdited, 'State' => $changeSet->State, 'IsInferred' => $changeSet->IsInferred, 'canEdit' => $changeSet->canEdit(), 'canPublish' => false, '_embedded' => ['items' => []]]; // Before presenting the changeset to the client, // synchronise it with new changes. try { $changeSet->sync(); $hal['Description'] = $changeSet->getDescription(); $hal['canPublish'] = $changeSet->canPublish(); foreach ($changeSet->Changes() as $changeSetItem) { if (!$changeSetItem) { continue; } /** @var ChangesetItem $changeSetItem */ $resource = $this->getChangeSetItemResource($changeSetItem); $hal['_embedded']['items'][] = $resource; } $hal['ChangesCount'] = count($hal['_embedded']['items']); // An unexpected data exception means that the database is corrupt } catch (UnexpectedDataException $e) { $hal['Description'] = 'Corrupt database! ' . $e->getMessage(); $hal['ChangesCount'] = '-'; } return $hal; }
public function testPublish() { $this->publishAllFixtures(); $base = $this->objFromFixture(ChangeSetTest_Base::class, 'base'); $baseID = $base->ID; $baseBefore = $base->Version; $end1 = $this->objFromFixture(ChangeSetTest_End::class, 'end1'); $end1ID = $end1->ID; $end1Before = $end1->Version; // Create a new changest $changeset = new ChangeSet(); $changeset->write(); $changeset->addObject($base); $changeset->addObject($end1); // Make a lot of changes // - ChangeSetTest_Base.base modified // - ChangeSetTest_End.end1 deleted // - new ChangeSetTest_Mid added $base->Foo = 343; $base->write(); $baseAfter = $base->Version; $midNew = new ChangeSetTest_Mid(); $midNew->Bar = 39; $midNew->write(); $midNewID = $midNew->ID; $midNewAfter = $midNew->Version; $end1->delete(); $changeset->addObject($midNew); // Publish $this->logInWithPermission('ADMIN'); $this->assertTrue($changeset->canPublish()); $this->assertTrue($changeset->isSynced()); $changeset->publish(); $this->assertEquals(ChangeSet::STATE_PUBLISHED, $changeset->State); // Check each item has the correct before/after version applied $baseChange = $changeset->Changes()->filter(['ObjectClass' => ChangeSetTest_Base::class, 'ObjectID' => $baseID])->first(); $this->assertEquals((int) $baseBefore, (int) $baseChange->VersionBefore); $this->assertEquals((int) $baseAfter, (int) $baseChange->VersionAfter); $this->assertEquals((int) $baseChange->VersionBefore + 1, (int) $baseChange->VersionAfter); $this->assertEquals((int) $baseChange->VersionAfter, (int) Versioned::get_versionnumber_by_stage(ChangeSetTest_Base::class, Versioned::LIVE, $baseID)); $end1Change = $changeset->Changes()->filter(['ObjectClass' => ChangeSetTest_End::class, 'ObjectID' => $end1ID])->first(); $this->assertEquals((int) $end1Before, (int) $end1Change->VersionBefore); $this->assertEquals(0, (int) $end1Change->VersionAfter); $this->assertEquals(0, (int) Versioned::get_versionnumber_by_stage(ChangeSetTest_End::class, Versioned::LIVE, $end1ID)); $midNewChange = $changeset->Changes()->filter(['ObjectClass' => ChangeSetTest_Mid::class, 'ObjectID' => $midNewID])->first(); $this->assertEquals(0, (int) $midNewChange->VersionBefore); $this->assertEquals((int) $midNewAfter, (int) $midNewChange->VersionAfter); $this->assertEquals((int) $midNewAfter, (int) Versioned::get_versionnumber_by_stage(ChangeSetTest_Mid::class, Versioned::LIVE, $midNewID)); // Test trying to re-publish is blocked $this->setExpectedException('BadMethodCallException', "ChangeSet can't be published if it has been already published or reverted."); $changeset->publish(); }
/** * Build item resource from a changeset * * @param ChangeSet $changeSet * @return array */ protected function getChangeSetResource(ChangeSet $changeSet) { // Before presenting the changeset to the client, // synchronise it with new changes. $changeSet->sync(); $hal = ['_links' => ['self' => ['href' => $this->SetLink($changeSet->ID)]], 'ID' => $changeSet->ID, 'Name' => $changeSet->Name, 'Description' => $changeSet->getDescription(), 'Created' => $changeSet->Created, 'LastEdited' => $changeSet->LastEdited, 'State' => $changeSet->State, 'canEdit' => $changeSet->canEdit(), 'canPublish' => $changeSet->canPublish(), '_embedded' => ['items' => []]]; foreach ($changeSet->Changes() as $changeSetItem) { if (!$changeSetItem) { continue; } /** @var ChangesetItem $changeSetItem */ $resource = $this->getChangeSetItemResource($changeSetItem); $hal['_embedded']['items'][] = $resource; } $hal['ChangesCount'] = count($hal['_embedded']['items']); return $hal; }