From 4203d40c1f6f4ac8d12174a2d795cb0706f312b8 Mon Sep 17 00:00:00 2001 From: dantleech Date: Sat, 13 Dec 2014 10:37:26 +0100 Subject: [PATCH] Multivalue reference tests --- fixtures/10_Writing/mixinreferenceable.xml | 106 ++++++++++++++++++++ tests/10_Writing/MixinReferenceableTest.php | 106 +++++++++++++++----- 2 files changed, 188 insertions(+), 24 deletions(-) create mode 100644 fixtures/10_Writing/mixinreferenceable.xml diff --git a/fixtures/10_Writing/mixinreferenceable.xml b/fixtures/10_Writing/mixinreferenceable.xml new file mode 100644 index 00000000..5203aee0 --- /dev/null +++ b/fixtures/10_Writing/mixinreferenceable.xml @@ -0,0 +1,106 @@ + + + + nt:unstructured + + + 2009-04-27T13:00:54.082+02:00 + + + + + nt:unstructured + + + + nt:unstructured + + + + + nt:unstructured + + + + + + + nt:unstructured + + + + + nt:unstructured + + + + + nt:unstructured + + + + + + + nt:unstructured + + + + + nt:unstructured + + + mix:referenceable + + + 842e61c0-09ab-42a9-87c0-308ccc90e6f4 + + + + + nt:unstructured + + + + + + + nt:unstructured + + + + + nt:unstructured + + + mix:referenceable + + + 242e61c0-09ab-42a9-82c0-398cc690e6f4 + + + + + nt:unstructured + + + + + nt:unstructured + + + + + + + nt:unstructured + + + + + + nt:unstructured + + + + diff --git a/tests/10_Writing/MixinReferenceableTest.php b/tests/10_Writing/MixinReferenceableTest.php index c72afa6e..275fd89f 100644 --- a/tests/10_Writing/MixinReferenceableTest.php +++ b/tests/10_Writing/MixinReferenceableTest.php @@ -1,6 +1,8 @@ renewSession(); // discard changes @@ -22,11 +29,11 @@ public function setUp() public function testReferenceOnNonReferenceableNode() { // Load a non-referenceable node - $referenced_node = $this->session->getNode('/tests_general_base/emptyExample'); + $nonReferenceableNode = $this->node->getNode('non-referenceable'); // Try to reference it - $source_node = $this->session->getNode('/tests_general_base/index.txt/jcr:content'); - $source_node->setProperty('reference', $referenced_node, \PHPCR\PropertyType::WEAKREFERENCE); + $sourceNode = $this->node->getNode('node'); + $sourceNode->setProperty('reference', $nonReferenceableNode, \PHPCR\PropertyType::WEAKREFERENCE); $this->session->save(); } @@ -36,24 +43,24 @@ public function testReferenceOnNonReferenceableNode() public function testReferenceOnNewlyReferenceableNode() { // Load a non-referenceable node and make it referenceable - $referenced_node = $this->session->getNode('/tests_general_base/emptyExample'); - $referenced_node->addMixin('mix:referenceable'); + $referencedNode = $this->node->getNode('node'); + $referencedNode->addMixin('mix:referenceable'); // Re-read the node to be sure it has a UUID $this->saveAndRenewSession(); - $referenced_node = $this->session->getNode('/tests_general_base/emptyExample'); + $referencedNode = $this->node->getNode('node'); // Reference it from another node - $source_node = $this->session->getNode('/tests_general_base/index.txt/jcr:content'); - $source_node->setProperty('reference', $referenced_node, \PHPCR\PropertyType::WEAKREFERENCE); + $sourceNode = $this->node->getNode('other-node'); + $sourceNode->setProperty('reference', $referencedNode, \PHPCR\PropertyType::WEAKREFERENCE); $this->session->save(); - $this->assertInstanceOf('PHPCR\NodeInterface', $source_node->getPropertyValue('reference')); + $this->assertInstanceOf('PHPCR\NodeInterface', $sourceNode->getPropertyValue('reference')); // referrers only required to work once save happened - $this->assertCount(0, $referenced_node->getReferences()); - $this->assertCount(1, $referenced_node->getWeakReferences()); + $this->assertCount(0, $referencedNode->getReferences()); + $this->assertCount(1, $referencedNode->getWeakReferences()); } /** @@ -62,14 +69,14 @@ public function testReferenceOnNewlyReferenceableNode() public function testReferenceOnReferenceableNode() { // Load a referenceable node - $referenced_node = $this->session->getNode('/tests_general_base/idExample'); + $referencedNode = $this->node->getNode('referenceable'); // Reference it from another node - $source_node = $this->session->getNode('/tests_general_base/index.txt/jcr:content'); - $source_node->setProperty('oreference', $referenced_node, \PHPCR\PropertyType::WEAKREFERENCE); + $sourceNode = $this->node->getNode('node'); + $sourceNode->setProperty('oreference', $referencedNode, \PHPCR\PropertyType::WEAKREFERENCE); $this->session->save(); - $this->assertInstanceOf('PHPCR\NodeInterface', $source_node->getPropertyValue('oreference')); + $this->assertInstanceOf('PHPCR\NodeInterface', $sourceNode->getPropertyValue('oreference')); } /** @@ -77,24 +84,75 @@ public function testReferenceOnReferenceableNode() */ public function testUpdateReference() { - $referenced1 = $this->session->getNode('/tests_general_base/emptyExample'); + $referenced1 = $this->node->getNode('node'); $referenced1->addMixin('mix:referenceable'); $this->session->save(); // Load a referenceable node - $referenced2 = $this->session->getNode('/tests_general_base/idExample'); + $referenced2 = $this->node->getNode('referenceable'); // Reference it from another node - $source_node = $this->session->getNode('/tests_general_base/index.txt/jcr:content'); + $sourceNode = $this->node->getNode('other-node'); + + $sourceNode->setProperty('reference', $referenced1, \PHPCR\PropertyType::WEAKREFERENCE); + $this->session->save(); + $sourceNode->setProperty('reference', $referenced2, \PHPCR\PropertyType::WEAKREFERENCE); + $this->session->save(); + $this->assertSame($referenced2, $sourceNode->getPropertyValue('reference')); + + $this->renewSession(); + $referenced2 = $this->node->getNode('referenceable'); + $this->assertSame($referenced2, $this->node->getNode('other-node')->getProperty('reference')->getValue()); + } + + public function testMultiValueReference() + { + $this->doTestMultiValueReference( + array('one', 'two', 'three'), + array('one', 'two', 'one', 'one', 'two', 'three'), + PropertyType::REFERENCE + ); + } + + public function testMultiValueWeakReference() + { + $this->doTestMultiValueReference( + array('one', 'two', 'three'), + array('one', 'two', 'one', 'one', 'two', 'three'), + PropertyType::WEAKREFERENCE + ); + } + + private function doTestMultiValueReference($nodeNames, $nodeCollectionNames, $referenceType) + { + $baseNode = $this->node; + $nodes = array(); + foreach ($nodeNames as $nodeName) { + $node = $baseNode->addNode($nodeName); + $node->addMixin('mix:referenceable'); + $nodes[$nodeName] = $node; + } - $source_node->setProperty('reference', $referenced1, \PHPCR\PropertyType::WEAKREFERENCE); $this->session->save(); - $source_node->setProperty('reference', $referenced2, \PHPCR\PropertyType::WEAKREFERENCE); + + $referrer = $baseNode->addNode('referrer'); + + $nodeCollection = array(); + + foreach ($nodeCollectionNames as $nodeCollectionName) { + $nodeCollection[] = $nodes[$nodeCollectionName]; + } + $referrer->setProperty('references', $nodeCollection, $referenceType); + $this->session->save(); - $this->assertSame($referenced2, $source_node->getPropertyValue('reference')); - $session = $this->renewSession(); - $referenced2 = $session->getNode('/tests_general_base/idExample'); - $this->assertSame($referenced2, $session->getProperty('/tests_general_base/index.txt/jcr:content/reference')->getValue()); + $this->renewSession(); + $referrer = $this->node->getNode('referrer'); + $values = $referrer->getProperty('references'); + + foreach ($values as $referencedNode) { + $name = array_shift($nodeCollectionNames); + $this->assertSame($name, $referencedNode->getName()); + } } }