mirror of
https://github.com/silverstripe/silverstripe-dms
synced 2024-10-22 14:05:56 +02:00
e4bc553521
* Add 2.0.0 changelog * Update DMSInterface and DMSDocumentInterface removing *page and adding getDocumentSetsByPage to DMSInterface * Update use documentation and update unit tests This commit changes the relationship from Pages has_many Documents to Pages has_many DocumentSets which are many_many to Documents. The upload field has been upated to attach documents to a set instead of a page, the tests updated and the DMSInterface and DMSDocumentInterface updated to be less relevant to pages and more relevant to document sets.
198 lines
6.5 KiB
PHP
198 lines
6.5 KiB
PHP
<?php
|
|
class DMSTest extends FunctionalTest
|
|
{
|
|
protected static $fixture_file = 'dmstest.yml';
|
|
|
|
/**
|
|
* Stub PDF files for testing
|
|
* @var string
|
|
*/
|
|
public static $testFile = 'dms/tests/DMS-test-lorum-file.pdf';
|
|
public static $testFile2 = 'dms/tests/DMS-test-document-2.pdf';
|
|
|
|
/**
|
|
* Store values to reset back to after this test runs
|
|
*/
|
|
public static $dmsFolderOld;
|
|
public static $dmsFolderSizeOld;
|
|
|
|
/**
|
|
* @var DMS
|
|
*/
|
|
protected $dms;
|
|
|
|
public function setUp()
|
|
{
|
|
parent::setUp();
|
|
|
|
self::$dmsFolderOld = DMS::$dmsFolder;
|
|
self::$dmsFolderSizeOld = DMS::$dmsFolderSize;
|
|
|
|
//use a test DMS folder, so we don't overwrite the live one
|
|
DMS::$dmsFolder = 'dms-assets-test-1234';
|
|
|
|
//clear out the test folder (in case a broken test doesn't delete it)
|
|
$this->delete(BASE_PATH . DIRECTORY_SEPARATOR . 'dms-assets-test-1234');
|
|
|
|
$this->dms = DMS::inst();
|
|
}
|
|
|
|
public function tearDown()
|
|
{
|
|
parent::tearDown();
|
|
|
|
self::$is_running_test = true;
|
|
|
|
$d = DataObject::get("DMSDocument");
|
|
foreach ($d as $d1) {
|
|
$d1->delete();
|
|
}
|
|
$t = DataObject::get("DMSTag");
|
|
foreach ($t as $t1) {
|
|
$t1->delete();
|
|
}
|
|
|
|
//delete the test folder after the test runs
|
|
$this->delete(BASE_PATH . DIRECTORY_SEPARATOR . 'dms-assets-test-1234');
|
|
|
|
//set the old DMS folder back again
|
|
DMS::$dmsFolder = self::$dmsFolderOld;
|
|
DMS::$dmsFolderSize = self::$dmsFolderSizeOld;
|
|
|
|
self::$is_running_test = $this->originalIsRunningTest;
|
|
}
|
|
|
|
/**
|
|
* Delete a file that was created during a unit test
|
|
*
|
|
* @param string $path
|
|
*/
|
|
public function delete($path)
|
|
{
|
|
if (file_exists($path) || is_dir($path)) {
|
|
$it = new RecursiveIteratorIterator(
|
|
new RecursiveDirectoryIterator($path),
|
|
RecursiveIteratorIterator::CHILD_FIRST
|
|
);
|
|
foreach ($it as $file) {
|
|
if (in_array($file->getBasename(), array('.', '..'))) {
|
|
continue;
|
|
} elseif ($file->isDir()) {
|
|
rmdir($file->getPathname());
|
|
} elseif ($file->isFile() || $file->isLink()) {
|
|
unlink($file->getPathname());
|
|
}
|
|
}
|
|
rmdir($path);
|
|
}
|
|
}
|
|
|
|
public function testDMSStorage()
|
|
{
|
|
$file = self::$testFile;
|
|
$document = $this->dms->storeDocument($file);
|
|
|
|
$this->assertNotNull($document, "Document object created");
|
|
$this->assertTrue(
|
|
file_exists(
|
|
DMS::get_dms_path() . DIRECTORY_SEPARATOR . $document->Folder
|
|
. DIRECTORY_SEPARATOR . $document->Filename
|
|
),
|
|
"Document file copied into DMS folder"
|
|
);
|
|
}
|
|
|
|
public function testDMSFolderSpanning()
|
|
{
|
|
DMS::$dmsFolderSize = 5;
|
|
$file = self::$testFile;
|
|
|
|
$documents = array();
|
|
for ($i = 0; $i <= 16; $i++) {
|
|
$document = $this->dms->storeDocument($file);
|
|
$this->assertNotNull($document, "Document object created on run number: $i");
|
|
$this->assertTrue(file_exists($document->getFullPath()));
|
|
$documents[] = $document;
|
|
}
|
|
|
|
// Test document objects have their folders set
|
|
$folders = array();
|
|
for ($i = 0; $i <= 16; $i++) {
|
|
$folderName = $documents[$i]->Folder;
|
|
$this->assertTrue(
|
|
strpos($documents[$i]->getFullPath(), DIRECTORY_SEPARATOR . $folderName . DIRECTORY_SEPARATOR) !== false,
|
|
"Correct folder name for the documents. Document path contains reference to folder name '$folderName'"
|
|
);
|
|
$folders[] = $folderName;
|
|
}
|
|
|
|
// Test we created 4 folder to contain the 17 files
|
|
foreach ($folders as $f) {
|
|
$this->assertTrue(is_dir(DMS::get_dms_path() . DIRECTORY_SEPARATOR . $f), "Document folder '$f' exists");
|
|
}
|
|
}
|
|
|
|
public function testReplaceDocument()
|
|
{
|
|
// Store the first document
|
|
$document = $this->dms->storeDocument(self::$testFile);
|
|
$document->Title = "My custom title";
|
|
$document->Description = "My custom description";
|
|
$document->write();
|
|
|
|
// Then overwrite with a second document
|
|
$document = $document->replaceDocument(self::$testFile2);
|
|
|
|
$this->assertNotNull($document, "Document object created");
|
|
$this->assertTrue(
|
|
file_exists(
|
|
DMS::get_dms_path() . DIRECTORY_SEPARATOR . $document->Folder
|
|
. DIRECTORY_SEPARATOR . $document->Filename
|
|
),
|
|
"Document file copied into DMS folder"
|
|
);
|
|
$this->assertContains(
|
|
"DMS-test-document-2",
|
|
$document->Filename,
|
|
"Original document filename is contain in the new filename"
|
|
);
|
|
$this->assertEquals("My custom title", $document->Title, "Custom title not modified");
|
|
$this->assertEquals("My custom description", $document->Description, "Custom description not modified");
|
|
}
|
|
|
|
/**
|
|
* Test that documents can be returned by a given page
|
|
*/
|
|
public function testGetByPageWithoutEmbargoes()
|
|
{
|
|
$pageWithEmbargoes = $this->objFromFixture('SiteTree', 's3');
|
|
$documents = $this->dms->getByPage($pageWithEmbargoes);
|
|
// Fixture: 3 documents in set, 1 is embargoed
|
|
$this->assertCount(2, $documents, 'Embargoed documents are excluded by default');
|
|
$this->assertContainsOnlyInstancesOf('DMSDocument', $documents);
|
|
}
|
|
|
|
/**
|
|
* Test that embargoed documents are excluded from getByPage
|
|
*/
|
|
public function testGetByPageWithEmbargoedDocuments()
|
|
{
|
|
$pageWithEmbargoes = $this->objFromFixture('SiteTree', 's3');
|
|
$documents = $this->dms->getByPage($pageWithEmbargoes, true);
|
|
// Fixture: 3 documents in set, 1 is embargoed
|
|
$this->assertCount(3, $documents, 'Embargoed documents can be included');
|
|
$this->assertContainsOnlyInstancesOf('DMSDocument', $documents);
|
|
}
|
|
|
|
/**
|
|
* Test that document sets can be retrieved for a given page
|
|
*/
|
|
public function testGetDocumentSetsByPage()
|
|
{
|
|
$page = $this->objFromFixture('SiteTree', 's1');
|
|
$sets = $this->dms->getDocumentSetsByPage($page);
|
|
$this->assertCount(2, $sets);
|
|
$this->assertContainsOnlyInstancesOf('DMSDocumentSet', $sets);
|
|
}
|
|
}
|