2015-09-15 04:52:02 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
use Filesystem as SS_Filesystem;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Ensures that File dataobjects can be safely migrated from 3.x
|
|
|
|
*/
|
|
|
|
class FileMigrationHelperTest extends SapphireTest {
|
|
|
|
|
|
|
|
protected static $fixture_file = 'FileMigrationHelperTest.yml';
|
|
|
|
|
|
|
|
protected $requiredExtensions = array(
|
|
|
|
"File" => array(
|
|
|
|
"FileMigrationHelperTest_Extension"
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* get the BASE_PATH for this test
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
protected function getBasePath() {
|
2016-03-02 06:18:10 +01:00
|
|
|
// Note that the actual filesystem base is the 'assets' subdirectory within this
|
2015-09-15 04:52:02 +02:00
|
|
|
return ASSETS_PATH . '/FileMigrationHelperTest';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function setUp() {
|
|
|
|
Config::nest(); // additional nesting here necessary
|
|
|
|
Config::inst()->update('File', 'migrate_legacy_file', false);
|
|
|
|
parent::setUp();
|
|
|
|
|
|
|
|
// Set backend root to /FileMigrationHelperTest/assets
|
|
|
|
AssetStoreTest_SpyStore::activate('FileMigrationHelperTest/assets');
|
|
|
|
|
|
|
|
// Ensure that each file has a local record file in this new assets base
|
|
|
|
$from = FRAMEWORK_PATH . '/tests/model/testimages/test-image-low-quality.jpg';
|
|
|
|
foreach(File::get()->exclude('ClassName', 'Folder') as $file) {
|
2016-03-02 06:18:10 +01:00
|
|
|
$dest = AssetStoreTest_SpyStore::base_path() . '/' . $file->generateFilename();
|
2015-09-15 04:52:02 +02:00
|
|
|
SS_Filesystem::makeFolder(dirname($dest));
|
|
|
|
copy($from, $dest);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function tearDown() {
|
|
|
|
AssetStoreTest_SpyStore::reset();
|
|
|
|
SS_Filesystem::removeFolder($this->getBasePath());
|
|
|
|
parent::tearDown();
|
|
|
|
Config::unnest();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Test file migration
|
|
|
|
*/
|
|
|
|
public function testMigration() {
|
|
|
|
// Prior to migration, check that each file has empty Filename / Hash properties
|
|
|
|
foreach(File::get()->exclude('ClassName', 'Folder') as $file) {
|
2016-03-02 06:18:10 +01:00
|
|
|
$filename = $file->generateFilename();
|
2015-09-15 04:52:02 +02:00
|
|
|
$this->assertNotEmpty($filename, "File {$file->Name} has a filename");
|
|
|
|
$this->assertEmpty($file->File->getFilename(), "File {$file->Name} has no DBFile filename");
|
|
|
|
$this->assertEmpty($file->File->getHash(), "File {$file->Name} has no hash");
|
|
|
|
$this->assertFalse($file->exists(), "File with name {$file->Name} does not yet exist");
|
2016-01-26 04:56:07 +01:00
|
|
|
$this->assertFalse($file->isPublished(), "File is not published yet");
|
2015-09-15 04:52:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// Do migration
|
|
|
|
$helper = new FileMigrationHelper();
|
|
|
|
$result = $helper->run($this->getBasePath());
|
|
|
|
$this->assertEquals(5, $result);
|
|
|
|
|
|
|
|
// Test that each file exists
|
|
|
|
foreach(File::get()->exclude('ClassName', 'Folder') as $file) {
|
2016-03-02 06:18:10 +01:00
|
|
|
$expectedFilename = $file->generateFilename();
|
2015-09-15 04:52:02 +02:00
|
|
|
$filename = $file->File->getFilename();
|
2016-03-02 06:18:10 +01:00
|
|
|
$this->assertTrue($file->exists(), "File with name {$filename} exists");
|
2015-09-15 04:52:02 +02:00
|
|
|
$this->assertNotEmpty($filename, "File {$file->Name} has a Filename");
|
2016-03-02 06:18:10 +01:00
|
|
|
$this->assertEquals($expectedFilename, $filename, "File {$file->Name} has retained its Filename value");
|
2015-09-15 04:52:02 +02:00
|
|
|
$this->assertEquals(
|
|
|
|
'33be1b95cba0358fe54e8b13532162d52f97421c',
|
|
|
|
$file->File->getHash(),
|
|
|
|
"File with name {$filename} has the correct hash"
|
|
|
|
);
|
2016-01-26 04:56:07 +01:00
|
|
|
$this->assertTrue($file->isPublished(), "File is published after migration");
|
2015-09-15 04:52:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-03-02 06:18:10 +01:00
|
|
|
/**
|
|
|
|
* @property File $owner
|
|
|
|
*/
|
2015-09-15 04:52:02 +02:00
|
|
|
class FileMigrationHelperTest_Extension extends DataExtension implements TestOnly {
|
|
|
|
/**
|
|
|
|
* Ensure that File dataobject has the legacy "Filename" field
|
|
|
|
*/
|
|
|
|
private static $db = array(
|
|
|
|
"Filename" => "Text",
|
|
|
|
);
|
|
|
|
|
|
|
|
public function onBeforeWrite() {
|
|
|
|
// Ensure underlying filename field is written to the database
|
2016-03-02 06:18:10 +01:00
|
|
|
$this->owner->setField('Filename', 'assets/' . $this->owner->generateFilename());
|
2015-09-15 04:52:02 +02:00
|
|
|
}
|
2016-03-08 21:50:18 +01:00
|
|
|
}
|