/**
  * Test calling handlers when delete model
  *
  * - expected one-time calling handler RelationBehavior::afterDelete
  */
 public function testTriggerEventDelete()
 {
     $mockBehavior = $this->getMock(RelationBehavior::class, ['afterDelete']);
     $mockBehavior->relationalFields = ['file', 'images', 'news_files'];
     $mockBehavior->expects($this->once())->method('afterDelete');
     $model = FakeNewsModel::findOne($this->model->id);
     $model->detachBehaviors();
     $model->attachBehavior('rel', $mockBehavior);
     $model->delete();
 }
 /**
  * Testing method validateData()
  * - return true for valid data
  * - model has no errors for valid data
  * - return false for invalid data
  * - model has errors for invalid data
  * @see RelationBehavior::validateData
  */
 public function testValidateData()
 {
     $behavior = new RelationBehavior(['relationalFields' => ['file', 'images']]);
     /** @var FakeNewsModel|\PHPUnit_Framework_MockObject_MockObject $mockModel */
     $mockModel = $this->getMock(FakeNewsModel::className(), ['getErrors', 'addError', 'getFile', 'getImages']);
     $mockModel->expects($this->any())->method('addError');
     $mockModel->expects($this->any())->method('getErrors')->willReturn([]);
     $activeQuery = $mockModel->hasOne(FakeFilesModel::className(), ['id' => 'file_id']);
     $mockModel->expects($this->any())->method('getFile')->willReturn($activeQuery);
     $activeQuery = $mockModel->hasMany(FakeFilesModel::className(), ['entity_id' => 'id']);
     $mockModel->expects($this->any())->method('getImages')->willReturn($activeQuery);
     $mockModel->id = 1;
     $behavior->owner = $mockModel;
     // success
     $validData = ['file' => ['src' => '/images/file.png'], 'images' => [['src' => '/images/image2.png'], ['src' => '/images/image2.png']]];
     foreach ($validData as $field => $data) {
         $behavior->{$field} = $data;
         $method = new \ReflectionMethod($behavior, 'loadData');
         $method->setAccessible(true);
         $method->invoke($behavior);
         $method = new \ReflectionMethod($behavior, 'validateData');
         $method->setAccessible(true);
         $this->assertTrue($method->invoke($behavior));
     }
     $this->assertEmpty($behavior->owner->getErrors());
     // fail
     $mockModel = $this->getMock(FakeNewsModel::className(), ['getErrors', 'addError', 'getFile', 'getImages']);
     $mockModel->expects($this->any())->method('addError');
     $mockModel->expects($this->any())->method('getErrors')->willReturn(['file' => ['File is invalid'], 'images' => ['Images is invalid']]);
     $activeQuery = $mockModel->hasOne(FakeFilesModel::className(), ['id' => 'file_id']);
     $mockModel->expects($this->any())->method('getFile')->willReturn($activeQuery);
     $activeQuery = $mockModel->hasMany(FakeFilesModel::className(), ['entity_id' => 'id']);
     $mockModel->expects($this->any())->method('getImages')->willReturn($activeQuery);
     $mockModel->id = 1;
     $behavior->owner = $mockModel;
     $invalidData = ['file' => ['src' => ''], 'images' => [['src' => '/images/image1.png'], ['src' => '']]];
     foreach ($invalidData as $field => $data) {
         $behavior->{$field} = $data;
         $method = new \ReflectionMethod($behavior, 'loadData');
         $method->setAccessible(true);
         $method->invoke($behavior);
         $method = new \ReflectionMethod($behavior, 'validateData');
         $method->setAccessible(true);
         $this->assertFalse($method->invoke($behavior));
     }
     $this->assertNotEmpty($behavior->owner->getErrors());
 }