Skip to content

Commit b4a814b

Browse files
authored
Merge pull request #590 from TerryKern/fix-data-array
Fix beforeMarshall if file uploads are array
2 parents 878cba2 + 9275590 commit b4a814b

2 files changed

Lines changed: 58 additions & 1 deletion

File tree

src/Model/Behavior/UploadBehavior.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,13 @@ public function beforeMarshal(EventInterface $event, ArrayObject $data, ArrayObj
7474
if (!$validator->isEmptyAllowed($field, false)) {
7575
continue;
7676
}
77-
if (!empty($dataArray[$field]) && $dataArray[$field]->getError() !== UPLOAD_ERR_NO_FILE) {
77+
if (
78+
!empty($dataArray[$field]) &&
79+
($dataArray[$field] instanceof UploadedFileInterface
80+
? $dataArray[$field]->getError()
81+
: $dataArray[$field]['error']
82+
) !== UPLOAD_ERR_NO_FILE
83+
) {
7884
continue;
7985
}
8086
if (isset($data[$field])) {

tests/TestCase/Model/Behavior/UploadBehaviorTest.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Josegonzalez\Upload\Model\Behavior\UploadBehavior;
1212
use Josegonzalez\Upload\Test\Stub\ChildBehavior;
1313
use Laminas\Diactoros\UploadedFile;
14+
use Psr\Http\Message\UploadedFileInterface;
1415
use ReflectionClass;
1516

1617
class UploadBehaviorTest extends TestCase
@@ -258,6 +259,40 @@ public function testBeforeMarshalEmptyAllowed()
258259
$this->assertEquals(new ArrayObject($this->dataError), $data);
259260
}
260261

262+
public function testBeforeMarshalDataAsArray()
263+
{
264+
$validator = $this->getMockBuilder('Cake\Validation\Validator')->getMock();
265+
$validator->expects($this->atLeastOnce())
266+
->method('isEmptyAllowed')
267+
->will($this->returnValue(true));
268+
269+
$table = $this->getMockBuilder('Cake\ORM\Table')->getMock();
270+
$table->expects($this->atLeastOnce())
271+
->method('getValidator')
272+
->will($this->returnValue($validator));
273+
274+
$methods = array_diff($this->behaviorMethods, ['beforeMarshal']);
275+
$behavior = $this->getMockBuilder('Josegonzalez\Upload\Model\Behavior\UploadBehavior')
276+
->onlyMethods($methods)
277+
->setConstructorArgs([$table, $this->settings])
278+
->getMock();
279+
$behavior->expects($this->any())
280+
->method('getConfig')
281+
->will($this->returnValue($this->settings));
282+
283+
$data = new ArrayObject(
284+
$this->transformUploadedFilesToArray($this->dataOk)
285+
);
286+
$behavior->beforeMarshal(new Event('fake.event'), $data, new ArrayObject());
287+
$this->assertEquals(new ArrayObject($this->transformUploadedFilesToArray($this->dataOk)), $data);
288+
289+
$data = new ArrayObject(
290+
$this->transformUploadedFilesToArray($this->dataError)
291+
);
292+
$behavior->beforeMarshal(new Event('fake.event'), $data, new ArrayObject());
293+
$this->assertEquals(new ArrayObject([]), $data);
294+
}
295+
261296
public function testBeforeSaveNoUpload()
262297
{
263298
$originalValue = rand(1000, 9999);
@@ -763,4 +798,20 @@ public function testNameCallback()
763798

764799
$this->assertEquals($expected, $behavior->constructedFiles);
765800
}
801+
802+
private function transformUploadedFilesToArray(array $data): array
803+
{
804+
return array_map(
805+
function (UploadedFileInterface $file) {
806+
return [
807+
'tmp_name' => '',
808+
'error' => $file->getError(),
809+
'name' => $file->getClientFilename(),
810+
'type' => $file->getClientMediaType(),
811+
'size' => $file->getSize(),
812+
];
813+
},
814+
$data
815+
);
816+
}
766817
}

0 commit comments

Comments
 (0)