Skip to content

Commit

Permalink
fixed flipped assertion values in TableTest. Changed assertEquals to …
Browse files Browse the repository at this point in the history
…assertCount where applicable. Methods link, unlink and replaceLinks now clean the entity when finished. dirty verification added in TableTest for link, unlink and replaceLinks tests. Switched to pure arrays in HasMany, cause of unnecessary use of Collection. Improved PHP doc.
  • Loading branch information
mylux committed Oct 18, 2015
1 parent f458bc2 commit 6b4bfa1
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 16 deletions.
18 changes: 14 additions & 4 deletions src/ORM/Association/HasMany.php
Expand Up @@ -187,6 +187,7 @@ public function saveAssociated(EntityInterface $entity, array $options = [])
* the source entity's property corresponding to this association object.
*
* This method does not check link uniqueness.
* Changes are persisted in the database and also in the source entity.
*
* ### Example:
*
Expand All @@ -211,9 +212,14 @@ public function link(EntityInterface $sourceEntity, array $targetEntities, array
$this->saveStrategy(self::SAVE_APPEND);
$property = $this->property();

$currentEntities = (new Collection((array)$sourceEntity->get($property)))->append($targetEntities);
$currentEntities = array_unique(
array_merge(
(array)$sourceEntity->get($property),
$targetEntities
)
);

$sourceEntity->set($property, array_unique($currentEntities->toList()));
$sourceEntity->set($property, $currentEntities);

$savedEntity = $this->saveAssociated($sourceEntity);

Expand All @@ -223,7 +229,7 @@ public function link(EntityInterface $sourceEntity, array $targetEntities, array

if ($ok) {
$sourceEntity->set($property, $savedEntity->get($property));
$sourceEntity->clean($property);
$sourceEntity->clean();
}

return $ok;
Expand All @@ -237,6 +243,8 @@ public function link(EntityInterface $sourceEntity, array $targetEntities, array
* By default this method will also unset each of the entity objects stored inside
* the source entity.
*
* Changes are persisted in the database and also in the source entity.
*
* ### Example:
*
* ```
Expand All @@ -263,7 +271,7 @@ public function unlink(EntityInterface $sourceEntity, array $targetEntities, $cl
{
$foreignKey = (array)$this->foreignKey();
$target = $this->target();
$targetPrimaryKey = array_merge((array)$target->primaryKey(), (array)$foreignKey);
$targetPrimaryKey = array_merge((array)$target->primaryKey(), $foreignKey);
$property = $this->property();

$conditions = [
Expand All @@ -288,6 +296,8 @@ function ($assoc) use ($targetEntities) {
->toList()
);
}

$sourceEntity->clean();
}

/**
Expand Down
29 changes: 17 additions & 12 deletions tests/TestCase/ORM/TableTest.php
Expand Up @@ -1810,13 +1810,13 @@ public function testSaveReplaceSaveStrategyNotAdding()

$entity = $authors->save($entity, ['associated' => ['Articles']]);
$sizeArticles = count($entity->articles);
$this->assertEquals($sizeArticles, $authors->Articles->find('all')->where(['author_id' => $entity['id']])->count());
$this->assertCount($sizeArticles, $authors->Articles->find('all')->where(['author_id' => $entity['id']]));

$entity->set('articles', []);

$entity = $authors->save($entity, ['associated' => ['Articles']]);

$this->assertEquals(0, $authors->Articles->find('all')->where(['author_id' => $entity['id']])->count());
$this->assertCount(0, $authors->Articles->find('all')->where(['author_id' => $entity['id']]));
}

/**
Expand Down Expand Up @@ -3916,8 +3916,9 @@ public function testLinkHasMany()
$this->assertTrue($authors->Articles->link($author, $newArticles));


$this->assertEquals($authors->Articles->findAllByAuthorId($author->id)->count(), $sizeArticles);
$this->assertEquals(count($author->articles), $sizeArticles);
$this->assertCount($sizeArticles, $authors->Articles->findAllByAuthorId($author->id));
$this->assertCount($sizeArticles, $author->articles);
$this->assertFalse($author->dirty('articles'));
}

/**
Expand Down Expand Up @@ -3967,8 +3968,9 @@ public function testLinkHasManyReplaceSaveStrategy()

$sizeArticles++;

$this->assertEquals($authors->Articles->findAllByAuthorId($author->id)->count(), $sizeArticles);
$this->assertEquals($sizeArticles, count($author->articles));
$this->assertCount($sizeArticles, $authors->Articles->findAllByAuthorId($author->id));
$this->assertCount($sizeArticles, $author->articles);
$this->assertFalse($author->dirty('articles'));
}

/**
Expand Down Expand Up @@ -4021,8 +4023,9 @@ public function testLinkHasManyExisting()

$sizeArticles++;

$this->assertEquals($sizeArticles, $authors->Articles->findAllByAuthorId($author->id)->count());
$this->assertEquals($sizeArticles, count($author->articles));
$this->assertCount($sizeArticles, $authors->Articles->findAllByAuthorId($author->id));
$this->assertCount($sizeArticles, $author->articles);
$this->assertFalse($author->dirty('articles'));
}

/**
Expand Down Expand Up @@ -4068,8 +4071,9 @@ public function testUnlinkHasManyCleanProperty()

$authors->Articles->unlink($author, $articlesToUnlink);

$this->assertEquals($authors->Articles->findAllByAuthorId($author->id)->count(), $sizeArticles - count($articlesToUnlink));
$this->assertEquals(count($author->articles), $sizeArticles - count($articlesToUnlink));
$this->assertCount($sizeArticles - count($articlesToUnlink), $authors->Articles->findAllByAuthorId($author->id));
$this->assertCount($sizeArticles - count($articlesToUnlink), $author->articles);
$this->assertFalse($author->dirty('articles'));
}

/**
Expand Down Expand Up @@ -4115,8 +4119,9 @@ public function testUnlinkHasManyNotCleanProperty()

$authors->Articles->unlink($author, $articlesToUnlink, false);

$this->assertEquals($authors->Articles->findAllByAuthorId($author->id)->count(), $sizeArticles - count($articlesToUnlink));
$this->assertEquals(count($author->articles), $sizeArticles);
$this->assertCount($sizeArticles - count($articlesToUnlink), $authors->Articles->findAllByAuthorId($author->id));
$this->assertCount($sizeArticles, $author->articles);
$this->assertFalse($author->dirty('articles'));
}

/**
Expand Down

0 comments on commit 6b4bfa1

Please sign in to comment.