3 namespace Drupal\Tests\file\Kernel;
5 use Drupal\entity_test\Entity\EntityTest;
6 use Drupal\field\Entity\FieldConfig;
7 use Drupal\field\Entity\FieldStorageConfig;
8 use Drupal\file\Entity\File;
9 use Drupal\KernelTests\KernelTestBase;
10 use Drupal\user\Entity\User;
11 use org\bovigo\vfs\vfsStream;
14 * Tests that files referenced in file and image fields are always validated.
18 class FileItemValidationTest extends KernelTestBase {
23 public static $modules = ['file', 'image', 'entity_test', 'field', 'user', 'system'];
28 * @var \Drupal\user\UserInterface
35 protected function setUp() {
38 $this->installEntitySchema('user');
39 $this->installEntitySchema('file');
40 $this->installSchema('file', 'file_usage');
41 $this->installSchema('system', 'sequences');
43 $this->user = User::create([
48 $this->container->get('current_user')->setAccount($this->user);
52 * @covers \Drupal\file\Plugin\Validation\Constraint\FileValidationConstraint
53 * @covers \Drupal\file\Plugin\Validation\Constraint\FileValidationConstraintValidator
54 * @dataProvider getFileTypes
56 public function testFileValidationConstraint($file_type) {
57 $field_storage = FieldStorageConfig::create([
58 'field_name' => 'field_test_file',
59 'entity_type' => 'entity_test',
62 $field_storage->save();
64 $field = FieldConfig::create([
65 'field_name' => 'field_test_file',
66 'entity_type' => 'entity_test',
67 'bundle' => 'entity_test',
69 'max_filesize' => '2k',
70 'file_extensions' => 'jpg|png',
75 vfsStream::setup('drupal_root');
80 'test.txt' => str_repeat('a', 3000),
86 // Test for max filesize.
87 $file = File::create([
88 'uri' => 'vfs://drupal_root/sites/default/files/test.txt',
89 'uid' => $this->user->id(),
91 $file->setPermanent();
94 $entity_test = EntityTest::create([
95 'uid' => $this->user->id(),
96 'field_test_file' => [
97 'target_id' => $file->id(),
100 $result = $entity_test->validate();
101 $this->assertCount(2, $result);
103 $this->assertEquals('field_test_file.0', $result->get(0)->getPropertyPath());
104 $this->assertEquals('The file is <em class="placeholder">2.93 KB</em> exceeding the maximum file size of <em class="placeholder">2 KB</em>.', (string) $result->get(0)->getMessage());
105 $this->assertEquals('field_test_file.0', $result->get(1)->getPropertyPath());
106 $this->assertEquals('Only files with the following extensions are allowed: <em class="placeholder">jpg|png</em>.', (string) $result->get(1)->getMessage());
110 * Provides a list of file types to test.
112 public function getFileTypes() {
113 return [['file'], ['image']];