diff --git a/framework/db/Exception.php b/framework/db/Exception.php index 242361f..17c5965 100644 --- a/framework/db/Exception.php +++ b/framework/db/Exception.php @@ -1,22 +1,22 @@ * @link http://www.yiiframework.com/ - * @copyright Copyright © 2008-2011 Yii Software LLC + * @copyright Copyright © 2008-2012 Yii Software LLC * @license http://www.yiiframework.com/license/ */ +namespace yii\db; + /** * CDbException represents an exception that is caused by some DB-related operations. * * @author Qiang Xue - * @version $Id: CDbException.php 2799 2011-01-01 19:31:13Z qiang.xue $ - * @package system.db - * @since 1.0 + * @since 2.0 */ -class CDbException extends CException +class Exception extends \yii\base\Exception { /** * @var mixed the error info provided by a PDO exception. This is the same as returned diff --git a/framework/db/dao/Command.php b/framework/db/dao/Command.php index f1efef1..5df6965 100644 --- a/framework/db/dao/Command.php +++ b/framework/db/dao/Command.php @@ -10,6 +10,8 @@ namespace yii\db\dao; +use yii\db\Exception; + /** * Command represents a SQL statement to be executed against a database. * diff --git a/framework/db/dao/Connection.php b/framework/db/dao/Connection.php index 2d4b8a7..b3e6965 100644 --- a/framework/db/dao/Connection.php +++ b/framework/db/dao/Connection.php @@ -10,6 +10,8 @@ namespace yii\db\dao; +use yii\db\Exception; + /** * Connection represents a connection to a database via [PDO](http://www.php.net/manual/en/ref.pdo.php). * @@ -275,7 +277,7 @@ class Connection extends \yii\base\ApplicationComponent */ public static function getAvailableDrivers() { - return PDO::getAvailableDrivers(); + return \PDO::getAvailableDrivers(); } /** @@ -485,7 +487,7 @@ class Connection extends \yii\base\ApplicationComponent */ public function quoteValue($str) { - if (is_int($str) || is_float($str) || is_bool($str)) { + if (!is_string($str)) { return $str; } @@ -504,9 +506,9 @@ class Connection extends \yii\base\ApplicationComponent * @param string $name table name * @return string the properly quoted table name */ - public function quoteTableName($name) + public function quoteTableName($name, $simple = false) { - return $this->getSchema()->quoteTableName($name); + return $simple ? $this->getSchema()->quoteSimpleTableName($name) : $this->getSchema()->quoteTableName($name); } /** @@ -515,9 +517,9 @@ class Connection extends \yii\base\ApplicationComponent * @param string $name column name * @return string the properly quoted column name */ - public function quoteColumnName($name) + public function quoteColumnName($name, $simple = false) { - return $this->getSchema()->quoteColumnName($name); + return $simple ? $this->getSchema()->quoteColumnName($name) : $this->getSchema()->quoteSimpleColumnName($name); } /** @@ -528,13 +530,13 @@ class Connection extends \yii\base\ApplicationComponent */ public function getPdoType($type) { - static $map = array( + static $typeMap = array( 'boolean' => \PDO::PARAM_BOOL, 'integer' => \PDO::PARAM_INT, 'string' => \PDO::PARAM_STR, 'NULL' => \PDO::PARAM_NULL, ); - return isset($map[$type]) ? $map[$type] : PDO::PARAM_STR; + return isset($typeMap[$type]) ? $typeMap[$type] : \PDO::PARAM_STR; } /** @@ -547,7 +549,7 @@ class Connection extends \yii\base\ApplicationComponent return strtolower(substr($this->dsn, 0, $pos)); } else { - return $this->getAttribute(\PDO::ATTR_DRIVER_NAME); + return strtolower($this->getAttribute(\PDO::ATTR_DRIVER_NAME)); } } diff --git a/framework/db/dao/DataReader.php b/framework/db/dao/DataReader.php index d2228d8..858b74e 100644 --- a/framework/db/dao/DataReader.php +++ b/framework/db/dao/DataReader.php @@ -10,6 +10,8 @@ namespace yii\db\dao; +use yii\db\Exception; + /** * DataReader represents a forward-only stream of rows from a query result set. * diff --git a/framework/db/dao/QueryBuilder.php b/framework/db/dao/QueryBuilder.php index fbbc05e..c769828 100644 --- a/framework/db/dao/QueryBuilder.php +++ b/framework/db/dao/QueryBuilder.php @@ -10,6 +10,8 @@ namespace yii\db\dao; +use yii\db\Exception; + /** * QueryBuilder builds a SQL statement based on the specification given as a [[Query]] object. * diff --git a/framework/db/dao/Schema.php b/framework/db/dao/Schema.php index a831a31..5632e86 100644 --- a/framework/db/dao/Schema.php +++ b/framework/db/dao/Schema.php @@ -10,6 +10,8 @@ namespace yii\db\dao; +use yii\db\Exception; + /** * Schema is the base class for retrieving metadata information. * diff --git a/framework/db/dao/Transaction.php b/framework/db/dao/Transaction.php index b9fd97e..87e4d89 100644 --- a/framework/db/dao/Transaction.php +++ b/framework/db/dao/Transaction.php @@ -10,6 +10,8 @@ namespace yii\db\dao; +use yii\db\Exception; + /** * Transaction represents a DB transaction. * diff --git a/tests/unit/TestCase.php b/tests/unit/TestCase.php new file mode 100644 index 0000000..c7826c8 --- /dev/null +++ b/tests/unit/TestCase.php @@ -0,0 +1,14 @@ +params === null) { + $this->params = require(__DIR__ . '/data/config.php'); + } + return isset($this->params[$name]) ? $this->params[$name] : null; + } +} \ No newline at end of file diff --git a/tests/unit/bootstrap.php b/tests/unit/bootstrap.php index daba4c9..5a8aeaa 100644 --- a/tests/unit/bootstrap.php +++ b/tests/unit/bootstrap.php @@ -7,3 +7,4 @@ $_SERVER['SCRIPT_NAME'] = '/' . __DIR__; $_SERVER['SCRIPT_FILENAME'] = __FILE__; require_once(__DIR__ . '/../../framework/yii.php'); +require_once(__DIR__ . '/TestCase.php'); \ No newline at end of file diff --git a/tests/unit/data/config.php b/tests/unit/data/config.php new file mode 100644 index 0000000..865edc6 --- /dev/null +++ b/tests/unit/data/config.php @@ -0,0 +1,9 @@ + array( + 'dsn' => 'mysql:host=127.0.0.1;dbname=yiitest', + 'username' => 'root', + 'password' => '', + ), +); \ No newline at end of file diff --git a/tests/unit/data/mssql.sql b/tests/unit/data/mssql.sql new file mode 100644 index 0000000..38967b2 --- /dev/null +++ b/tests/unit/data/mssql.sql @@ -0,0 +1,306 @@ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[categories]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[categories]( + [id] [int] IDENTITY(1,1) NOT NULL, + [name] [varchar](128) NOT NULL, + [parent_id] [int] NULL, + CONSTRAINT [PK_categories] PRIMARY KEY CLUSTERED +( + [id] ASC +) ON [PRIMARY] +) ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[orders]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[orders]( + [key1] [int] NOT NULL, + [key2] [int] NOT NULL, + [name] [varchar](128) NOT NULL, + CONSTRAINT [PK_orders] PRIMARY KEY CLUSTERED +( + [key1] ASC, + [key2] ASC +) ON [PRIMARY] +) ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[types]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[types]( + [int_col] [int] NOT NULL, + [int_col2] [int] NULL CONSTRAINT [DF_types_int_col2] DEFAULT (1), + [char_col] [char](100) NOT NULL, + [char_col2] [varchar](100) NULL CONSTRAINT [DF_types_char_col2] DEFAULT ('something'), + [char_col3] [text] NULL, + [float_col] [real] NOT NULL, + [float_col2] [float] NULL CONSTRAINT [DF_types_float_col2] DEFAULT (1.23), + [blob_col] [image] NULL, + [numeric_col] [numeric](5, 2) NULL CONSTRAINT [DF_types_numeric_col] DEFAULT (33.22), + [time] [datetime] NULL CONSTRAINT [DF_types_time] DEFAULT ('2002-01-01 00:00:00'), + [bool_col] [bit] NOT NULL, + [bool_col2] [bit] NOT NULL CONSTRAINT [DF_types_bool_col2] DEFAULT (1) +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[users]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[users]( + [id] [int] IDENTITY(1,1) NOT NULL, + [username] [varchar](128) NOT NULL, + [password] [varchar](128) NOT NULL, + [email] [varchar](128) NOT NULL, + CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED +( + [id] ASC +) ON [PRIMARY] +) ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[post_category]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[post_category]( + [category_id] [int] NOT NULL, + [post_id] [int] NOT NULL, + CONSTRAINT [PK_post_category] PRIMARY KEY CLUSTERED +( + [category_id] ASC, + [post_id] ASC +) ON [PRIMARY] +) ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[items]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[items]( + [id] [int] IDENTITY(1,1) NOT NULL, + [name] [varchar](128) NULL, + [col1] [int] NOT NULL, + [col2] [int] NOT NULL, + CONSTRAINT [PK_items] PRIMARY KEY CLUSTERED +( + [id] ASC +) ON [PRIMARY] +) ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[comments]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[comments]( + [id] [int] IDENTITY(1,1) NOT NULL, + [content] [text] NOT NULL, + [post_id] [int] NOT NULL, + [author_id] [int] NOT NULL, + CONSTRAINT [PK_comments] PRIMARY KEY CLUSTERED +( + [id] ASC +) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[posts]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[posts]( + [id] [int] IDENTITY(1,1) NOT NULL, + [title] [varchar](128) NOT NULL, + [create_time] [datetime] NOT NULL, + [author_id] [int] NOT NULL, + [content] [text] NULL, + CONSTRAINT [PK_posts] PRIMARY KEY CLUSTERED +( + [id] ASC +) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] +END +GO +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[profiles]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1) +BEGIN +CREATE TABLE [dbo].[profiles]( + [id] [int] IDENTITY(1,1) NOT NULL, + [first_name] [varchar](128) NOT NULL, + [last_name] [varchar](128) NOT NULL, + [user_id] [int] NOT NULL, + CONSTRAINT [PK_profiles] PRIMARY KEY CLUSTERED +( + [id] ASC +) ON [PRIMARY] +) ON [PRIMARY] +END +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_categories_categories]') AND type = 'F') +ALTER TABLE [dbo].[categories] WITH CHECK ADD CONSTRAINT [FK_categories_categories] FOREIGN KEY([parent_id]) +REFERENCES [dbo].[categories] ([id]) +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_post_category_categories]') AND type = 'F') +ALTER TABLE [dbo].[post_category] WITH CHECK ADD CONSTRAINT [FK_post_category_categories] FOREIGN KEY([category_id]) +REFERENCES [dbo].[categories] ([id]) +ON DELETE CASCADE +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_post_category_posts]') AND type = 'F') +ALTER TABLE [dbo].[post_category] WITH NOCHECK ADD CONSTRAINT [FK_post_category_posts] FOREIGN KEY([post_id]) +REFERENCES [dbo].[posts] ([id]) +ON DELETE CASCADE +GO +ALTER TABLE [dbo].[post_category] CHECK CONSTRAINT [FK_post_category_posts] +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_items_orders]') AND type = 'F') +ALTER TABLE [dbo].[items] WITH CHECK ADD CONSTRAINT [FK_items_orders] FOREIGN KEY([col1], [col2]) +REFERENCES [dbo].[orders] ([key1], [key2]) +ON DELETE CASCADE +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_comments_users]') AND type = 'F') +ALTER TABLE [dbo].[comments] WITH NOCHECK ADD CONSTRAINT [FK_comments_users] FOREIGN KEY([author_id]) +REFERENCES [dbo].[users] ([id]) +ON DELETE CASCADE +GO +ALTER TABLE [dbo].[comments] CHECK CONSTRAINT [FK_comments_users] +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_post_comment]') AND type = 'F') +ALTER TABLE [dbo].[comments] WITH NOCHECK ADD CONSTRAINT [FK_post_comment] FOREIGN KEY([post_id]) +REFERENCES [dbo].[posts] ([id]) +ON DELETE CASCADE +GO +ALTER TABLE [dbo].[comments] CHECK CONSTRAINT [FK_post_comment] +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_posts_users]') AND type = 'F') +ALTER TABLE [dbo].[posts] WITH NOCHECK ADD CONSTRAINT [FK_posts_users] FOREIGN KEY([author_id]) +REFERENCES [dbo].[users] ([id]) +GO +ALTER TABLE [dbo].[posts] CHECK CONSTRAINT [FK_posts_users] +GO +IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_profile_user]') AND type = 'F') +ALTER TABLE [dbo].[profiles] WITH NOCHECK ADD CONSTRAINT [FK_profile_user] FOREIGN KEY([user_id]) +REFERENCES [dbo].[users] ([id]) +ON DELETE CASCADE +GO +ALTER TABLE [dbo].[profiles] CHECK CONSTRAINT [FK_profile_user] + +INSERT INTO users (username, password, email) VALUES ('user1','pass1','email1') +GO +INSERT INTO users (username, password, email) VALUES ('user2','pass2','email2') +GO +INSERT INTO users (username, password, email) VALUES ('user3','pass3','email3') +GO + +INSERT INTO profiles (first_name, last_name, user_id) VALUES ('first 1','last 1',1) +GO +INSERT INTO profiles (first_name, last_name, user_id) VALUES ('first 2','last 2',2) +GO + +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 1','2000-01-01',1,'content 1') +GO +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 2','2000-01-02',2,'content 2') +GO +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 3','2000-01-03',2,'content 3') +GO +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 4','2000-01-04',2,'content 4') +GO +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 5','2000-01-05',3,'content 5') +GO + +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 1',1, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 2',1, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 3',1, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 4',2, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 5',2, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 6',3, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 7',3, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 8',3, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 9',3, 2) +GO +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 10',5, 3) +GO + +INSERT INTO categories (name, parent_id) VALUES ('cat 1',NULL) +GO +INSERT INTO categories (name, parent_id) VALUES ('cat 2',NULL) +GO +INSERT INTO categories (name, parent_id) VALUES ('cat 3',NULL) +GO +INSERT INTO categories (name, parent_id) VALUES ('cat 4',1) +GO +INSERT INTO categories (name, parent_id) VALUES ('cat 5',1) +GO +INSERT INTO categories (name, parent_id) VALUES ('cat 6',5) +GO +INSERT INTO categories (name, parent_id) VALUES ('cat 7',5) +GO + +INSERT INTO post_category (category_id, post_id) VALUES (1,1) +GO +INSERT INTO post_category (category_id, post_id) VALUES (2,1) +GO +INSERT INTO post_category (category_id, post_id) VALUES (3,1) +GO +INSERT INTO post_category (category_id, post_id) VALUES (4,2) +GO +INSERT INTO post_category (category_id, post_id) VALUES (1,2) +GO +INSERT INTO post_category (category_id, post_id) VALUES (1,3) +GO + + +INSERT INTO orders (key1,key2,name) VALUES (1,2,'order 12') +GO +INSERT INTO orders (key1,key2,name) VALUES (1,3,'order 13') +GO +INSERT INTO orders (key1,key2,name) VALUES (2,1,'order 21') +GO +INSERT INTO orders (key1,key2,name) VALUES (2,2,'order 22') +GO + + +INSERT INTO items (name,col1,col2) VALUES ('item 1',1,2) +GO +INSERT INTO items (name,col1,col2) VALUES ('item 2',1,2) +GO +INSERT INTO items (name,col1,col2) VALUES ('item 3',1,3) +GO +INSERT INTO items (name,col1,col2) VALUES ('item 4',2,2) +GO +INSERT INTO items (name,col1,col2) VALUES ('item 5',2,2) +GO diff --git a/tests/unit/data/mysql.sql b/tests/unit/data/mysql.sql new file mode 100644 index 0000000..057b1ad --- /dev/null +++ b/tests/unit/data/mysql.sql @@ -0,0 +1,150 @@ +/** + * This is the database schema for testing MySQL support of yii Active Record. + * To test this feature, you need to create a database named 'yii' on 'localhost' + * and create an account 'test/test' which owns this test database. + */ + +CREATE TABLE users +( + id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + username VARCHAR(128) NOT NULL, + password VARCHAR(128) NOT NULL, + email VARCHAR(128) NOT NULL +) TYPE=INNODB; + +INSERT INTO users (username, password, email) VALUES ('user1','pass1','email1'); +INSERT INTO users (username, password, email) VALUES ('user2','pass2','email2'); +INSERT INTO users (username, password, email) VALUES ('user3','pass3','email3'); + +CREATE TABLE profiles +( + id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + first_name VARCHAR(128) NOT NULL, + last_name VARCHAR(128) NOT NULL, + user_id INTEGER NOT NULL, + CONSTRAINT FK_profile_user FOREIGN KEY (user_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +) TYPE=INNODB; + +INSERT INTO profiles (first_name, last_name, user_id) VALUES ('first 1','last 1',1); +INSERT INTO profiles (first_name, last_name, user_id) VALUES ('first 2','last 2',2); + +CREATE TABLE posts +( + id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + title VARCHAR(128) NOT NULL, + create_time TIMESTAMP NOT NULL, + author_id INTEGER NOT NULL, + content TEXT, + CONSTRAINT FK_post_author FOREIGN KEY (author_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +) TYPE=INNODB; + +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 1','2000-01-01',1,'content 1'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 2','2000-01-02',2,'content 2'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 3','2000-01-03',2,'content 3'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 4','2000-01-04',2,'content 4'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 5','2000-01-05',3,'content 5'); + +CREATE TABLE comments +( + id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + content TEXT NOT NULL, + post_id INTEGER NOT NULL, + author_id INTEGER NOT NULL, + CONSTRAINT FK_post_comment FOREIGN KEY (post_id) + REFERENCES posts (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_user_comment FOREIGN KEY (author_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +) TYPE=INNODB; + +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 1',1, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 2',1, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 3',1, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 4',2, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 5',2, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 6',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 7',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 8',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 9',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 10',5, 3); + +CREATE TABLE categories +( + id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(128) NOT NULL, + parent_id INTEGER, + CONSTRAINT FK_category_category FOREIGN KEY (parent_id) + REFERENCES categories (id) ON DELETE CASCADE ON UPDATE RESTRICT +) TYPE=INNODB; + +INSERT INTO categories (name, parent_id) VALUES ('cat 1',NULL); +INSERT INTO categories (name, parent_id) VALUES ('cat 2',NULL); +INSERT INTO categories (name, parent_id) VALUES ('cat 3',NULL); +INSERT INTO categories (name, parent_id) VALUES ('cat 4',1); +INSERT INTO categories (name, parent_id) VALUES ('cat 5',1); +INSERT INTO categories (name, parent_id) VALUES ('cat 6',5); +INSERT INTO categories (name, parent_id) VALUES ('cat 7',5); + +CREATE TABLE post_category +( + category_id INTEGER NOT NULL, + post_id INTEGER NOT NULL, + PRIMARY KEY (category_id, post_id), + CONSTRAINT FK_post_category_post FOREIGN KEY (post_id) + REFERENCES posts (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_post_category_category FOREIGN KEY (category_id) + REFERENCES categories (id) ON DELETE CASCADE ON UPDATE RESTRICT +) TYPE=INNODB; + +INSERT INTO post_category (category_id, post_id) VALUES (1,1); +INSERT INTO post_category (category_id, post_id) VALUES (2,1); +INSERT INTO post_category (category_id, post_id) VALUES (3,1); +INSERT INTO post_category (category_id, post_id) VALUES (4,2); +INSERT INTO post_category (category_id, post_id) VALUES (1,2); +INSERT INTO post_category (category_id, post_id) VALUES (1,3); + +CREATE TABLE orders +( + key1 INTEGER NOT NULL, + key2 INTEGER NOT NULL, + name VARCHAR(128), + PRIMARY KEY (key1, key2) +) TYPE=INNODB; + +INSERT INTO orders (key1,key2,name) VALUES (1,2,'order 12'); +INSERT INTO orders (key1,key2,name) VALUES (1,3,'order 13'); +INSERT INTO orders (key1,key2,name) VALUES (2,1,'order 21'); +INSERT INTO orders (key1,key2,name) VALUES (2,2,'order 22'); + +CREATE TABLE items +( + id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(128), + col1 INTEGER NOT NULL, + col2 INTEGER NOT NULL, + CONSTRAINT FK_order_item FOREIGN KEY (col1,col2) + REFERENCES orders (key1,key2) ON DELETE CASCADE ON UPDATE RESTRICT +) TYPE=INNODB; + +INSERT INTO items (name,col1,col2) VALUES ('item 1',1,2); +INSERT INTO items (name,col1,col2) VALUES ('item 2',1,2); +INSERT INTO items (name,col1,col2) VALUES ('item 3',1,3); +INSERT INTO items (name,col1,col2) VALUES ('item 4',2,2); +INSERT INTO items (name,col1,col2) VALUES ('item 5',2,2); + +CREATE TABLE types +( + int_col INT NOT NULL, + int_col2 INTEGER DEFAULT 1, + char_col CHAR(100) NOT NULL, + char_col2 VARCHAR(100) DEFAULT 'something', + char_col3 TEXT, + float_col REAL(4,3) NOT NULL, + float_col2 DOUBLE DEFAULT 1.23, + blob_col BLOB, + numeric_col NUMERIC(5,2) DEFAULT 33.22, + time TIMESTAMP DEFAULT '2002-01-01', + bool_col BOOL NOT NULL, + bool_col2 BOOLEAN DEFAULT 1 +) TYPE=INNODB; \ No newline at end of file diff --git a/tests/unit/data/postgres.sql b/tests/unit/data/postgres.sql new file mode 100644 index 0000000..e46b284 --- /dev/null +++ b/tests/unit/data/postgres.sql @@ -0,0 +1,165 @@ +/** + * This is the database schema for testing PostgreSQL support of yii Active Record. + * To test this feature, you need to create a database named 'yii' on 'localhost' + * and create an account 'test/test' which owns this test database. + */ +CREATE SCHEMA test; + +CREATE TABLE test.users +( + id SERIAL NOT NULL PRIMARY KEY, + username VARCHAR(128) NOT NULL, + password VARCHAR(128) NOT NULL, + email VARCHAR(128) NOT NULL +); + +INSERT INTO test.users (username, password, email) VALUES ('user1','pass1','email1'); +INSERT INTO test.users (username, password, email) VALUES ('user2','pass2','email2'); +INSERT INTO test.users (username, password, email) VALUES ('user3','pass3','email3'); + +CREATE TABLE test.user_friends +( + id INTEGER NOT NULL, + friend INTEGER NOT NULL, + PRIMARY KEY (id, friend), + CONSTRAINT FK_user_id FOREIGN KEY (id) + REFERENCES test.users (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_friend_id FOREIGN KEY (friend) + REFERENCES test.users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.user_friends VALUES (1,2); +INSERT INTO test.user_friends VALUES (1,3); +INSERT INTO test.user_friends VALUES (2,3); + +CREATE TABLE test.profiles +( + id SERIAL NOT NULL PRIMARY KEY, + first_name VARCHAR(128) NOT NULL, + last_name VARCHAR(128) NOT NULL, + user_id INTEGER NOT NULL, + CONSTRAINT FK_profile_user FOREIGN KEY (user_id) + REFERENCES test.users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.profiles (first_name, last_name, user_id) VALUES ('first 1','last 1',1); +INSERT INTO test.profiles (first_name, last_name, user_id) VALUES ('first 2','last 2',2); + +CREATE TABLE test.posts +( + id SERIAL NOT NULL PRIMARY KEY, + title VARCHAR(128) NOT NULL, + create_time TIMESTAMP NOT NULL, + author_id INTEGER NOT NULL, + content TEXT, + CONSTRAINT FK_post_author FOREIGN KEY (author_id) + REFERENCES test.users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.posts (title, create_time, author_id, content) VALUES ('post 1',TIMESTAMP '2004-10-19 10:23:54',1,'content 1'); +INSERT INTO test.posts (title, create_time, author_id, content) VALUES ('post 2',TIMESTAMP '2004-10-19 10:23:54',2,'content 2'); +INSERT INTO test.posts (title, create_time, author_id, content) VALUES ('post 3',TIMESTAMP '2004-10-19 10:23:54',2,'content 3'); +INSERT INTO test.posts (title, create_time, author_id, content) VALUES ('post 4',TIMESTAMP '2004-10-19 10:23:54',2,'content 4'); +INSERT INTO test.posts (title, create_time, author_id, content) VALUES ('post 5',TIMESTAMP '2004-10-19 10:23:54',3,'content 5'); + +CREATE TABLE test.comments +( + id SERIAL NOT NULL PRIMARY KEY, + content TEXT NOT NULL, + post_id INTEGER NOT NULL, + author_id INTEGER NOT NULL, + CONSTRAINT FK_post_comment FOREIGN KEY (post_id) + REFERENCES test.posts (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_user_comment FOREIGN KEY (author_id) + REFERENCES test.users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 1',1, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 2',1, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 3',1, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 4',2, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 5',2, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 6',3, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 7',3, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 8',3, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 9',3, 2); +INSERT INTO test.comments (content, post_id, author_id) VALUES ('comment 10',5, 3); + +CREATE TABLE test.categories +( + id SERIAL NOT NULL PRIMARY KEY, + name VARCHAR(128) NOT NULL, + parent_id INTEGER, + CONSTRAINT FK_category_category FOREIGN KEY (parent_id) + REFERENCES test.categories (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.categories (name, parent_id) VALUES ('cat 1',NULL); +INSERT INTO test.categories (name, parent_id) VALUES ('cat 2',NULL); +INSERT INTO test.categories (name, parent_id) VALUES ('cat 3',NULL); +INSERT INTO test.categories (name, parent_id) VALUES ('cat 4',1); +INSERT INTO test.categories (name, parent_id) VALUES ('cat 5',1); +INSERT INTO test.categories (name, parent_id) VALUES ('cat 6',5); +INSERT INTO test.categories (name, parent_id) VALUES ('cat 7',5); + +CREATE TABLE test.post_category +( + category_id INTEGER NOT NULL, + post_id INTEGER NOT NULL, + PRIMARY KEY (category_id, post_id), + CONSTRAINT FK_post_category_post FOREIGN KEY (post_id) + REFERENCES test.posts (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_post_category_category FOREIGN KEY (category_id) + REFERENCES test.categories (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.post_category (category_id, post_id) VALUES (1,1); +INSERT INTO test.post_category (category_id, post_id) VALUES (2,1); +INSERT INTO test.post_category (category_id, post_id) VALUES (3,1); +INSERT INTO test.post_category (category_id, post_id) VALUES (4,2); +INSERT INTO test.post_category (category_id, post_id) VALUES (1,2); +INSERT INTO test.post_category (category_id, post_id) VALUES (1,3); + +CREATE TABLE test.orders +( + key1 INTEGER NOT NULL, + key2 INTEGER NOT NULL, + name VARCHAR(128), + PRIMARY KEY (key1, key2) +); + +INSERT INTO test.orders (key1,key2,name) VALUES (1,2,'order 12'); +INSERT INTO test.orders (key1,key2,name) VALUES (1,3,'order 13'); +INSERT INTO test.orders (key1,key2,name) VALUES (2,1,'order 21'); +INSERT INTO test.orders (key1,key2,name) VALUES (2,2,'order 22'); + +CREATE TABLE test.items +( + id SERIAL NOT NULL PRIMARY KEY, + name VARCHAR(128), + col1 INTEGER NOT NULL, + col2 INTEGER NOT NULL, + CONSTRAINT FK_order_item FOREIGN KEY (col1,col2) + REFERENCES test.orders (key1,key2) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO test.items (name,col1,col2) VALUES ('item 1',1,2); +INSERT INTO test.items (name,col1,col2) VALUES ('item 2',1,2); +INSERT INTO test.items (name,col1,col2) VALUES ('item 3',1,3); +INSERT INTO test.items (name,col1,col2) VALUES ('item 4',2,2); +INSERT INTO test.items (name,col1,col2) VALUES ('item 5',2,2); + +CREATE TABLE public.yii_types +( + int_col INT NOT NULL, + int_col2 INTEGER DEFAULT 1, + char_col CHAR(100) NOT NULL, + char_col2 VARCHAR(100) DEFAULT 'something', + char_col3 TEXT, + numeric_col NUMERIC(4,3) NOT NULL, + real_col REAL DEFAULT 1.23, + blob_col BYTEA, + time TIMESTAMP, + bool_col BOOL NOT NULL, + bool_col2 BOOLEAN DEFAULT TRUE +); \ No newline at end of file diff --git a/tests/unit/data/sqlite.sql b/tests/unit/data/sqlite.sql new file mode 100644 index 0000000..affeca9 --- /dev/null +++ b/tests/unit/data/sqlite.sql @@ -0,0 +1,262 @@ +CREATE TABLE users +( + id INTEGER NOT NULL PRIMARY KEY, + username VARCHAR(128) NOT NULL, + password VARCHAR(128) NOT NULL, + email VARCHAR(128) NOT NULL +); + +INSERT INTO users(id,username,password,email) VALUES (1,'user1','pass1','email1'); +INSERT INTO users(id,username,password,email) VALUES (2,'user2','pass2','email2'); +INSERT INTO users(id,username,password,email) VALUES (3,'user3','pass3','email3'); +INSERT INTO users(id,username,password,email) VALUES (4,'user4','pass4','email4'); + +CREATE TABLE groups +( + id INTEGER NOT NULL PRIMARY KEY, + name VARCHAR(128) NOT NULL +); + +INSERT INTO groups(id,name) VALUES (1,'group1'); +INSERT INTO groups(id,name) VALUES (2,'group2'); +INSERT INTO groups(id,name) VALUES (3,'group3'); +INSERT INTO groups(id,name) VALUES (4,'group4'); +INSERT INTO groups(id,name) VALUES (5,'group5'); +INSERT INTO groups(id,name) VALUES (6,'group6'); + +CREATE TABLE groups_descriptions +( + group_id INTEGER NOT NULL PRIMARY KEY, + name VARCHAR(128) NOT NULL +); + +INSERT INTO groups_descriptions(group_id,name) VALUES (1,'room1'); +INSERT INTO groups_descriptions(group_id,name) VALUES (2,'room2'); +INSERT INTO groups_descriptions(group_id,name) VALUES (3,'room3'); +INSERT INTO groups_descriptions(group_id,name) VALUES (4,'room4'); + +CREATE TABLE roles +( + user_id INTEGER NOT NULL, + group_id INTEGER NOT NULL, + name VARCHAR(128) NOT NULL, + PRIMARY KEY(user_id,group_id) +); + +INSERT INTO roles(user_id,group_id,name) VALUES (1,1,'dev'); +INSERT INTO roles(user_id,group_id,name) VALUES (1,2,'user'); +INSERT INTO roles(user_id,group_id,name) VALUES (2,1,'dev'); +INSERT INTO roles(user_id,group_id,name) VALUES (2,3,'user'); + +CREATE TABLE mentorships +( + teacher_id INTEGER NOT NULL, + student_id INTEGER NOT NULL, + progress VARCHAR(128) NOT NULL, + PRIMARY KEY(teacher_id,student_id) +); + +INSERT INTO mentorships(teacher_id,student_id,progress) VALUES (1,3,'good'); +INSERT INTO mentorships(teacher_id,student_id,progress) VALUES (2,4,'average'); + +CREATE TABLE profiles +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + first_name VARCHAR(128) NOT NULL, + last_name VARCHAR(128) NOT NULL, + user_id INTEGER NOT NULL, + CONSTRAINT FK_profile_user FOREIGN KEY (user_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO profiles (first_name, last_name, user_id) VALUES ('first 1','last 1',1); +INSERT INTO profiles (first_name, last_name, user_id) VALUES ('first 2','last 2',2); + +CREATE TABLE posts +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + title VARCHAR(128) NOT NULL, + create_time TIMESTAMP NOT NULL, + author_id INTEGER NOT NULL, + content TEXT, + CONSTRAINT FK_post_author FOREIGN KEY (author_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 1',100000,1,'content 1'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 2',100001,2,'content 2'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 3',100002,2,'content 3'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 4',100003,2,'content 4'); +INSERT INTO posts (title, create_time, author_id, content) VALUES ('post 5',100004,3,'content 5'); + + +CREATE TABLE posts_nofk +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + title VARCHAR(128) NOT NULL, + create_time TIMESTAMP NOT NULL, + author_id INTEGER NOT NULL, + content TEXT +); + +INSERT INTO posts_nofk (title, create_time, author_id, content) VALUES ('post 1',100000,1,'content 1'); +INSERT INTO posts_nofk (title, create_time, author_id, content) VALUES ('post 2',100001,2,'content 2'); +INSERT INTO posts_nofk (title, create_time, author_id, content) VALUES ('post 3',100002,2,'content 3'); +INSERT INTO posts_nofk (title, create_time, author_id, content) VALUES ('post 4',100003,2,'content 4'); +INSERT INTO posts_nofk (title, create_time, author_id, content) VALUES ('post 5',100004,3,'content 5'); + + +CREATE TABLE comments +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + content TEXT NOT NULL, + post_id INTEGER NOT NULL, + author_id INTEGER NOT NULL, + CONSTRAINT FK_post_comment FOREIGN KEY (post_id) + REFERENCES posts (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_user_comment FOREIGN KEY (author_id) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 1',1, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 2',1, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 3',1, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 4',2, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 5',2, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 6',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 7',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 8',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 9',3, 2); +INSERT INTO comments (content, post_id, author_id) VALUES ('comment 10',5, 3); + +CREATE TABLE categories +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name VARCHAR(128) NOT NULL, + parent_id INTEGER, + CONSTRAINT FK_category_category FOREIGN KEY (parent_id) + REFERENCES categories (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO categories (name, parent_id) VALUES ('cat 1',NULL); +INSERT INTO categories (name, parent_id) VALUES ('cat 2',NULL); +INSERT INTO categories (name, parent_id) VALUES ('cat 3',NULL); +INSERT INTO categories (name, parent_id) VALUES ('cat 4',1); +INSERT INTO categories (name, parent_id) VALUES ('cat 5',1); +INSERT INTO categories (name, parent_id) VALUES ('cat 6',5); +INSERT INTO categories (name, parent_id) VALUES ('cat 7',5); + +CREATE TABLE post_category +( + category_id INTEGER NOT NULL, + post_id INTEGER NOT NULL, + PRIMARY KEY (category_id, post_id), + CONSTRAINT FK_post_category_post FOREIGN KEY (post_id) + REFERENCES posts (id) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT FK_post_category_category FOREIGN KEY (category_id) + REFERENCES categories (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO post_category (category_id, post_id) VALUES (1,1); +INSERT INTO post_category (category_id, post_id) VALUES (2,1); +INSERT INTO post_category (category_id, post_id) VALUES (3,1); +INSERT INTO post_category (category_id, post_id) VALUES (4,2); +INSERT INTO post_category (category_id, post_id) VALUES (1,2); +INSERT INTO post_category (category_id, post_id) VALUES (1,3); + +CREATE TABLE orders +( + key1 INTEGER NOT NULL, + key2 INTEGER NOT NULL, + name VARCHAR(128), + PRIMARY KEY (key1, key2) +); + +INSERT INTO orders (key1,key2,name) VALUES (1,2,'order 12'); +INSERT INTO orders (key1,key2,name) VALUES (1,3,'order 13'); +INSERT INTO orders (key1,key2,name) VALUES (2,1,'order 21'); +INSERT INTO orders (key1,key2,name) VALUES (2,2,'order 22'); + +CREATE TABLE items +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name VARCHAR(128), + col1 INTEGER NOT NULL, + col2 INTEGER NOT NULL, + CONSTRAINT FK_order_item FOREIGN KEY (col1,col2) + REFERENCES orders (key1,key2) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO items (name,col1,col2) VALUES ('item 1',1,2); +INSERT INTO items (name,col1,col2) VALUES ('item 2',1,2); +INSERT INTO items (name,col1,col2) VALUES ('item 3',1,3); +INSERT INTO items (name,col1,col2) VALUES ('item 4',2,2); +INSERT INTO items (name,col1,col2) VALUES ('item 5',2,2); + +CREATE TABLE types +( + int_col INT NOT NULL, + int_col2 INTEGER DEFAULT 1, + char_col CHAR(100) NOT NULL, + char_col2 VARCHAR(100) DEFAULT 'something', + char_col3 TEXT, + float_col REAL(4,3) NOT NULL, + float_col2 DOUBLE DEFAULT 1.23, + blob_col BLOB, + numeric_col NUMERIC(5,2) DEFAULT 33.22, + time TIMESTAMP DEFAULT 123, + bool_col BOOL NOT NULL, + bool_col2 BOOLEAN DEFAULT 1, + null_col INTEGER DEFAULT NULL +); + +CREATE TABLE Content +( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + class VARCHAR(128), + parentID INTEGER NOT NULL, + ownerID INTEGER NOT NULL, + title VARCHAR(100), + CONSTRAINT FK_content_user FOREIGN KEY (ownerID) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT + CONSTRAINT FK_content_parent FOREIGN KEY (parentID) + REFERENCES Content (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO Content (class,parentID,ownerID,title) VALUES ('Article',-1,1,'article 1'); +INSERT INTO Content (class,parentID,ownerID,title) VALUES ('Article',-1,2,'article 2'); +INSERT INTO Content (class,parentID,ownerID,title) VALUES ('Comment',1,1,'comment 1'); +INSERT INTO Content (class,parentID,ownerID,title) VALUES ('Article',-1,2,'article 3'); +INSERT INTO Content (class,parentID,ownerID,title) VALUES ('Comment',4,2,'comment 2'); +INSERT INTO Content (class,parentID,ownerID,title) VALUES ('Comment',4,1,'comment 3'); + +CREATE TABLE Article +( + id INTEGER NOT NULL PRIMARY KEY, + authorID INTEGER NOT NULL, + body TEXT, + CONSTRAINT FK_article_content FOREIGN KEY (id) + REFERENCES Content (id) ON DELETE CASCADE ON UPDATE RESTRICT + CONSTRAINT FK_article_author FOREIGN KEY (authorID) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO Article (id,authorID,body) VALUES (1,1,'content for article 1'); +INSERT INTO Article (id,authorID,body) VALUES (2,2,'content for article 2'); +INSERT INTO Article (id,authorID,body) VALUES (4,1,'content for article 3'); + +CREATE TABLE Comment +( + id INTEGER NOT NULL PRIMARY KEY, + authorID INTEGER NOT NULL, + body TEXT, + CONSTRAINT FK_comment_content FOREIGN KEY (id) + REFERENCES Content (id) ON DELETE CASCADE ON UPDATE RESTRICT + CONSTRAINT FK_article_author FOREIGN KEY (authorID) + REFERENCES users (id) ON DELETE CASCADE ON UPDATE RESTRICT +); + +INSERT INTO Comment (id,authorID,body) VALUES (3,1,'content for comment 1'); +INSERT INTO Comment (id,authorID,body) VALUES (5,1,'content for comment 2'); +INSERT INTO Comment (id,authorID,body) VALUES (6,1,'content for comment 3'); + diff --git a/tests/unit/framework/base/ComponentTest.php b/tests/unit/framework/base/ComponentTest.php index 53bc35d..6327b15 100644 --- a/tests/unit/framework/base/ComponentTest.php +++ b/tests/unit/framework/base/ComponentTest.php @@ -11,7 +11,7 @@ function globalEventHandler2($event) $event->handled=true; } -class ComponentTest extends \yii\test\TestCase +class ComponentTest extends TestCase { protected $component; diff --git a/tests/unit/framework/base/DictionaryTest.php b/tests/unit/framework/base/DictionaryTest.php index de3f7de..a33e643 100644 --- a/tests/unit/framework/base/DictionaryTest.php +++ b/tests/unit/framework/base/DictionaryTest.php @@ -1,18 +1,20 @@ dictionary=new \yii\base\Dictionary; + $this->dictionary=new Dictionary; $this->item1=new MapItem; $this->item2=new MapItem; $this->item3=new MapItem; @@ -31,9 +33,9 @@ class DictionaryTest extends \yii\test\TestCase public function testConstruct() { $a=array(1,2,'key3'=>3); - $dictionary=new \yii\base\Dictionary($a); + $dictionary=new Dictionary($a); $this->assertEquals(3,$dictionary->getCount()); - $dictionary2=new \yii\base\Dictionary($this->dictionary); + $dictionary2=new Dictionary($this->dictionary); $this->assertEquals(2,$dictionary2->getCount()); } @@ -97,8 +99,8 @@ class DictionaryTest extends \yii\test\TestCase $a=array('a'=>'v1','v2',array('2'),'c'=>array('3','c'=>'a')); $b=array('v22','a'=>'v11',array('2'),'c'=>array('c'=>'3','a')); $c=array('a'=>'v11','v2',array('2'),'c'=>array('3','c'=>'3','a'),'v22',array('2')); - $dictionary=new \yii\base\Dictionary($a); - $dictionary2=new \yii\base\Dictionary($b); + $dictionary=new Dictionary($a); + $dictionary2=new Dictionary($b); $dictionary->mergeWith($dictionary2); $this->assertTrue($dictionary->toArray()===$c); @@ -112,7 +114,7 @@ class DictionaryTest extends \yii\test\TestCase } public function testRecursiveMergeWithTraversable(){ - $dictionary = new \yii\base\Dictionary(); + $dictionary = new Dictionary(); $obj = new ArrayObject(array( 'k1' => $this->item1, 'k2' => $this->item2, @@ -176,13 +178,13 @@ class DictionaryTest extends \yii\test\TestCase public function testToArray() { - $dictionary = new \yii\base\Dictionary(array('key' => 'value')); + $dictionary = new Dictionary(array('key' => 'value')); $this->assertEquals(array('key' => 'value'), $dictionary->toArray()); } public function testIteratorCurrent() { - $dictionary = new \yii\base\Dictionary(array('key1' => 'value1', 'key2' => 'value2')); + $dictionary = new Dictionary(array('key1' => 'value1', 'key2' => 'value2')); $val = $dictionary->getIterator()->current(); $this->assertEquals('value1', $val); } diff --git a/tests/unit/framework/base/VectorTest.php b/tests/unit/framework/base/VectorTest.php index 65901d6..b8bf1a5 100644 --- a/tests/unit/framework/base/VectorTest.php +++ b/tests/unit/framework/base/VectorTest.php @@ -1,18 +1,20 @@ vector=new \yii\base\Vector; + $this->vector=new Vector; $this->item1=new ListItem; $this->item2=new ListItem; $this->item3=new ListItem; @@ -31,9 +33,9 @@ class VectorTest extends \yii\test\TestCase public function testConstruct() { $a=array(1,2,3); - $vector=new \yii\base\Vector($a); + $vector=new Vector($a); $this->assertEquals(3,$vector->getCount()); - $vector2=new \yii\base\Vector($this->vector); + $vector2=new Vector($this->vector); $this->assertEquals(2,$vector2->getCount()); } @@ -163,28 +165,28 @@ class VectorTest extends \yii\test\TestCase public function testOffsetSetAdd() { - $vector = new \yii\base\Vector(array(1, 2, 3)); + $vector = new Vector(array(1, 2, 3)); $vector->offsetSet(null, 4); $this->assertEquals(array(1, 2, 3, 4), $vector->toArray()); } public function testOffsetSetReplace() { - $vector = new \yii\base\Vector(array(1, 2, 3)); + $vector = new Vector(array(1, 2, 3)); $vector->offsetSet(1, 4); $this->assertEquals(array(1, 4, 3), $vector->toArray()); } public function testOffsetUnset() { - $vector = new \yii\base\Vector(array(1, 2, 3)); + $vector = new Vector(array(1, 2, 3)); $vector->offsetUnset(1); $this->assertEquals(array(1, 3), $vector->toArray()); } public function testIteratorCurrent() { - $vector = new \yii\base\Vector(array('value1', 'value2')); + $vector = new Vector(array('value1', 'value2')); $val = $vector->getIterator()->current(); $this->assertEquals('value1', $val); } diff --git a/tests/unit/framework/db/dao/ConnectionTest.php b/tests/unit/framework/db/dao/ConnectionTest.php new file mode 100644 index 0000000..d3dbbf8 --- /dev/null +++ b/tests/unit/framework/db/dao/ConnectionTest.php @@ -0,0 +1,88 @@ +markTestSkipped('PDO and MySQL extensions are required.'); + } + + function testConstruct() + { + $params = $this->getParam('mysql'); + $connection = new Connection($params['dsn'], $params['username'], $params['password']); + $this->assertEquals($params['dsn'], $connection->dsn); + $this->assertEquals($params['username'], $connection->username); + $this->assertEquals($params['password'], $connection->password); + } + + function testOpenClose() + { + $params = $this->getParam('mysql'); + $connection = new Connection($params['dsn'], $params['username'], $params['password']); + $this->assertFalse($connection->active); + $this->assertEquals(null, $connection->pdo); + + $connection->open(); + $this->assertTrue($connection->active); + $this->assertTrue($connection->pdo instanceof PDO); + + $connection->close(); + $this->assertFalse($connection->active); + $this->assertEquals(null, $connection->pdo); + + $connection = new Connection('unknown::memory:'); + $this->setExpectedException('yii\db\Exception'); + $connection->open(); + } + + /* + function testCreateCommand() + { + $sql='SELECT * FROM posts'; + $this->connection->active=true; + $this->connection->pdoInstance->exec(file_get_contents(dirname(__FILE__).'/data/sqlite.sql')); + $command=$this->connection->createCommand($sql); + $this->assertTrue($command instanceof CDbCommand); + } + + function testLastInsertID() + { + $this->connection->active=true; + $this->connection->pdoInstance->exec(file_get_contents(dirname(__FILE__).'/data/sqlite.sql')); + $sql='INSERT INTO posts(title,create_time,author_id) VALUES(\'test post\',11000,1)'; + $this->connection->createCommand($sql)->execute(); + $this->assertEquals($this->connection->lastInsertID,6); + } + + function testQuoteValue() + { + $this->connection->active=true; + $this->connection->pdoInstance->exec(file_get_contents(dirname(__FILE__).'/data/sqlite.sql')); + $str="this is 'my' name"; + $expectedStr="'this is ''my'' name'"; + $this->assertEquals($expectedStr,$this->connection->quoteValue($str)); + } + + function testColumnNameCase() + { + $this->connection->active=true; + $this->connection->pdoInstance->exec(file_get_contents(dirname(__FILE__).'/data/sqlite.sql')); + $this->assertEquals(PDO::CASE_NATURAL,$this->connection->ColumnCase); + $this->connection->columnCase=PDO::CASE_LOWER; + $this->assertEquals(PDO::CASE_LOWER,$this->connection->ColumnCase); + } + + function testNullConversion() + { + $this->connection->active=true; + $this->connection->pdoInstance->exec(file_get_contents(dirname(__FILE__).'/data/sqlite.sql')); + $this->assertEquals(PDO::NULL_NATURAL,$this->connection->NullConversion); + $this->connection->nullConversion=PDO::NULL_EMPTY_STRING; + $this->assertEquals(PDO::NULL_EMPTY_STRING,$this->connection->NullConversion); + } + */ +}