diff --git a/tests/unit/framework/behaviors/AutoTimestampTest.php b/tests/unit/framework/behaviors/AutoTimestampTest.php new file mode 100644 index 0000000..51bbe2f --- /dev/null +++ b/tests/unit/framework/behaviors/AutoTimestampTest.php @@ -0,0 +1,137 @@ +mockApplication( + array( + 'components' => array( + 'db' => array( + 'class' => '\yii\db\Connection', + 'dsn' => 'sqlite::memory:', + ) + ) + ) + ); + + $columns = array( + 'id' => 'pk', + 'create_time' => 'integer', + 'update_time' => 'integer', + ); + Yii::$app->getDb()->createCommand()->createTable(self::$testTableName, $columns)->execute(); + + $this->declareTestActiveRecordClass(); + } + + public function tearDown() + { + Yii::$app->getDb()->close(); + parent::tearDown(); + } + + /** + * Declares test Active Record class with auto timestamp behavior attached. + */ + protected function declareTestActiveRecordClass() + { + $className = static::$testActiveRecordClassName; + if (class_exists($className, false)) { + return true; + } + + $activeRecordClassName = ActiveRecord::className(); + $behaviorClassName = AutoTimestamp::className(); + $tableName = static::$testTableName; + + $classDefinitionCode = << array( + 'class' => '{$behaviorClassName}', + 'attributes' => array( + static::EVENT_BEFORE_INSERT => array('create_time', 'update_time'), + static::EVENT_BEFORE_UPDATE => 'update_time', + ), + ), + ); + } + + public static function tableName() + { + return '{$tableName}'; + } +} +EOL; + eval($classDefinitionCode); + return true; + } + + // Tests : + + public function testNewRecord() + { + $currentTime = time(); + + $className = static::$testActiveRecordClassName; + $model = new $className(); + $model->save(false); + + $this->assertTrue($model->create_time >= $currentTime); + $this->assertTrue($model->update_time >= $currentTime); + } + + /** + * @depends testNewRecord + */ + public function testUpdateRecord() + { + $currentTime = time(); + + $className = static::$testActiveRecordClassName; + $model = new $className(); + $model->save(false); + + $enforcedTime = $currentTime - 100; + + $model->create_time = $enforcedTime; + $model->update_time = $enforcedTime; + $model->save(false); + + $this->assertEquals($enforcedTime, $model->create_time, 'Create time has been set on update!'); + $this->assertTrue($model->update_time >= $currentTime, 'Update time has NOT been set on update!'); + } +} \ No newline at end of file