diff --git a/application/Espo/Controllers/FieldManager.php b/application/Espo/Controllers/FieldManager.php
new file mode 100644
index 0000000000..23406a875d
--- /dev/null
+++ b/application/Espo/Controllers/FieldManager.php
@@ -0,0 +1,76 @@
+getUser()->isAdmin()) {
+ throw new Forbidden();
+ }
+ }
+
+ public function actionRead($params, $data)
+ {
+ $data = $this->getContainer()->get('fieldManager')->read($params['name'], $params['scope']);
+
+ if (!isset($data)) {
+ throw new NotFound();
+ }
+
+ return $data;
+ }
+
+ public function actionCreate($params, $data)
+ {
+ if (empty($data['name'])) {
+ throw new Error("Field 'name' cannnot be empty");
+ }
+
+ $name = $data['name'];
+ unset($data['name']);
+
+ $this->getContainer()->get('fieldManager')->create($name, $data, $params['scope']);
+
+ return $this->getContainer()->get('fieldManager')->read($name, $params['scope']);
+ }
+
+ public function actionUpdate($params, $data)
+ {
+ $this->getContainer()->get('fieldManager')->update($params['name'], $data, $params['scope']);
+
+ return $this->getContainer()->get('fieldManager')->read($params['name'], $params['scope']);
+ }
+
+ public function actionDelete($params, $data)
+ {
+ return $this->getContainer()->get('fieldManager')->delete($params['name'], $params['scope']);
+ }
+
+}
+
diff --git a/application/Espo/Core/Utils/FieldManager.php b/application/Espo/Core/Utils/FieldManager.php
index 043863d942..e6e2319dbb 100644
--- a/application/Espo/Core/Utils/FieldManager.php
+++ b/application/Espo/Core/Utils/FieldManager.php
@@ -28,6 +28,8 @@ class FieldManager
protected $metadataType = 'entityDefs';
+ protected $customOptionName = 'isCustom';
+
public function __construct(Metadata $metadata)
{
@@ -52,6 +54,11 @@ class FieldManager
public function update($name, $fieldDef, $scope)
{
+ /*Add option to metadata that identify the custom field*/
+ if (!isset($fieldDef[$this->customOptionName]) || !$fieldDef[$this->customOptionName]) {
+ $fieldDef[$this->customOptionName] = true;
+ }
+
$defs = $this->normalizeDefs($name, $fieldDef);
return $this->setEntityDefs($defs, $scope);
diff --git a/application/Espo/Resources/routes.json b/application/Espo/Resources/routes.json
index 69e083581c..41eb470ab4 100644
--- a/application/Espo/Resources/routes.json
+++ b/application/Espo/Resources/routes.json
@@ -1,276 +1,318 @@
[
{
- "route":"/",
- "method":"get",
- "params":"
EspoCRM REST API<\/h1>"
+ "route":"/",
+ "method":"get",
+ "params":"EspoCRM REST API<\/h1>"
},
{
- "route":"/App/user",
- "method":"get",
- "params":{
- "controller":"App",
- "action":"user"
- }
- },
-
- {
- "route":"/Metadata",
- "method":"get",
- "params":{
- "controller":"Metadata"
- }
- },
-
- {
- "route":"I18n",
- "method":"get",
- "params":{
- "controller":"I18n"
- }
- },
-
- {
- "route":"/Settings",
- "method":"get",
- "params":{
- "controller":"Settings"
- },
- "conditions":{
- "auth":false
+ "route":"/App/user",
+ "method":"get",
+ "params":{
+ "controller":"App",
+ "action":"user"
}
},
{
- "route":"/Settings",
- "method":"patch",
- "params":{
- "controller":"Settings"
- }
+ "route":"/Metadata",
+ "method":"get",
+ "params":{
+ "controller":"Metadata"
+ }
},
{
- "route":"/Admin/jobs",
- "method":"get",
- "params":{
- "controller":"Admin",
- "action":"jobs"
- }
+ "route":"I18n",
+ "method":"get",
+ "params":{
+ "controller":"I18n"
+ }
},
{
- "route":"/Stream",
- "method":"get",
- "params":{
- "controller":"Stream",
+ "route":"/Settings",
+ "method":"get",
+ "params":{
+ "controller":"Settings"
+ },
+ "conditions":{
+ "auth":false
+ }
+ },
+
+ {
+ "route":"/Settings",
+ "method":"patch",
+ "params":{
+ "controller":"Settings"
+ }
+ },
+
+ {
+ "route":"/Stream",
+ "method":"get",
+ "params":{
+ "controller":"Stream",
"action":"list",
"scope": "User"
- }
+ }
},
{
- "route":"/GlobalSearch/:query",
- "method":"get",
- "params":{
- "controller":"GlobalSearch",
+ "route":"/GlobalSearch/:query",
+ "method":"get",
+ "params":{
+ "controller":"GlobalSearch",
"action":"search",
"query": ":query"
- }
+ }
},
{
- "route":"/:controller/action/:action",
- "method":"post",
- "params":{
- "controller":":controller",
- "action":":action"
- }
+ "route":"/:controller/action/:action",
+ "method":"post",
+ "params":{
+ "controller":":controller",
+ "action":":action"
+ }
},
{
- "route":"/:controller/action/:action",
- "method":"put",
- "params":{
- "controller":":controller",
- "action":":action"
- }
+ "route":"/:controller/action/:action",
+ "method":"put",
+ "params":{
+ "controller":":controller",
+ "action":":action"
+ }
},
{
- "route":"/:controller/action/:action",
- "method":"get",
- "params":{
- "controller":":controller",
- "action":":action"
- }
+ "route":"/:controller/action/:action",
+ "method":"get",
+ "params":{
+ "controller":":controller",
+ "action":":action"
+ }
},
{
- "route":"/:controller/layout/:name",
- "method":"get",
- "params":{
- "controller":"Layout",
+ "route":"/:controller/layout/:name",
+ "method":"get",
+ "params":{
+ "controller":"Layout",
"scope":":controller"
- }
+ }
},
{
- "route":"/:controller/layout/:name",
- "method":"put",
- "params":{
- "controller":"Layout",
+ "route":"/:controller/layout/:name",
+ "method":"put",
+ "params":{
+ "controller":"Layout",
"scope":":controller"
- }
+ }
},
{
- "route":"/:controller/layout/:name",
- "method":"patch",
- "params":{
- "controller":"Layout",
+ "route":"/:controller/layout/:name",
+ "method":"patch",
+ "params":{
+ "controller":"Layout",
"scope":":controller"
- }
+ }
},
{
- "route":"/Admin/rebuild",
- "method":"get",
- "params":{
- "controller":"Admin",
- "action":"rebuild"
- }
+ "route":"/Admin/rebuild",
+ "method":"get",
+ "params":{
+ "controller":"Admin",
+ "action":"rebuild"
+ }
},
{
- "route":"/Admin/clearCache",
- "method":"get",
- "params":{
- "controller":"Admin",
- "action":"clearCache"
- }
+ "route":"/Admin/clearCache",
+ "method":"get",
+ "params":{
+ "controller":"Admin",
+ "action":"clearCache"
+ }
},
{
- "route":"/:controller/:id",
- "method":"get",
- "params":{
- "controller":":controller",
+ "route":"/Admin/jobs",
+ "method":"get",
+ "params":{
+ "controller":"Admin",
+ "action":"jobs"
+ }
+ },
+
+ {
+ "route":"/Admin/fieldManager/:scope/:name",
+ "method":"get",
+ "params":{
+ "controller":"FieldManager",
+ "action":"read",
+ "scope":":scope",
+ "name":":name"
+ }
+ },
+
+ {
+ "route":"/Admin/fieldManager/:scope",
+ "method":"post",
+ "params":{
+ "controller":"FieldManager",
+ "action":"create",
+ "scope":":scope"
+ }
+ },
+
+ {
+ "route":"/Admin/fieldManager/:scope/:name",
+ "method":"put",
+ "params":{
+ "controller":"FieldManager",
+ "action":"update",
+ "scope":":scope",
+ "name":":name"
+ }
+ },
+
+ {
+ "route":"/Admin/fieldManager/:scope/:name",
+ "method":"delete",
+ "params":{
+ "controller":"FieldManager",
+ "action":"delete",
+ "scope":":scope",
+ "name":":name"
+ }
+ },
+
+ {
+ "route":"/:controller/:id",
+ "method":"get",
+ "params":{
+ "controller":":controller",
"action":"read",
"id":":id"
- }
+ }
},
{
- "route":"/:controller",
- "method":"get",
- "params":{
- "controller":":controller",
+ "route":"/:controller",
+ "method":"get",
+ "params":{
+ "controller":":controller",
"action":"index"
- }
+ }
},
{
- "route":"/:controller",
- "method":"post",
- "params":{
- "controller":":controller",
+ "route":"/:controller",
+ "method":"post",
+ "params":{
+ "controller":":controller",
"action":"create"
- }
+ }
},
{
- "route":"/:controller/:id",
- "method":"put",
- "params":{
- "controller":":controller",
+ "route":"/:controller/:id",
+ "method":"put",
+ "params":{
+ "controller":":controller",
"action":"update",
"id":":id"
- }
+ }
},
{
- "route":"/:controller/:id",
- "method":"patch",
- "params":{
- "controller":":controller",
+ "route":"/:controller/:id",
+ "method":"patch",
+ "params":{
+ "controller":":controller",
"action":"patch",
"id":":id"
- }
+ }
},
{
- "route":"/:controller/:id",
- "method":"delete",
- "params":{
- "controller":":controller",
+ "route":"/:controller/:id",
+ "method":"delete",
+ "params":{
+ "controller":":controller",
"action":"delete",
"id":":id"
- }
+ }
},
{
- "route":"/:controller/:id/stream",
- "method":"get",
- "params":{
- "controller":"Stream",
+ "route":"/:controller/:id/stream",
+ "method":"get",
+ "params":{
+ "controller":"Stream",
"action":"list",
"id":":id",
"scope":":controller"
- }
+ }
},
{
- "route":"/:controller/:id/subscription",
- "method":"put",
- "params":{
- "controller":":controller",
- "id":":id",
- "action":"follow"
- }
+ "route":"/:controller/:id/subscription",
+ "method":"put",
+ "params":{
+ "controller":":controller",
+ "id":":id",
+ "action":"follow"
+ }
},
{
- "route":"/:controller/:id/subscription",
- "method":"delete",
- "params":{
- "controller":":controller",
- "id":":id",
- "action":"unfollow"
- }
+ "route":"/:controller/:id/subscription",
+ "method":"delete",
+ "params":{
+ "controller":":controller",
+ "id":":id",
+ "action":"unfollow"
+ }
},
{
- "route":"/:controller/:id/:link",
- "method":"get",
- "params":{
- "controller":":controller",
+ "route":"/:controller/:id/:link",
+ "method":"get",
+ "params":{
+ "controller":":controller",
"action":"listLinked",
"id":":id",
"link":":link"
- }
+ }
},
{
- "route":"/:controller/:id/:link",
- "method":"post",
- "params":{
- "controller":":controller",
+ "route":"/:controller/:id/:link",
+ "method":"post",
+ "params":{
+ "controller":":controller",
"action":"createLink",
"id":":id",
"link":":link"
- }
+ }
},
{
- "route":"/:controller/:id/:link",
- "method":"delete",
- "params":{
- "controller":":controller",
+ "route":"/:controller/:id/:link",
+ "method":"delete",
+ "params":{
+ "controller":":controller",
"action":"removeLink",
"id":":id",
"link":":link"
- }
+ }
}
-
]
diff --git a/custom/Espo/Custom/Resources/metadata/entityDefs/Account.json b/custom/Espo/Custom/Resources/metadata/entityDefs/Account.json
deleted file mode 100644
index 8cc5063a7f..0000000000
--- a/custom/Espo/Custom/Resources/metadata/entityDefs/Account.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "fields": {
- "someName": {
- "type": "varchar",
- "maxLength": 40
- },
- "someName2": {
- "type": "varchar",
- "maxLength": 40
- },
- "some": {
- "type": "varchar",
- "maxLength": 40
- }
- }
-}
\ No newline at end of file
diff --git a/tests/Api/FieldManagerTest.php b/tests/Api/FieldManagerTest.php
new file mode 100644
index 0000000000..7631b341c1
--- /dev/null
+++ b/tests/Api/FieldManagerTest.php
@@ -0,0 +1,103 @@
+markTestSkipped('API tests are not enabled.');
+ }
+
+ require_once('tests/Api/RestTesterClass.php');
+ $this->fixture = new RestTesterClass();
+
+ /****************************************/
+ $this->fixture->setUrl('/Admin/fieldManager');
+ /****************************************/
+ }
+
+ protected function tearDown()
+ {
+ $this->fixture = NULL;
+ }
+
+
+ public function testCreate()
+ {
+ $this->fixture->setType('POST');
+
+ $this->fixture->setUrl('/Admin/fieldManager/CustomEntity');
+
+ $input = '{"name":"customField","type":"varchar","maxLength":50}';
+ $result = '{"type":"varchar","maxLength":50,"isCustom":true}';
+
+ $this->assertEquals($result, $this->fixture->getResponse($input)['response']);
+ }
+
+
+ public function testReadAfterCreate()
+ {
+ $this->fixture->setType('GET');
+
+ $this->fixture->setUrl('/Admin/fieldManager/CustomEntity/customField');
+ $data = '{"type":"varchar","maxLength":50,"isCustom":true}';
+ $this->assertEquals($data, $this->fixture->getResponse()['response']);
+ }
+
+ public function testUpdate()
+ {
+ $this->fixture->setType('PUT');
+
+ $this->fixture->setUrl('/Admin/fieldManager/CustomEntity/customField');
+
+ $input = '{"type":"varchar","maxLength":50,"default":"this is a test"}';
+ $result = '{"type":"varchar","maxLength":50,"isCustom":true,"default":"this is a test"}';
+
+ $this->assertEquals($result, $this->fixture->getResponse($input)['response']);
+ }
+
+ public function testReadAfterUpdate()
+ {
+ $this->fixture->setType('GET');
+
+ $this->fixture->setUrl('/Admin/fieldManager/CustomEntity/customField');
+ $data = '{"type":"varchar","maxLength":50,"isCustom":true,"default":"this is a test"}';
+ $this->assertEquals($data, $this->fixture->getResponse()['response']);
+ }
+
+ public function testDelete()
+ {
+ $this->fixture->setType('DELETE');
+
+ $this->fixture->setUrl('/Admin/fieldManager/CustomEntity/customField');
+ $this->assertEquals('true', $this->fixture->getResponse()['response']);
+ }
+
+ public function testReadAfterDetele()
+ {
+ $this->fixture->setType('GET');
+
+ $this->fixture->setUrl('/Admin/fieldManager/CustomEntity/customField');
+ $response= $this->fixture->getResponse();
+ $this->assertEquals(404, $response['code']);
+ }
+
+ public function testDeleteTestFile()
+ {
+ $file = 'custom/Espo/Custom/Resources/metadata/entityDefs/CustomEntity.json';
+ if (file_exists($file)) {
+ @unlink($file);
+ }
+ }
+
+
+
+
+}
+
+?>
\ No newline at end of file
diff --git a/tests/Api/config.php b/tests/Api/config.php
index 9f2ada0bd2..1792cddb78 100644
--- a/tests/Api/config.php
+++ b/tests/Api/config.php
@@ -2,7 +2,7 @@
return array(
'apiTestsEnabled' => false,
- 'apiUrl' => 'http://172.20.0.1/espocrm/api',
+ 'apiUrl' => 'http://172.20.0.1/taras/espo/api/v1',
'username' => 'admin',
'password' => '1',
);
diff --git a/tests/Espo/Core/Utils/FieldManagerTest.php b/tests/Espo/Core/Utils/FieldManagerTest.php
new file mode 100644
index 0000000000..18d54c5997
--- /dev/null
+++ b/tests/Espo/Core/Utils/FieldManagerTest.php
@@ -0,0 +1,72 @@
+objects['metadata'] = $this->getMockBuilder('\Espo\Core\Utils\Metadata')->disableOriginalConstructor()->getMock();
+
+ $this->object = new \Espo\Core\Utils\FieldManager($this->objects['metadata']);
+
+ $this->reflection = new ReflectionHelper($this->object);
+ }
+
+ protected function tearDown()
+ {
+ $this->object = NULL;
+ }
+
+
+ public function testRead()
+ {
+ $data = array(
+ "type" => "varchar",
+ "maxLength" => "50",
+ "isCustom" => true,
+ );
+
+ $this->objects['metadata']
+ ->expects($this->once())
+ ->method('get')
+ ->will($this->returnValue($data));
+
+ $this->assertEquals($data, $this->object->read('varName', 'Account'));
+ }
+
+ public function testNormalizeDefs()
+ {
+ $input1 = 'fielName';
+ $input2 = array(
+ "type" => "varchar",
+ "maxLength" => "50",
+ );
+ $result = array(
+ 'fields' => array(
+ 'fielName' => array(
+ "type" => "varchar",
+ "maxLength" => "50",
+ ),
+ ),
+ );
+ $this->assertEquals($result, $this->reflection->invokeMethod('normalizeDefs', array($input1, $input2)));
+ }
+
+
+
+
+
+}
+
+?>
diff --git a/tests/Espo/ORM/DB/MapperTest.php b/tests/Espo/ORM/DB/MapperTest.php
index 1f55540453..993192e64d 100644
--- a/tests/Espo/ORM/DB/MapperTest.php
+++ b/tests/Espo/ORM/DB/MapperTest.php
@@ -15,48 +15,48 @@ require_once 'tests/testData/DB/MockDBResult.php';
class DBMapperTest extends PHPUnit_Framework_TestCase
{
protected $db;
- protected $pdo;
+ protected $pdo;
protected $post;
protected $note;
- protected $comment;
- protected $entityFactory;
+ protected $comment;
+ protected $entityFactory;
protected function setUp()
{
- $this->pdo = $this->getMock('MockPDO');
+ $this->pdo = $this->getMock('MockPDO');
$this->pdo
- ->expects($this->any())
+ ->expects($this->any())
->method('quote')
->will($this->returnCallback(function() {
$args = func_get_args();
return "'" . $args[0] . "'";
}));
-
+
$this->entityFactory = $this->getMockBuilder('\\Espo\\ORM\\EntityFactory')->disableOriginalConstructor()->getMock();
$this->entityFactory->expects($this->any())
->method('create')
->will($this->returnCallback(function() {
- $args = func_get_args();
+ $args = func_get_args();
$className = "\\Espo\\Entities\\" . $args[0];
return new $className();
}));
-
- $this->db = new MysqlMapper($this->pdo, $this->entityFactory);
+
+ $this->db = new MysqlMapper($this->pdo, $this->entityFactory);
$this->post = new \Espo\Entities\Post();
$this->comment = new \Espo\Entities\Comment();
$this->tag = new \Espo\Entities\Tag();
$this->note = new \Espo\Entities\Note();
-
- $this->contact = new \Espo\Entities\Contact();
- $this->account = new \Espo\Entities\Account();
+
+ $this->contact = new \Espo\Entities\Contact();
+ $this->account = new \Espo\Entities\Account();
}
-
+
protected function tearDown()
{
unset($this->pdo, $this->db, $this->post, $this->comment);
}
-
+
protected function mockQuery($query, $return, $any = false)
{
if ($any) {
@@ -64,16 +64,16 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
} else {
$expects = $this->once();
}
-
- $this->pdo->expects($expects)
+
+ $this->pdo->expects($expects)
->method('query')
->with($query)
->will($this->returnValue($return));
}
-
+
public function testSelectById()
{
- $query =
+ $query =
"SELECT post.id AS `id`, post.name AS `name`, TRIM(CONCAT(user_f.salutation_name, user_f.first_name, ' ', user_f.last_name)) AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ".
"FROM `post` ".
"LEFT JOIN `user` AS `user_f` ON post.created_by_id = user_f.id " .
@@ -86,14 +86,14 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
));
$this->mockQuery($query, $return);
-
+
$this->db->selectById($this->post, '1');
- $this->assertEquals($this->post->id, '1');
+ $this->assertEquals($this->post->id, '1');
}
-
+
public function testSelect()
{
- $query =
+ $query =
"SELECT post.id AS `id`, post.name AS `name`, TRIM(CONCAT(user_f.salutation_name, user_f.first_name, ' ', user_f.last_name)) AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ".
"FROM `post` ".
"LEFT JOIN `user` AS `user_f` ON post.created_by_id = user_f.id " .
@@ -116,13 +116,13 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
));
$this->mockQuery($query, $return);
-
+
$selectParams = array(
'whereClause' => array(
'name' => 'test_1',
'OR' => array(
'id' => '100',
- 'name*' => 'test_%',
+ 'name*' => 'test_%',
),
'Tag.name' => 'yoTag',
),
@@ -135,22 +135,22 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
);
$list = $this->db->select($this->post, $selectParams);
-
-
+
+
$this->assertTrue($list[0] instanceof Post);
- $this->assertTrue(isset($list[0]->id));
- $this->assertEquals($list[0]->id, '2');
+ $this->assertTrue(isset($list[0]->id));
+ $this->assertEquals($list[0]->id, '2');
}
-
+
public function testSelectWithSpecifiedParams()
{
- $query =
+ $query =
"SELECT contact.id AS `id`, TRIM(CONCAT(contact.first_name, ' ', contact.last_name)) AS `name`, contact.first_name AS `firstName`, contact.last_name AS `lastName`, contact.deleted AS `deleted` ".
"FROM `contact` ".
"WHERE (contact.first_name LIKE 'test%' OR contact.last_name LIKE 'test%' OR CONCAT(contact.first_name, ' ', contact.last_name) LIKE 'test%') AND contact.deleted = '0' ".
"ORDER BY contact.first_name DESC, contact.last_name DESC ".
"LIMIT 0, 10";
-
+
$return = new MockDBResult(array(
array(
'id' => '1',
@@ -159,7 +159,7 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
));
$this->mockQuery($query, $return);
-
+
$selectParams = array(
'whereClause' => array(
'name*' => 'test%',
@@ -170,10 +170,10 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
);
$list = $this->db->select($this->contact, $selectParams);
}
-
+
public function testJoin()
{
- $query =
+ $query =
"SELECT comment.id AS `id`, comment.post_id AS `postId`, post_f.name AS `postName`, comment.name AS `name`, comment.deleted AS `deleted` ".
"FROM `comment` ".
"LEFT JOIN `post` AS `post_f` ON comment.post_id = post_f.id ".
@@ -188,17 +188,17 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
));
$this->mockQuery($query, $return);
-
+
$list = $this->db->select($this->comment);
$this->assertTrue($list[0] instanceof Comment);
$this->assertTrue($list[0]->has('postName'));
$this->assertEquals($list[0]->get('postName'), 'test');
}
-
+
public function testSelectRelatedManyMany()
{
- $query =
+ $query =
"SELECT tag.id AS `id`, tag.name AS `name`, tag.deleted AS `deleted` ".
"FROM `tag` ".
"JOIN `post_tag` ON tag.id = post_tag.tag_id AND post_tag.post_id = '1' AND post_tag.deleted = '0' ".
@@ -213,15 +213,15 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
$this->mockQuery($query, $return);
$this->post->id = '1';
$list = $this->db->selectRelated($this->post, 'tags');
-
+
$this->assertTrue($list[0] instanceof Tag);
$this->assertTrue($list[0]->has('name'));
$this->assertEquals($list[0]->get('name'), 'test');
}
-
+
public function testSelectRelatedHasChildren()
{
- $query =
+ $query =
"SELECT note.id AS `id`, note.name AS `name`, note.parent_id AS `parentId`, note.parent_type AS `parentType`, note.deleted AS `deleted` ".
"FROM `note` ".
"WHERE note.deleted = '0' AND note.parent_id = '1' AND note.parent_type = 'Post'";
@@ -235,15 +235,15 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
$this->mockQuery($query, $return);
$this->post->id = '1';
$list = $this->db->selectRelated($this->post, 'notes');
-
+
$this->assertTrue($list[0] instanceof Note);
$this->assertTrue($list[0]->has('name'));
$this->assertEquals($list[0]->get('name'), 'test');
}
-
+
public function testSelectRelatedBelongsTo()
{
- $query =
+ $query =
"SELECT post.id AS `id`, post.name AS `name`, TRIM(CONCAT(user_f.salutation_name, user_f.first_name, ' ', user_f.last_name)) AS `createdByName`, post.created_by_id AS `createdById`, post.deleted AS `deleted` ".
"FROM `post` ".
"LEFT JOIN `user` AS `user_f` ON post.created_by_id = user_f.id " .
@@ -257,20 +257,20 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
));
$this->mockQuery($query, $return);
-
+
$this->comment->id = '11';
$this->comment->set('postId', '1');
- $post = $this->db->selectRelated($this->comment, 'post');
-
+ $post = $this->db->selectRelated($this->comment, 'post');
+
$this->assertTrue($post instanceof Post);
$this->assertTrue(($post->has('name')));
$this->assertEquals($post->get('name'), 'test');
}
-
-
+
+
public function testCountRelated()
{
- $query =
+ $query =
"SELECT COUNT(tag.id) AS AggregateValue ".
"FROM `tag` ".
"JOIN `post_tag` ON tag.id = post_tag.tag_id AND post_tag.post_id = '1' AND post_tag.deleted = '0' ".
@@ -281,117 +281,117 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
),
));
$this->mockQuery($query, $return);
-
+
$this->post->id = '1';
$count = $this->db->countRelated($this->post, 'tags');
-
+
$this->assertEquals($count, 1);
}
-
+
public function testInsert()
- {
- $query = "INSERT INTO `post` (id, name) VALUES ('1', 'test')";
+ {
+ $query = "INSERT INTO `post` (`id`, `name`) VALUES ('1', 'test')";
$return = true;
$this->mockQuery($query, $return);
-
- $this->post->reset();
+
+ $this->post->reset();
$this->post->id = '1';
$this->post->set('name', 'test');
$this->post->set('privateField', 'dontStoreThis');
-
- $this->db->insert($this->post);
+
+ $this->db->insert($this->post);
}
-
+
public function testUpdate()
- {
+ {
$query = "UPDATE `post` SET name = 'test' WHERE post.id = '1' AND post.deleted = '0'";
$return = true;
$this->mockQuery($query, $return);
-
- $this->post->reset();
+
+ $this->post->reset();
$this->post->id = '1';
$this->post->set('name', 'test');
-
- $this->db->update($this->post);
+
+ $this->db->update($this->post);
}
-
+
public function testRemoveRelationHasMany()
{
$query = "UPDATE `comment` SET post_id = NULL WHERE comment.deleted = '0' AND comment.id = '100'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->post->id = '1';
$this->db->removeRelation($this->post, 'comments', '100');
}
-
+
public function testRemoveAllHasMany()
{
$query = "UPDATE `comment` SET post_id = NULL WHERE comment.deleted = '0' AND comment.post_id = '1'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->post->id = '1';
$this->db->removeAllRelations($this->post, 'comments');
}
-
+
public function testRemoveRelationManyMany()
{
$query = "UPDATE `post_tag` SET deleted = 1 WHERE post_id = '1' AND tag_id = '100'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->post->id = '1';
- $this->db->removeRelation($this->post, 'tags', '100');
+ $this->db->removeRelation($this->post, 'tags', '100');
}
-
+
public function testRemoveAllManyMany()
{
$query = "UPDATE `post_tag` SET deleted = 1 WHERE post_id = '1'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->post->id = '1';
- $this->db->removeAllRelations($this->post, 'tags');
+ $this->db->removeAllRelations($this->post, 'tags');
}
-
+
public function testRemoveRelationManyManyWithCondition()
{
$query = "UPDATE `entity_team` SET deleted = 1 WHERE entity_id = '1' AND team_id = '100' AND entity_type = 'Account'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->account->id = '1';
- $this->db->removeRelation($this->account, 'teams', '100');
+ $this->db->removeRelation($this->account, 'teams', '100');
}
-
+
public function testRemoveAllManyManyWithCondition()
{
$query = "UPDATE `entity_team` SET deleted = 1 WHERE entity_id = '1' AND entity_type = 'Account'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->account->id = '1';
- $this->db->removeAllRelations($this->account, 'teams');
+ $this->db->removeAllRelations($this->account, 'teams');
}
-
+
public function testUnrelate()
{
$query = "UPDATE `post_tag` SET deleted = 1 WHERE post_id = '1' AND tag_id = '100'";
$return = true;
$this->mockQuery($query, $return);
-
+
$this->post->id = '1';
$this->tag->id = '100';
$this->db->unrelate($this->post, 'tags', $this->tag);
}
-
-
+
+
public function testAddRelation()
{
- // @todo
+ // @todo
}
-
+
public function testMax()
{
$query = "SELECT MAX(post.id) AS AggregateValue FROM `post` LEFT JOIN `user` AS `user_f` ON post.created_by_id = user_f.id";
@@ -401,9 +401,9 @@ class DBMapperTest extends PHPUnit_Framework_TestCase
)
));
$this->mockQuery($query, $return);
-
+
$value = $this->db->max($this->post, array(), 'id', true);
-
+
$this->assertEquals($value, 10);
}
}