Skip to content

Commit

Permalink
Merge pull request #15 from Horat1us/feature/file-loader-behavior
Browse files Browse the repository at this point in the history
Create file loader behavior
  • Loading branch information
Horat1us committed Mar 7, 2018
2 parents 360d9f6 + ef6e1b8 commit 31271bc
Show file tree
Hide file tree
Showing 6 changed files with 165 additions and 2 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"nesbot/carbon": "^1.22"
},
"require-dev": {
"phpunit/phpunit": "^6.2"
"phpunit/phpunit": "^6.2",
"fzaninotto/faker": "^1.7"
},
"keywords": [
"yii2",
Expand Down
52 changes: 51 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions src/Behaviors/FileLoaderBehavior.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace Horat1us\Yii\Behaviors;

use yii\base\Behavior;
use yii\base\Model;
use yii\web\UploadedFile;

class FileLoaderBehavior extends Behavior
{
/** @var string */
public $attribute;

/** @var bool */
public $multiple = false;

public function events()
{
return [
Model::EVENT_BEFORE_VALIDATE => 'load',
];
}

public function load()
{
$this->owner->{$this->attribute} = $this->multiple
? UploadedFile::getInstances($this->owner, $this->attribute)
: UploadedFile::getInstance($this->owner, $this->attribute);
}
}
1 change: 1 addition & 0 deletions tests/AbstractTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,6 @@ public function tearDown()
{
\Yii::$app = null;
\Yii::$container = new Container();
$_FILES = [];
}
}
54 changes: 54 additions & 0 deletions tests/Behaviors/FileLoaderBehaviorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace Horat1us\Yii\Tests\Behaviors;

use Faker\Factory;
use Horat1us\Yii\Tests\AbstractTestCase;
use Horat1us\Yii\Tests\Mocks\FileLoaderBehaviorMock;
use yii\web\UploadedFile;

class FileLoaderBehaviorTest extends AbstractTestCase
{
public function setUp()
{
$faker = Factory::create();
$file = $faker->image();
$_FILES = [
'FileLoaderBehaviorMock' => [
'name' => [
'file' => $faker->name,
],
'type' => [
'file' => 'application/octet-stream',
],
'tmp_name' => [
'file' => $file,
],
'error' => [
'file' => 0,
],
'size' => [
'file' => filesize($file),
],
],
];
return parent::setUp();
}

public function testLoadingSingleFile()
{
$model = new FileLoaderBehaviorMock();

$model->validate();
$this->assertInstanceOf(UploadedFile::class, $model->file);
}

public function testLoadingMultipleFiles()
{
$model = new FileLoaderBehaviorMock(['multiple' => true,]);
$model->validate();
$this->assertNotEmpty($model->file);
$this->assertTrue(is_array($model->file));
$this->assertGreaterThanOrEqual(1, count($model->file));
}
}
27 changes: 27 additions & 0 deletions tests/Mocks/FileLoaderBehaviorMock.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Horat1us\Yii\Tests\Mocks;

use Horat1us\Yii\Behaviors\FileLoaderBehavior;
use yii\db\ActiveRecord;
use yii\web\UploadedFile;

class FileLoaderBehaviorMock extends ActiveRecord
{
/** @var bool */
public $multiple = false;

/** @var UploadedFile|UploadedFile[] */
public $file;

public function behaviors()
{
return [
'file' => [
'class' => FileLoaderBehavior::class,
'attribute' => 'file',
'multiple' => $this->multiple,
],
];
}
}

0 comments on commit 31271bc

Please sign in to comment.