el primer contratiempo en monky :(

Monky es un agregador de noticias que estoy escribiendo en base al meneame, y digo escribiendo ya que practicamente voy a tener que rehacer gran parte del codigo y de las bases de datos.

Por que? bien, principalmente las tablas de meneame hace uso del tipo de dato ENUM, hoy creando los fixtures para hacer test cases y asi alivianar el proceso de testeo me tope con que cakePHP 1.3 no soporta este tipo de datos para crear fixtures 😦
cakePHP solo soporta estos tipos de datos para mySQL;
http://book.cakephp.org/view/1002/Creating-Database-Tables#MySQL-1004

CakePHP doesn’t support enum datatypes because there’s no consistent implementation/support for it across various databases

Para solucionar esto se me ocurrio crear un model llamado Enum, que basicamente emula a un enum. Y asi eliminar el uso de enums en las tablas
sql:

CREATE TABLE `meneame3`.`enums` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` VARCHAR( 30 ) NOT NULL
) ENGINE = MYISAM ;

Llenamos la tabla con los “enums”, ejemplo, insertamos;
1,in
2,out
3,ok
4,pendent
5,error

Luego agregamos al modelo el belongsTo hacia a el modelo enum, uno por cada enum que tenga.

Despues de descartar esta idea por que en vez de simplificar complicaba me encontre con esto;
http://www.irisoftonline.com/cakephp-testing-errors-database-table-not-found-enum-type-fields-ignored

Basicamente reescribimos los metodos que crea la base de datos y lo hacemos nosotros mismos;
ver archivo /cake/tests/lib/cake_test_fixture.php

Copio y pego el fixture y el test de los trackbacks;


trackback_fixture.php
<?php
/* Trackback Fixture generated on: 2010-07-13 17:07:48 : 1279053768 */
class TrackbackFixture extends CakeTestFixture {
var $name = 'Trackback';
function create(&$db) {
if (!isset($this->fields) || empty($this->fields)) {
return false;
}
return ($db->execute("
CREATE TABLE `test_suite_trackbacks` (
`trackback_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`trackback_link_id` int(11) NOT NULL DEFAULT '0',
`trackback_user_id` int(11) NOT NULL DEFAULT '0',
`trackback_type` enum('in','out') NOT NULL DEFAULT 'in',
`trackback_status` enum('ok','pendent','error') NOT NULL DEFAULT 'pendent',
`trackback_date` timestamp NULL DEFAULT NULL,
`trackback_ip_int` int(10) unsigned NOT NULL DEFAULT '0',
`trackback_link` varchar(250) NOT NULL,
`trackback_url` varchar(250) DEFAULT NULL,
`trackback_title` text,
`trackback_content` text,
PRIMARY KEY (`trackback_id`),
UNIQUE KEY `trackback_link_id_2` (`trackback_link_id`,`trackback_type`,`trackback_link`),
KEY `trackback_link_id` (`trackback_link_id`),
KEY `trackback_url` (`trackback_url`),
KEY `trackback_date` (`trackback_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
", array('log' => false)) !== false);
}
function drop(&$db) {
return ($db->execute("DROP TABLE `test_suite_trackbacks`", array('log' => false)) !== false);
}
}
?>


trackback.test.php
<?php
/* Trackback Test cases generated on: 2010-07-13 18:07:49 : 1279058389*/
App::import('Model', 'Trackback');
class TrackbackTestCase extends CakeTestCase {
var $fixtures = array('app.trackback');
function startTest() {
$this->Trackback =& ClassRegistry::init('Trackback');
}
function testFoo() {
sleep(25);
$this->assertEqual(1, 1);
}
function endTest() {
unset($this->Trackback);
ClassRegistry::flush();
}
}
?>

Eso es todo!,
Saludos

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s