public function FileMetadataExifTest::testJpegExifSaveToFile in File metadata manager 8.2
Same name and namespace in other branches
- 8 file_mdm_exif/tests/src/Kernel/FileMetadataExifTest.php \Drupal\Tests\file_mdm_exif\Kernel\FileMetadataExifTest::testJpegExifSaveToFile()
Test writing metadata to JPEG file.
File
- file_mdm_exif/
tests/ src/ Kernel/ FileMetadataExifTest.php, line 170
Class
- FileMetadataExifTest
- Tests that File Metadata EXIF plugin works properly.
Namespace
Drupal\Tests\file_mdm_exif\KernelCode
public function testJpegExifSaveToFile() {
$fmdm = $this->container
->get('file_metadata_manager');
// Copy test file to public://.
$this->fileSystem
->copy(drupal_get_path('module', 'image_effects') . '/tests/images/portrait-painting.jpg', 'public://', FileSystemInterface::EXISTS_REPLACE);
$file_uri = 'public://portrait-painting.jpg';
$file_metadata = $fmdm
->uri($file_uri);
// Check values via exif_read_data before operations.
$data = @exif_read_data($file_uri);
$this
->assertEquals(8, $data['Orientation']);
$this
->assertFalse(isset($data['Artist']));
$this
->assertEquals('Canon', $data['Make']);
$this
->assertEquals(800, $data['ISOSpeedRatings']);
// Change the Orientation tag from IFD0.
$this
->assertEquals(8, $file_metadata
->getMetadata('exif', 'orientation')['value']);
$data['Orientation'] = 4;
$this
->assertTrue($file_metadata
->setMetadata('exif', 'orientation', $data['Orientation']));
$this
->assertEquals($data['Orientation'], $file_metadata
->getMetadata('exif', 'orientation')['value']);
// Add the Artist tag to IFD0.
$data['Artist'] = 'shot by foo!';
$this
->assertEquals(47, $this
->countMetadataKeys($file_metadata, 'exif'));
$this
->assertNull($file_metadata
->getMetadata('exif', 'artist'));
$artist_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag('artist');
$artist = new PelEntryAscii($artist_tag['tag'], $data['Artist']);
$file_metadata
->setMetadata('exif', 'artist', $artist);
$this
->assertEquals($data['Artist'], $file_metadata
->getMetadata('exif', 'artist')['value']);
$this
->assertEquals(48, $this
->countMetadataKeys($file_metadata, 'exif'));
// Setting an unknown tag leads to failure.
$this
->assertFalse($file_metadata
->setMetadata('exif', 'bar', 'qux'));
// Remove the ResolutionUnit tag from IFD0.
unset($data['ResolutionUnit']);
$this
->assertEquals(2, $file_metadata
->getMetadata('exif', 'ResolutionUnit')['value']);
$this
->assertTrue($file_metadata
->removeMetadata('exif', 'ResolutionUnit'));
$this
->assertNull($file_metadata
->getMetadata('exif', 'ResolutionUnit'));
$this
->assertEquals(47, $this
->countMetadataKeys($file_metadata, 'exif'));
// Add the ImageDescription tag to IFD1.
$data['THUMBNAIL']['ImageDescription'] = 'awesome!';
$this
->assertNull($file_metadata
->getMetadata('exif', [
1,
'imagedescription',
]));
$desc_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag([
1,
'imagedescription',
]);
$desc = new PelEntryAscii($desc_tag['tag'], $data['THUMBNAIL']['ImageDescription']);
$file_metadata
->setMetadata('exif', [
1,
'imagedescription',
], $desc);
$this
->assertEquals($data['THUMBNAIL']['ImageDescription'], $file_metadata
->getMetadata('exif', [
1,
'imagedescription',
])['value']);
$this
->assertEquals(48, $this
->countMetadataKeys($file_metadata, 'exif'));
// Remove the Compression tag from IFD1.
unset($data['THUMBNAIL']['Compression']);
$this
->assertEquals(6, $file_metadata
->getMetadata('exif', [
1,
'compression',
])['value']);
$this
->assertTrue($file_metadata
->removeMetadata('exif', [
1,
'compression',
]));
$this
->assertNull($file_metadata
->getMetadata('exif', [
1,
'compression',
]));
$this
->assertEquals(47, $this
->countMetadataKeys($file_metadata, 'exif'));
// Add the BrightnessValue tag to EXIF.
$data['BrightnessValue'] = '12/4';
$this
->assertNull($file_metadata
->getMetadata('exif', [
'exif',
'brightnessvalue',
]));
$brightness_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag([
'exif',
'brightnessvalue',
]);
$brightness = new PelEntrySRational($brightness_tag['tag'], [
12,
4,
]);
$file_metadata
->setMetadata('exif', [
'exif',
'brightnessvalue',
], $brightness);
$this
->assertEquals($data['BrightnessValue'], $file_metadata
->getMetadata('exif', [
'exif',
'brightnessvalue',
])['text']);
$this
->assertEquals(48, $this
->countMetadataKeys($file_metadata, 'exif'));
// Remove the ISOSpeedRatings tag from EXIF.
unset($data['ISOSpeedRatings']);
$this
->assertEquals(800, $file_metadata
->getMetadata('exif', [
'exif',
'isospeedratings',
])['value']);
$this
->assertTrue($file_metadata
->removeMetadata('exif', [
'exif',
'isospeedratings',
]));
$this
->assertNull($file_metadata
->getMetadata('exif', [
'exif',
'isospeedratings',
]));
$this
->assertEquals(47, $this
->countMetadataKeys($file_metadata, 'exif'));
// Add the RelatedImageFileFormat tag to INTEROP.
$data['RelatedFileFormat'] = 'qux';
$this
->assertNull($file_metadata
->getMetadata('exif', [
'interop',
'RelatedImageFileFormat',
]));
$ff_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag([
'interop',
'RelatedImageFileFormat',
]);
$ff = new PelEntryAscii($ff_tag['tag'], $data['RelatedFileFormat']);
$file_metadata
->setMetadata('exif', [
'interop',
'RelatedImageFileFormat',
], $ff);
$this
->assertEquals($data['RelatedFileFormat'], $file_metadata
->getMetadata('exif', [
'interop',
'RelatedImageFileFormat',
])['text']);
$this
->assertEquals(48, $this
->countMetadataKeys($file_metadata, 'exif'));
// Remove the InteroperabilityIndex tag from INTEROP.
unset($data['InterOperabilityIndex']);
$this
->assertEquals('R98', $file_metadata
->getMetadata('exif', [
'interop',
'InteroperabilityIndex',
])['value']);
$this
->assertTrue($file_metadata
->removeMetadata('exif', [
'interop',
'InteroperabilityIndex',
]));
$this
->assertNull($file_metadata
->getMetadata('exif', [
'interop',
'InteroperabilityIndex',
]));
$this
->assertEquals(47, $this
->countMetadataKeys($file_metadata, 'exif'));
// Add Longitude/Latitude tags to GPS.
$this
->assertNull($file_metadata
->getMetadata('exif', 'GPSLatitudeRef'));
$this
->assertNull($file_metadata
->getMetadata('exif', 'GPSLatitude'));
$this
->assertNull($file_metadata
->getMetadata('exif', 'GPSLongitudeRef'));
$this
->assertNull($file_metadata
->getMetadata('exif', 'GPSLongitude'));
$atr_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag('GPSLatitudeRef');
$at_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag('GPSLatitude');
$otr_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag('GPSLongitudeRef');
$ot_tag = $this->container
->get('file_mdm_exif.tag_mapper')
->resolveKeyToIfdAndTag('GPSLongitude');
$data['GPSLatitudeRef'] = 'N';
$atr = new PelEntryAscii($atr_tag['tag'], $data['GPSLatitudeRef']);
$data['GPSLatitude'] = [
'46/1',
'37/1',
'59448/10000',
];
$at = new PelEntryRational($at_tag['tag'], [
46,
1,
], [
37,
1,
], [
59448,
10000,
]);
$data['GPSLongitudeRef'] = 'E';
$otr = new PelEntryAscii($otr_tag['tag'], $data['GPSLongitudeRef']);
$data['GPSLongitude'] = [
'12/1',
'17/1',
'488112/10000',
];
$ot = new PelEntryRational($ot_tag['tag'], [
12,
1,
], [
17,
1,
], [
488112,
10000,
]);
$file_metadata
->setMetadata('exif', 'GPSLatitudeRef', $atr);
$file_metadata
->setMetadata('exif', 'GPSLatitude', $at);
$file_metadata
->setMetadata('exif', 'GPSLongitudeRef', $otr);
$file_metadata
->setMetadata('exif', 'GPSLongitude', $ot);
$this
->assertEquals($data['GPSLatitudeRef'], $file_metadata
->getMetadata('exif', 'GPSLatitudeRef')['text']);
$this
->assertEquals('46° 37\' 5.9448" (46.62°)', $file_metadata
->getMetadata('exif', 'GPSLatitude')['text']);
$this
->assertEquals($data['GPSLongitudeRef'], $file_metadata
->getMetadata('exif', 'GPSLongitudeRef')['text']);
$this
->assertEquals('12° 17\' 48.8112" (12.30°)', $file_metadata
->getMetadata('exif', 'GPSLongitude')['text']);
$this
->assertEquals(51, $this
->countMetadataKeys($file_metadata, 'exif'));
// Save metadata to file.
$this
->assertTrue($file_metadata
->saveMetadataToFile('exif'));
// Check results via exif_read_data. A complete check would be through
// $this->assertEquals($data, $data_reloaded).
$data_reloaded = @exif_read_data($file_uri);
$this
->assertEquals($data['Orientation'], $data_reloaded['Orientation']);
$this
->assertEquals($data['Artist'], $data_reloaded['Artist']);
$this
->assertFalse(isset($data_reloaded['ResolutionUnit']));
$this
->assertEquals($data['THUMBNAIL']['ImageDescription'], $data_reloaded['THUMBNAIL']['ImageDescription']);
$this
->assertFalse(isset($data_reloaded['THUMBNAIL']['Compression']));
$this
->assertEquals($data['BrightnessValue'], $data_reloaded['BrightnessValue']);
$this
->assertFalse(isset($data_reloaded['ISOSpeedRatings']));
$this
->assertEquals($data['RelatedFileFormat'], $data_reloaded['RelatedFileFormat']);
$this
->assertFalse(isset($data_reloaded['InterOperabilityIndex']));
$this
->assertEquals($data['GPSLatitudeRef'], $data_reloaded['GPSLatitudeRef']);
$this
->assertEquals($data['GPSLatitude'], $data_reloaded['GPSLatitude']);
$this
->assertEquals($data['GPSLongitudeRef'], $data_reloaded['GPSLongitudeRef']);
$this
->assertEquals($data['GPSLongitude'], $data_reloaded['GPSLongitude']);
// Test writing metadata to a file that has no EXIF info.
$this->fileSystem
->copy('core/tests/fixtures/files/image-2.jpg', 'public://', FileSystemInterface::EXISTS_REPLACE);
$test_2 = $fmdm
->uri('public://image-2.jpg');
$this
->assertEquals(0, $this
->countMetadataKeys($test_2, 'exif'));
// Load EXIF metadata from previous file processed.
$test_2
->loadMetadata('exif', $file_metadata
->getMetadata('exif'));
// Save metadata to file.
$this
->assertTrue($test_2
->saveMetadataToFile('exif'));
$this
->assertEquals(51, $this
->countMetadataKeys($test_2, 'exif'));
// Check results via exif_read_data. A complete check would be through
// $this->assertEquals($data, $data_reloaded).
$data_reloaded = @exif_read_data('public://image-2.jpg');
$this
->assertEquals($data['Orientation'], $data_reloaded['Orientation']);
$this
->assertEquals($data['Artist'], $data_reloaded['Artist']);
$this
->assertEquals($data['THUMBNAIL']['ImageDescription'], $data_reloaded['THUMBNAIL']['ImageDescription']);
$this
->assertEquals($data['BrightnessValue'], $data_reloaded['BrightnessValue']);
$this
->assertEquals($data['RelatedFileFormat'], $data_reloaded['RelatedFileFormat']);
$this
->assertEquals($data['GPSLatitudeRef'], $data_reloaded['GPSLatitudeRef']);
$this
->assertEquals($data['GPSLatitude'], $data_reloaded['GPSLatitude']);
$this
->assertEquals($data['GPSLongitudeRef'], $data_reloaded['GPSLongitudeRef']);
$this
->assertEquals($data['GPSLongitude'], $data_reloaded['GPSLongitude']);
// Check that after save, file metadata is retrieved from file first time,
// then from cache in further requests.
$file_metadata = NULL;
$this
->assertTrue($fmdm
->release($file_uri));
$file_metadata = $fmdm
->uri($file_uri);
$this
->assertEquals(51, $this
->countMetadataKeys($file_metadata, 'exif'));
$this
->assertSame(FileMetadataInterface::LOADED_FROM_FILE, $file_metadata
->isMetadataLoaded('exif'));
$file_metadata = NULL;
$this
->assertTrue($fmdm
->release($file_uri));
$file_metadata = $fmdm
->uri($file_uri);
$this
->assertEquals(51, $this
->countMetadataKeys($file_metadata, 'exif'));
$this
->assertSame(FileMetadataInterface::LOADED_FROM_CACHE, $file_metadata
->isMetadataLoaded('exif'));
}