Browse Source

Fix validateUnique to be shim compliant.

euromark 10 years ago
parent
commit
30abbd0943

+ 5 - 5
Model/MyModel.php

@@ -757,12 +757,12 @@ class MyModel extends ShimModel {
 			}
 			}
 		}
 		}
 
 
-		$this->recursive = -1;
-		if (count($conditions) > 2) {
-			$this->recursive = 0;
+		if (count($conditions) > 2 && !isset($options['contain']) && !isset($options['recursive'])) {
+			$options['recursive'] = 0;
 		}
 		}
-		$options = ['fields' => [$this->alias . '.' . $this->primaryKey], 'conditions' => $conditions];
-		$res = $this->find('first', $options);
+
+		$options = ['fields' => [$this->alias . '.' . $this->primaryKey], 'conditions' => $conditions] + $options;
+		$res = $this->find('count', $options);
 		return empty($res);
 		return empty($res);
 	}
 	}
 
 

+ 0 - 192
Test/Case/Controller/Component/AjaxComponentTest.php

@@ -1,192 +0,0 @@
-<?php
-
-App::uses('AjaxComponent', 'Tools.Controller/Component');
-App::uses('Controller', 'Controller');
-App::uses('AppModel', 'Model');
-App::uses('CakeRequest', 'Network');
-App::uses('CakeResponse', 'Network');
-
-/**
- */
-class AjaxComponentTest extends CakeTestCase {
-
-	public $fixtures = ['core.cake_session', 'plugin.tools.tools_user', 'plugin.tools.role'];
-
-	public function setUp() {
-		parent::setUp();
-		Configure::delete('Ajax');
-
-		$this->Controller = new AjaxComponentTestController(new CakeRequest(), new CakeResponse());
-		$this->Controller->constructClasses();
-	}
-
-	/**
-	 * AjaxComponentTest::testNonAjax()
-	 *
-	 * @return void
-	 */
-	public function testNonAjax() {
-		$this->Controller->startupProcess();
-		$this->assertFalse($this->Controller->Components->Ajax->respondAsAjax);
-	}
-
-	/**
-	 * AjaxComponentTest::testDefaults()
-	 *
-	 * @return void
-	 */
-	public function testDefaults() {
-		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
-
-		$this->Controller->startupProcess();
-		$this->assertTrue($this->Controller->Components->Ajax->respondAsAjax);
-
-		$this->Controller->Session->setFlash('A message', 'custom');
-		$session = $this->Controller->Session->read('Message.flash');
-		$expected = [
-			'message' => 'A message',
-			'element' => 'custom',
-			'params' => []
-		];
-		$this->assertEquals($expected, $session);
-
-		$this->Controller->Components->Ajax->beforeRender($this->Controller);
-
-		$this->assertEquals('Tools.Ajax', $this->Controller->viewClass);
-		$this->assertEquals($expected, $this->Controller->viewVars['_message']);
-
-		$session = $this->Controller->Session->read('Message.flash');
-		$this->assertNull($session);
-
-		$this->Controller->redirect('/');
-		$this->assertSame([], $this->Controller->response->header());
-
-		$expected = [
-			'url' => Router::url('/', true),
-			'status' => null,
-			'exit' => true
-		];
-		$this->assertEquals($expected, $this->Controller->viewVars['_redirect']);
-	}
-
-	/**
-	 * AjaxComponentTest::testAutoDetectOnFalse()
-	 *
-	 * @return void
-	 */
-	public function testAutoDetectOnFalse() {
-		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
-
-		$this->Controller->Components->unload('Ajax');
-		$this->Controller->Components->load('Tools.Ajax', ['autoDetect' => false]);
-
-		$this->Controller->startupProcess();
-		$this->assertFalse($this->Controller->Components->Ajax->respondAsAjax);
-	}
-
-	/**
-	 * AjaxComponentTest::testAutoDetectOnFalseViaConfig()
-	 *
-	 * @return void
-	 */
-	public function testAutoDetectOnFalseViaConfig() {
-		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
-		Configure::write('Ajax.autoDetect', false);
-
-		$this->Controller->Components->unload('Ajax');
-		$this->Controller->Components->load('Tools.Ajax');
-
-		$this->Controller->startupProcess();
-		$this->assertFalse($this->Controller->Components->Ajax->respondAsAjax);
-	}
-
-	/**
-	 * AjaxComponentTest::testToolsMultiMessages()
-	 *
-	 * @return void
-	 */
-	public function testToolsMultiMessages() {
-		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
-		Configure::write('Ajax.flashKey', 'messages');
-
-		$this->Controller->Components->unload('Ajax');
-		$this->Controller->Components->load('Tools.Ajax');
-
-		$this->Controller->startupProcess();
-		$this->assertTrue($this->Controller->Components->Ajax->respondAsAjax);
-
-		$this->Controller->Flash->message('A message', 'success');
-		$session = $this->Controller->Session->read('messages');
-		$expected = [
-			'success' => ['A message']
-		];
-		$this->assertEquals($expected, $session);
-
-		$this->Controller->Components->Ajax->beforeRender($this->Controller);
-		$this->assertEquals('Tools.Ajax', $this->Controller->viewClass);
-
-		$this->assertEquals($expected, $this->Controller->viewVars['_message']);
-
-		$session = $this->Controller->Session->read('messages');
-		$this->assertNull($session);
-	}
-
-	/**
-	 * AjaxComponentTest::testSetVars()
-	 *
-	 * @return void
-	 */
-	public function testSetVars() {
-		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
-
-		$this->Controller->Components->unload('Ajax');
-
-		$content = ['id' => 1, 'title' => 'title'];
-		$this->Controller->set(compact('content'));
-		$this->Controller->set('_serialize', ['content']);
-
-		$this->Controller->Components->load('Tools.Ajax');
-		$this->assertNotEmpty($this->Controller->viewVars);
-		$this->assertNotEmpty($this->Controller->viewVars['_serialize']);
-		$this->assertEquals('content', $this->Controller->viewVars['_serialize'][0]);
-	}
-
-	/**
-	 * AjaxComponentTest::testSetVarsWithRedirect()
-	 *
-	 * @return void
-	 */
-	public function testSetVarsWithRedirect() {
-		$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
-		$this->Controller->startupProcess();
-
-		$content = ['id' => 1, 'title' => 'title'];
-		$this->Controller->set(compact('content'));
-		$this->Controller->set('_serialize', ['content']);
-
-		$this->Controller->redirect('/');
-		$this->assertSame([], $this->Controller->response->header());
-
-		$expected = [
-			'url' => Router::url('/', true),
-			'status' => null,
-			'exit' => true
-		];
-		$this->assertEquals($expected, $this->Controller->viewVars['_redirect']);
-
-		$this->Controller->set(['_message' => 'test']);
-		$this->Controller->redirect('/');
-		$this->assertArrayHasKey('_message', $this->Controller->viewVars);
-
-		$this->assertNotEmpty($this->Controller->viewVars);
-		$this->assertNotEmpty($this->Controller->viewVars['_serialize']);
-		$this->assertTrue(in_array('content', $this->Controller->viewVars['_serialize']));
-	}
-}
-
-// Use Controller instead of AppController to avoid conflicts
-class AjaxComponentTestController extends Controller {
-
-	public $components = ['Session', 'Tools.Ajax', 'Tools.Common', 'Tools.Flash'];
-
-}

+ 25 - 0
Test/Case/Model/MyModelTest.php

@@ -950,6 +950,7 @@ class MyModelTest extends MyCakeTestCase {
 		$res = $this->Post->save($data);
 		$res = $this->Post->save($data);
 		$this->assertFalse($res);
 		$this->assertFalse($res);
 
 
+		// One dependent field
 		$this->Post->validate['title'] = [
 		$this->Post->validate['title'] = [
 			'validateUnique' => [
 			'validateUnique' => [
 				'rule' => ['validateUnique', ['published']],
 				'rule' => ['validateUnique', ['published']],
@@ -969,6 +970,30 @@ class MyModelTest extends MyCakeTestCase {
 		$this->Post->create();
 		$this->Post->create();
 		$res = $this->Post->save($data);
 		$res = $this->Post->save($data);
 		$this->assertFalse($res);
 		$this->assertFalse($res);
+
+		// Too dependent fields
+		$this->Post->validate['title'] = [
+			'validateUnique' => [
+				'rule' => ['validateUnique', ['published', 'author_id']],
+				'message' => 'valErrRecordTitleExists',
+			],
+		];
+
+		$this->User->create();
+		$user = $this->User->save(['user' => 'Foo']);
+
+		$data = [
+			'title' => 'abc',
+			'published' => 'Y',
+			'author_id' => $user['User']['id']
+		];
+		$this->Post->create();
+		$res = $this->Post->save($data);
+		$this->assertTrue((bool)$res);
+
+		$this->Post->create();
+		$res = $this->Post->save($data);
+		$this->assertFalse($res);
 	}
 	}
 
 
 }
 }