Skip to content

Commit

Permalink
Add MongoCollection Uniqueness compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
Jurigag committed Mar 9, 2017
1 parent 3cc50bc commit 589795a
Show file tree
Hide file tree
Showing 9 changed files with 634 additions and 3 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ env:
- ZEND_DONT_UNLOAD_MODULES=1
- CC="ccache gcc"
- PATH="$PATH:~/bin"
- PHALCON_VERSION="v3.0.4"
- PHALCON_VERSION="3.1.x"

before_install:
- phpenv config-rm xdebug.ini || true
Expand Down
17 changes: 16 additions & 1 deletion Library/Phalcon/Mvc/MongoCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ public function save()

if (false === $exists) {
$this->_id = $status->getInsertedId();
$this->_dirtyState = self::DIRTY_STATE_PERSISTENT;
}
}

Expand Down Expand Up @@ -388,6 +389,7 @@ public function delete()
$success = true;

$this->fireEvent("afterDelete");
$this->_dirtyState = self::DIRTY_STATE_DETACHED;
}

return $success;
Expand All @@ -407,6 +409,10 @@ protected function _exists($collection)
return false;
}

if (!$this->_dirtyState) {
return true;
}

if (is_object($id)) {
$mongoId = $id;
} else {
Expand All @@ -423,7 +429,15 @@ protected function _exists($collection)
/**
* Perform the count using the function provided by the driver
*/
return $collection->count(["_id"=>$mongoId])>0;
$exists = $collection->count(["_id" => $mongoId]) > 0;

if ($exists) {
$this->_dirtyState = self::DIRTY_STATE_PERSISTENT;
} else {
$this->_dirtyState = self::DIRTY_STATE_TRANSIENT;
}

return $exists;
}

/**
Expand Down Expand Up @@ -505,6 +519,7 @@ public function create()
$result = $collection->insert($data, ['writeConcern' => new WriteConcern(1)]);
if ($result instanceof InsertOneResult && $result->getInsertedId()) {
$success = true;
$this->_dirtyState = self::DIRTY_STATE_PERSISTENT;
$this->_id = $result->getInsertedId();
}

Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
},
"require": {
"php": ">=5.5",
"ext-phalcon": "^3.0",
"ext-phalcon": "^3.1",
"swiftmailer/swiftmailer": "~5.2"
},
"require-dev": {
Expand Down
25 changes: 25 additions & 0 deletions tests/_data/collections/Robots.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace Phalcon\Test\Collections;

use Phalcon\Mvc\MongoCollection;

/**
* Robots Collection
*
* @method static Robots[] find(array $parameters = null)
* @method static Robots findFirst(array $parameters = null)
*
* @property \MongoId _id
* @property string name
* @property string type
* @property int year
* @property string datetime
* @property string deleted
* @property string text
*
* @package Phalcon\Test\Collections
*/
class Robots extends MongoCollection
{
}
39 changes: 39 additions & 0 deletions tests/_data/collections/Users.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
/**
* Created by PhpStorm.
* User: User
* Date: 2017-03-09
* Time: 17:07
*/

namespace Phalcon\Test\Collections;

use Phalcon\Mvc\MongoCollection;
use Phalcon\Validation;
use Phalcon\Validation\Validator\Email;
use Phalcon\Validation\Validator\ExclusionIn;
use Phalcon\Validation\Validator\InclusionIn;
use Phalcon\Validation\Validator\PresenceOf;
use Phalcon\Validation\Validator\Regex;
use Phalcon\Validation\Validator\StringLength;
use Phalcon\Validation\Validator\Uniqueness;

class Users extends MongoCollection
{
public function validation()
{
$validator = new Validation();
$validator
->add('created_at', new PresenceOf())

->add('email', new StringLength(['min' => '7', 'max' => '50']))
->add('email', new Email())
->add('email', new Uniqueness())

->add('status', new ExclusionIn(['domain' => ['P', 'I', 'w']]))
->add('status', new InclusionIn(['domain' => ['A', 'y', 'Z']]))
->add('status', new Regex(['pattern' => '/[A-Z]/']));

return $this->validate($validator);
}
}
38 changes: 38 additions & 0 deletions tests/_support/Helper/CollectionTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Helper;

use Mongo;
use MongoClient;
use Codeception\Actor;
use Phalcon\Mvc\Collection\Manager;

/**
* Collection Initializer
*
* @package Helper
*/
trait CollectionTrait
{
/**
* Executed before each test
*/
protected function setupMongo()
{
if (!extension_loaded('mongodb')) {
$this->markTestSkipped('mongodb extension not loaded');
}

Di::reset();

$di = new Di();
$di->set('mongo', function() {
$dsn = 'mongodb://' . env('TEST_MONGODB_HOST', '127.0.0.1') . ':' . env('TEST_MONGODB_PORT', 27017);
$mongo = new Client($dsn);

return $mongo->selectDatabase(env('TEST_MONGODB_NAME', 'incubator'));
});

$di->set('collectionManager', Manager::class);
}
}
191 changes: 191 additions & 0 deletions tests/unit/Mvc/Collection/Helpers/UniquenessTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
<?php

namespace Phalcon\Test\Mvc\Collection\Helpers;

use Phalcon\Validation;
use Phalcon\Validation\Validator\Uniqueness;
use UnitTester;

trait UniquenessTrait
{
private function testSingleField(UnitTester $I)
{
$validation = new Validation();
$validation->add('type', new Uniqueness());
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
$I->assertTrue($this->robot->save());
$messages = $validation->validate(null, $this->robot);
$I->assertCount(1, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(0, $messages);
}

private function testSingleFieldConvert(UnitTester $I)
{
$validation = new Validation();
$validation->add(
'type',
new Uniqueness(
[
'convert' => function (array $values) {
$values['type'] = 'hydraulic'; // mechanical -> hydraulic
return $values;
},
]
)
);
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
}

private function testSingleFieldWithNull(UnitTester $I)
{
$validation = new Validation();
$validation->add('deleted', new Uniqueness());
$messages = $validation->validate(null, $this->robot);
$I->assertCount(1, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(1, $messages);
$messages = $validation->validate(null, $this->deletedRobot);
$I->assertCount(0, $messages);
}

private function testMultipleFields(UnitTester $I)
{
$validation = new Validation();
$validation->add(['name', 'type'], new Uniqueness());
$messages = $validation->validate(null, $this->robot);
$I->assertCount(1, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(0, $messages);
}

private function testMultipleFieldsConvert(UnitTester $I)
{
$validation = new Validation();
$validation->add(
['name', 'type'],
new Uniqueness(
[
'convert' => function (array $values) {
$values['type'] = 'hydraulic'; // mechanical -> hydraulic
return $values;
},
]
)
);
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
}

private function testMultipleFieldsWithNull(UnitTester $I)
{
$validation = new Validation();
$validation->add(['type', 'deleted'], new Uniqueness());
$messages = $validation->validate(null, $this->robot);
$I->assertCount(1, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(0, $messages);
$messages = $validation->validate(null, $this->deletedRobot);
$I->assertCount(0, $messages);
}

private function testExceptSingleFieldSingleExcept(UnitTester $I)
{
$validation = new Validation();
$validation->add(
'year',
new Uniqueness(
[
'except' => 1972,
]
)
);
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
$I->assertTrue($this->anotherRobot->save());
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(1, $messages);
}

private function testExceptSingleFieldMultipleExcept(UnitTester $I)
{
$validation = new Validation();
$validation->add(
'year',
new Uniqueness(
[
'except' => [1972, 1952],
]
)
);
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(0, $messages);
}

private function testExceptMultipleFieldSingleExcept(UnitTester $I)
{
$validation = new Validation();
$validation->add(
['type', 'year'],
new Uniqueness(
[
'except' => [
'type' => 'mechanical',
'year' => 1972,
],
]
)
);
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(1, $messages);
}

private function testExceptMultipleFieldMultipleExcept(UnitTester $I)
{
$validation = new Validation();
$validation->add(
['year', 'type'],
new Uniqueness(
[
'except' => [
'year' => [1942, 1972],
'type' => ['hydraulic', 'cyborg'],
],
]
)
);
$messages = $validation->validate(null, $this->robot);
$I->assertCount(0, $messages);
$messages = $validation->validate(null, $this->anotherRobot);
$I->assertCount(0, $messages);
}

private function testConvertArrayReturnsArray(UnitTester $I)
{
$validation = new Validation();
$validation->add(
'type',
new Uniqueness(
[
'convert' => function (array $values) {
($values);

return null;
},
]
)
);
try {
$validation->validate(null, $this->robot);
$I->assertTrue(false);
} catch (\Exception $e) {
$I->assertTrue(true);
}
}
}
Loading

0 comments on commit 589795a

Please sign in to comment.