seeddms-code/SeedDMS_Core/tests/DmsTest.php
2023-01-20 12:28:35 +01:00

2957 lines
102 KiB
PHP

<?php
/**
* Implementation of the dms tests
*
* PHP version 7
*
* @category SeedDMS
* @package Tests
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2021 Uwe Steinmann
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
* @version @package_version@
* @link https://www.seeddms.org
*/
use PHPUnit\Framework\SeedDmsTest;
/**
* DMS test class
*
* @category SeedDMS
* @package Tests
* @author Uwe Steinmann <uwe@steinmann.cx>
* @copyright 2021 Uwe Steinmann
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License
* @version Release: @package_version@
* @link https://www.seeddms.org
*/
class DmsTest extends SeedDmsTest
{
/**
* Create a real sqlite database in memory
*
* @return void
*/
protected function setUp(): void
{
self::$dbh = self::createInMemoryDatabase();
self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time();
mkdir(self::$contentdir);
// echo "Creating temp content dir: ".self::$contentdir."\n";
self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir);
self::$dbversion = self::$dms->getDBVersion();
}
/**
* Clean up at tear down
*
* @return void
*/
protected function tearDown(): void
{
self::$dbh = null;
// echo "\nRemoving temp. content dir: ".self::$contentdir."\n";
exec('rm -rf '.self::$contentdir);
}
/**
* Create a mock admin role object (only used for SeedDMS 6)
*
* @return SeedDMS_Core_User
*/
protected function getAdminRole()
{
$role = new SeedDMS_Core_Role(1, 'admin', SeedDMS_Core_Role::role_admin);
return $role;
}
/**
* Test checkIfEqual()
*
* @return void
*/
public function testCheckIfEqual()
{
$user1 = new SeedDMS_Core_User(1, 'user 1', '', '', '', '', '', '', 1);
$group1 = new SeedDMS_Core_Group(1, 'group 1', '');
$group1n = new SeedDMS_Core_Group(1, 'group 1n', '');
$group1c = clone $group1;
$group2 = new SeedDMS_Core_Group(2, 'group 1', '');
$dms = new SeedDMS_Core_DMS(null, '');
$this->assertFalse($dms->checkIfEqual($group1, $user1)); // different classes
$this->assertFalse($dms->checkIfEqual($group1, $group2)); // different id
$this->assertTrue($dms->checkIfEqual($group1, $group1c)); // a clone is always equal
$this->assertTrue($dms->checkIfEqual($group1, $group1n)); // different instances but same id is sufficient to be equal
} /* }}} */
/**
* Test checkDate()
*
* @return void
*/
public function testCheckDate()
{
$dms = new SeedDMS_Core_DMS(null, '');
$this->assertTrue($dms->checkDate('2020-02-28 10:12:34'));
$this->assertTrue($dms->checkDate('2020-02-29 10:12:34')); // a leap year
$this->assertFalse($dms->checkDate('2020-02-30 10:12:34')); // feb has never 30 days
$this->assertFalse($dms->checkDate('2021-02-29 10:12:34')); // not a leap year
$this->assertFalse($dms->checkDate('2020-02-28 24:12:34')); // hour is out of range
$this->assertFalse($dms->checkDate('2020-02-28 23:60:34')); // minute is out of range
$this->assertFalse($dms->checkDate('2020-02-28 23:59:60')); // second is out of range
$this->assertFalse($dms->checkDate('2020-02-28 23:59:')); // second is missing
$this->assertTrue($dms->checkDate('2020-02-28', 'Y-m-d')); // just checking the date
$this->assertFalse($dms->checkDate('28.2.2020', 'd.m.Y')); // month must be 01-12
$this->assertTrue($dms->checkDate('28.2.2020', 'd.n.Y')); // month must be 1-12
$this->assertFalse($dms->checkDate('28.02.2020', 'd.n.Y')); // month must be 1-12
} /* }}} */
/**
* Test getClassname()
*
* @return void
*/
public function testGetClassName()
{
/* Do not mess up the global instance self::$dms, but create my own */
$dms = new SeedDMS_Core_DMS(null, '');
$this->assertEquals('SeedDMS_Core_Folder', $dms->getClassname('folder'));
$this->assertEquals('SeedDMS_Core_Document', $dms->getClassname('document'));
$this->assertEquals('SeedDMS_Core_DocumentContent', $dms->getClassname('documentcontent'));
$this->assertEquals('SeedDMS_Core_User', $dms->getClassname('user'));
$this->assertEquals('SeedDMS_Core_Group', $dms->getClassname('group'));
$this->assertFalse($dms->getClassname('foo'));
}
/**
* Test setClassname()
*
* @return void
*/
public function testSetClassName()
{
/* Do not mess up the global instance self::$dms, but create my own */
$dms = new SeedDMS_Core_DMS(null, '');
$this->assertEquals('SeedDMS_Core_Folder', $dms->setClassname('folder', 'MyNewFolderClass'));
$this->assertEquals('MyNewFolderClass', $dms->getClassname('folder'));
$this->assertEquals('MyNewFolderClass', $dms->setClassname('folder', 'MySuperNewFolderClass'));
$this->assertFalse($dms->setClassname('foo', 'MyNewFolderClass'));
}
/**
* Test addCallback()
*
* @return void
*/
public function testAddCallback()
{
/* Do not mess up the global instance self::$dms, but create my own */
$dms = new SeedDMS_Core_DMS(null, '');
/* Add a closure as a callback is just fine */
$this->assertTrue(
$dms->addCallback(
'onPostSomething', function () {
}
)
);
/* An empty callback will make addCallback() fail */
$this->assertFalse(
$dms->addCallback(
'', function () {
}
)
);
/* Passing a class method is ok */
$this->assertTrue($dms->addCallback('onPostSomething', 'DmsTest::testAddCallback'));
/* Passing a none existing class mehtod makes addCallback() fail */
$this->assertFalse($dms->addCallback('onPostSomething', 'DmsTest::thisMethodDoesNotExist'));
}
/**
* Test for hasCallback
*
* @return void
*/
public function testHasCallback()
{
/* Do not mess up the global instance self::$dms, but create my own */
$dms = new SeedDMS_Core_DMS(null, '');
/* Add a closure as a callback is just fine */
$this->assertTrue(
$dms->addCallback(
'onPostSomething', function () {
}
)
);
$this->assertTrue($dms->hasCallback('onPostSomething'));
$this->assertFalse($dms->hasCallback('thisOneDoesNotExist'));
}
/**
* Test for getDecorators
*
* @return void
*/
public function testGetDecorators()
{
/* Do not mess up the global instance self::$dms, but create my own */
$dms = new SeedDMS_Core_DMS(null, '');
$this->assertFalse($dms->getDecorators('folder'));
}
/**
* Test for addDecorator
*
* @return void
*/
public function testaddDecorator()
{
/* Do not mess up the global instance self::$dms, but create my own */
$dms = new SeedDMS_Core_DMS(null, '');
$this->assertTrue($dms->addDecorator('folder', 'MyNewDecorator'));
$decorators = $dms->getDecorators('folder');
$this->assertIsArray($decorators);
$this->assertCount(1, $decorators);
}
/**
* Test getDb()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDb()
{
$this->assertEquals(self::$dbh, self::$dms->getDb());
}
/**
* Test getDBVersion()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDbVersion()
{
$version = self::$dms->getDBVersion();
$this->assertCount(4, $version);
$this->assertGreaterThanOrEqual(5, $version['major']);
$this->assertGreaterThanOrEqual(0, $version['minor']);
}
/**
* Test getDBVersionFailMissingTable()
*
* This method checks if getDBVersion() returns false if the table
* list of the database does not contain the table 'tblVersion'
*
* @return void
*/
public function testGetDbVersionFailMissingTable()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('TableList')
->willReturn(['tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->getDBVersion();
$this->assertFalse($version);
}
/**
* Test getDBVersionSqlFail()
*
* This method checks if getDBVersion() returns false if the sql
* for selecting the records in table 'tblVersion' fail
*
* @return void
*/
public function testGetDbVersionSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1")
->willReturn(false);
$db->expects($this->once())
->method('TableList')
->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->getDBVersion();
$this->assertFalse($version);
}
/**
* Test getDBVersionNoRecord()
*
* This method checks if getDBVersion() returns false a table 'tblVersion'
* exists but has no record
*
* @return void
*/
public function testGetDbVersionNoRecord()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1")
->willReturn(array());
$db->expects($this->once())
->method('TableList')
->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->getDBVersion();
$this->assertFalse($version);
}
/**
* Test checkVersion()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testCheckVersion()
{
$this->assertTrue(self::$dms->checkVersion());
}
/**
* Test checkVersionFail()
*
* This method checks if checkVersion() returns false if the version
* in table 'tblVersion' does not match the version in the class variable
* $version. To make this method independant of version changes, the
* current version is taken from SeedDMS_Core_DMS::version and modified
* in order to differ from the version stored in the database.
*
* @return void
*/
public function testcheckVersionFail()
{
$verstr = (new SeedDMS_Core_DMS(null, ''))->version;
$verarr = explode('.', $verstr);
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1")
->willReturn([['major'=>$verarr[0], 'minor'=>$verarr[1]+1]]);
$db->expects($this->once())
->method('TableList')
->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->checkVersion();
$this->assertFalse($version);
}
/**
* Test checkVersionSqlFail()
*
* This method checks if checkVersion() returns false if the sql
* for selecting the records in table 'tblVersion' fail
*
* @return void
*/
public function testcheckVersionSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1")
->willReturn(false);
$db->expects($this->once())
->method('TableList')
->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->checkVersion();
$this->assertFalse($version);
}
/**
* Test checkVersionFailMissingTable()
*
* This method checks if checkVersion() returns false if the table
* list of the database does not contain the table 'tblVersion'
*
* @return void
*/
public function testCheckVersionFailMissingTable()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('TableList')
->willReturn(['tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->checkVersion();
$this->assertTrue($version); // A missing table tblVersion returns true!
}
/**
* Test checkVersionNoRecord()
*
* This method checks if checkVersion() returns false a table 'tblVersion'
* exists but has no record
*
* @return void
*/
public function testCheckVersionNoRecord()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1")
->willReturn(array());
$db->expects($this->once())
->method('TableList')
->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']);
$dms = new SeedDMS_Core_DMS($db, '');
$version = $dms->checkVersion();
$this->assertFalse($version);
}
/**
* Test setRootFolderID()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testSetRootFolderID()
{
/* Setting the same root folder is ok */
$oldid = self::$dms->setRootFolderID(1);
$this->assertEquals(1, $oldid);
/* Setting a none existing root folder id will not change the root folder */
$oldid = self::$dms->setRootFolderID(2);
$this->assertFalse($oldid);
/* Make sure the old root folder is still set */
$rootfolder = self::$dms->getRootFolder();
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder);
$this->assertEquals(1, $rootfolder->getId());
}
/**
* Test getRootFolder()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetRootFolder()
{
$rootfolder = self::$dms->getRootFolder();
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder);
$this->assertEquals(1, $rootfolder->getId());
}
/**
* Test setUser()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testSetUser()
{
$user = self::$dms->getUser(1);
$olduser = self::$dms->setUser($user); // returns null because there is no old user
$this->assertNull($olduser);
$olduser = self::$dms->setUser($user); // second call will return the user set before
$this->assertIsObject($olduser);
$olduser = self::$dms->setUser(null); // old user is still an object
$this->assertIsObject($olduser);
$olduser = self::$dms->setUser(8); // invalid user
$this->assertFalse($olduser);
}
/**
* Test getLoggedInUser()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetLoggedInUser()
{
$olduser = self::$dms->getLoggedInUser(); // initially this is set to null
$this->assertNull($olduser);
$user = self::$dms->getUser(1);
self::$dms->setUser($user);
$olduser = self::$dms->getLoggedInUser();
$this->assertEquals($olduser->getId(), $user->getId());
}
/**
* Test getDocument()
*
* As there is currently no document, getDocument() must return null.
* If false was returned it would indicated an sql error.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocument()
{
$document = self::$dms->getDocument(1);
$this->assertNull($document);
}
/**
* Test getDocumentsByUser()
*
* As there is currently no document, getDocumentsByUser() must return
* an empty array.
* If false was returned it would indicated an sql error.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentsByUser()
{
$documents = self::$dms->getDocumentsByUser(self::$dms->getUser(1));
$this->assertIsArray($documents);
$this->assertCount(0, $documents);
}
/**
* Test getDocumentsLockedByUser()
*
* As there is currently no document, getDocumentsLockedByUser() must return
* an empty array.
* If false was returned it would indicated an sql error.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentsLockedByUser()
{
$documents = self::$dms->getDocumentsLockedByUser(self::$dms->getUser(1));
$this->assertIsArray($documents);
$this->assertCount(0, $documents);
}
/**
* Test makeTimeStamp()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testMakeTimeStamp()
{
/* Assert correct date */
$this->assertEquals(0, self::$dms->makeTimeStamp(1, 0, 0, 1970, 1, 1));
$this->assertEquals(68166000, self::$dms->makeTimeStamp(0, 0, 0, 1972, 2, 29));
/* Assert incorrect dates */
$this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 13, 1), 'Incorrect month not recognized');
$this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 1, 32), 'Incorrect day in january not recognized');
$this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 4, 31), 'Incorrect day in april not recognized');
$this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 2, 29), 'Incorrect day in february not recognized');
$this->assertFalse(self::$dms->makeTimeStamp(24, 0, 0, 1970, 1, 1), 'Incorrect hour not recognized');
$this->assertFalse(self::$dms->makeTimeStamp(0, 60, 0, 1970, 1, 1), 'Incorrect minute not recognized');
$this->assertFalse(self::$dms->makeTimeStamp(0, 0, 60, 1970, 1, 1), 'Incorrect second not recognized');
}
/**
* Test search()
*
* Just search the root folder in different ways. Because the initial database
* does not have any documents, this method will test various ways to
* find the root folder 'DMS' with id=1
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testSearchRootFolder()
{
/* searching for folders/documents in any field */
$result = self::$dms->search(
array(
'query'=>'DMS'
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
$this->assertEquals(0, $result['totalDocs']);
$this->assertCount(0, $result['docs']);
/* searching for folders in any field */
$result = self::$dms->search(
array(
'query'=>'DMS',
'mode'=>0x2
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
$this->assertEquals(0, $result['totalDocs']);
$this->assertCount(0, $result['docs']);
/* searching for documents in any field will not return any folders*/
$result = self::$dms->search(
array(
'query'=>'DMS',
'mode'=>0x1
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
$this->assertEquals(0, $result['totalDocs']);
$this->assertCount(0, $result['docs']);
/* searching for folders with a bogus name may not return any folders */
$result = self::$dms->search(
array(
'query'=>'foo',
'mode'=>0x2
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
/* searching for folders by its id */
$result = self::$dms->search(
array(
'query'=>'1',
'mode'=>0x2
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
/* searching for folders by an unknown id */
$result = self::$dms->search(
array(
'query'=>'2',
'mode'=>0x2
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
/* searching for folders with two terms ANDed, but only one matches */
$result = self::$dms->search(
array(
'query'=>'DMS foo',
'mode'=>0x2,
'logicalmode'=>'AND',
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
/* searching for folders with two terms ORed, but only one matches */
$result = self::$dms->search(
array(
'query'=>'DMS foo',
'mode'=>0x2,
'logicalmode'=>'OR',
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
/* searching for folders with two terms ANDed, both match, but in different fields (name and id) */
$result = self::$dms->search(
array(
'query'=>'DMS 1',
'mode'=>0x2,
'logicalmode'=>'AND',
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
/* searching for folders with two terms ANDed, both match, but in different fields (name and id). But only one field is searched. */
$result = self::$dms->search(
array(
'query'=>'DMS 1',
'mode'=>0x2,
'logicalmode'=>'AND',
'searchin'=>array(2,3), // name, comment
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
/* searching for folders below a start folder will not find the folder 'DMS'
* anymore, because the start folder itself will not be found.
*/
$result = self::$dms->search(
array(
'query'=>'DMS',
'mode'=>0x2,
'startFolder'=>self::$dms->getRootFolder()
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
/* Restrict search to the owner of the folder 'DMS'
*/
$result = self::$dms->search(
array(
'query'=>'DMS',
'mode'=>0x2,
'owner'=>self::$dms->getUser(1)
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
/* Restrict search to user who does not own a document
*/
$result = self::$dms->search(
array(
'query'=>'DMS',
'mode'=>0x2,
'owner'=>self::$dms->getUser(2)
)
);
$this->assertEquals(0, $result['totalFolders']);
$this->assertCount(0, $result['folders']);
/* Restrict search to a list of owners (in this case all users)
*/
$result = self::$dms->search(
array(
'query'=>'DMS',
'mode'=>0x2,
'owner'=>self::$dms->getAllUsers()
)
);
$this->assertEquals(1, $result['totalFolders']);
$this->assertCount(1, $result['folders']);
}
/**
* Test getFolder()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetFolder()
{
$folder = self::$dms->getFolder(1);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $folder);
$this->assertEquals(1, $folder->getId());
}
/**
* Test getFolderByName()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetFolderByName()
{
$folder = self::$dms->getFolderByName('DMS');
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $folder);
$this->assertEquals(1, $folder->getId());
$folder = self::$dms->getFolderByName('FOO');
$this->assertNull($folder);
}
/**
* Test checkFolders()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testCheckFolders()
{
$errors = self::$dms->checkFolders();
$this->assertIsArray($errors);
$this->assertCount(0, $errors);
}
/**
* Test checkFoldersSqlFail()
*
* This test catches the case when the sql statement for getting all
* folders fails.
*
* @return void
*/
public function testCheckFoldersSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblFolders`")
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->checkFolders());
}
/**
* Test checkFoldersFailNoParent()
*
* This test catches the case when a folder's parent is not present
*
* @return void
*/
public function testCheckFoldersFailNoParent()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblFolders`")
->willReturn(
array(
array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''),
array('id'=>5, 'name'=>'Subfolder', 'parent'=>3, 'folderList'=>':1:'),
)
);
$dms = new SeedDMS_Core_DMS($db, '');
$errors = $dms->checkFolders();
$this->assertIsArray($errors);
$this->assertCount(1, $errors); // there should be 1 error
$this->assertArrayHasKey(5, $errors); // folder with id=5 has the wrong parent
$this->assertEquals('Missing parent', $errors[5]['msg']);
}
/**
* Test checkFoldersFailWrongFolderList()
*
* This test catches the case when a folder's parent is not present
*
* @return void
*/
public function testCheckFoldersFailWrongFolderList()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblFolders`")
->willReturn(
array(
array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''),
array('id'=>5, 'name'=>'Subfolder', 'parent'=>1, 'folderList'=>':1:2:'),
)
);
$dms = new SeedDMS_Core_DMS($db, '');
$errors = $dms->checkFolders();
$this->assertIsArray($errors);
$this->assertCount(1, $errors); // there should be 1 error
$this->assertArrayHasKey(5, $errors); // folder with id=5 has the wrong parent
$this->assertStringContainsString('Wrong folder list', $errors[5]['msg']);
}
/**
/**
* Test checkDocuments()
*
* The intitial database does not have any documents which makes this
* test less usefull.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testCheckDocuments()
{
$errors = self::$dms->checkDocuments();
$this->assertIsArray($errors);
$this->assertCount(0, $errors);
}
/**
* Test checkDocumentsSqlFoldersFail()
*
* This test catches the case when the sql statement for getting all
* folders fails.
*
* @return void
*/
public function testCheckDocumentsSqlFoldersFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblFolders`")
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->checkDocuments());
}
/**
* Test checkDocumentsSqlDocumentsFail()
*
* This test catches the case when the sql statement for getting all
* documents fails, after getting all folders succeeded.
*
* @return void
*/
public function testCheckDocumentsSqlDocumentsFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->exactly(2))
->method('getResultArray')
->will(
$this->returnValueMap(
array(
array("SELECT * FROM `tblFolders`", true, array(
array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>'')
)),
array("SELECT * FROM `tblDocuments`", true, false)
)
)
);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->checkDocuments());
}
/**
* Test checkDocumentsFailNoParent()
*
* This test catches the case when a documents's parent is not present
*
* @return void
*/
public function testCheckDocumentsFailNoParent()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->exactly(2))
->method('getResultArray')
->will(
$this->returnValueMap(
array(
array("SELECT * FROM `tblFolders`", true, array(
array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''),
array('id'=>5, 'name'=>'Subfolder', 'parent'=>1, 'folderList'=>':1:'),
)),
array("SELECT * FROM `tblDocuments`", true, array(
array('id'=>1, 'name'=>'Document 1', 'folder'=>1, 'folderList'=>':1:'),
array('id'=>2, 'name'=>'Document 2', 'folder'=>2, 'folderList'=>':1:5:'),
))
)
)
);
$dms = new SeedDMS_Core_DMS($db, '');
$errors = $dms->checkDocuments();
$this->assertIsArray($errors);
$this->assertCount(1, $errors); // there should be 1 error
$this->assertArrayHasKey(2, $errors); // document with id=2 has the wrong parent
$this->assertEquals('Missing parent', $errors[2]['msg']);
}
/**
* Test checkDocumentsFailWrongFolderList()
*
* This test catches the case when a documents's parent is not present
*
* @return void
*/
public function testCheckDocumentsFailWrongFolderList()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->exactly(2))
->method('getResultArray')
->will(
$this->returnValueMap(
array(
array("SELECT * FROM `tblFolders`", true, array(
array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''),
array('id'=>5, 'name'=>'Subfolder', 'parent'=>1, 'folderList'=>':1:'),
)),
array("SELECT * FROM `tblDocuments`", true, array(
array('id'=>1, 'name'=>'Document 1', 'folder'=>1, 'folderList'=>':1:'),
array('id'=>2, 'name'=>'Document 2', 'folder'=>5, 'folderList'=>':1:2:'),
))
)
)
);
$dms = new SeedDMS_Core_DMS($db, '');
$errors = $dms->checkDocuments();
$this->assertIsArray($errors);
$this->assertCount(1, $errors); // there should be 1 error
$this->assertArrayHasKey(2, $errors); // document with id=2 has the wrong parent
$this->assertStringContainsString('Wrong folder list', $errors[2]['msg']);
}
/**
* Test getUser()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetUser()
{
$user = self::$dms->getUser(1);
$this->assertInstanceOf(SeedDMS_Core_User::class, $user);
$this->assertEquals(1, $user->getId());
}
/**
* Test getUserByLogin()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetUserByLogin()
{
$user = self::$dms->getUserByLogin('admin');
$this->assertInstanceOf(SeedDMS_Core_User::class, $user);
$this->assertEquals('admin', $user->getLogin());
}
/**
* Test getUserByEmail()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetUserByEmail()
{
$user = self::$dms->getUserByEmail('info@seeddms.org');
$this->assertInstanceOf(SeedDMS_Core_User::class, $user);
$this->assertEquals('admin', $user->getLogin());
}
/**
* Test getAllUsers()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAllUsers()
{
$users = self::$dms->getAllUsers();
$this->assertIsArray($users);
$this->assertCount(2, $users);
}
/**
* Test addUser()
*
* Add a new user and retrieve it afterwards. Also check if the number
* of users has increased by one. Add a user with the same name a
* second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddUser()
{
/* Adding a new user */
$user = self::$dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment');
$this->assertIsObject($user);
$this->assertEquals('new user', $user->getLogin());
$this->assertEquals('with comment', $user->getComment());
/* Adding a user with the same login must fail */
$user = self::$dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment');
$this->assertFalse($user);
/* There should be 3 users now */
$users = self::$dms->getAllUsers();
$this->assertIsArray($users);
$this->assertCount(3, $users);
/* Check if setting the password expiration to 'now' works */
$now = date('Y-m-d H:i:s');
$user = self::$dms->addUser('new user pwdexpiration 1', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment', '', false, false, 'now');
$this->assertEquals($now, $user->getPwdExpiration());
$now = date('Y-m-d H:i:s');
$user = self::$dms->addUser('new user pwdexpiration 2', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment', '', false, false, $now);
$this->assertEquals($now, $user->getPwdExpiration());
}
/**
* Test addUserWithPostAddHook()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddUserWithPostAddHook()
{
/* Add the 'onPostAddUser' callback */
$ret = 0;
$callback = function ($param, $user) use (&$ret) {
$ret = 1;
};
self::$dms->addCallback('onPostAddUser', $callback, 1);
/* Adding a new user */
$user = self::$dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment');
$this->assertIsObject($user);
$this->assertEquals('new user', $user->getLogin());
$this->assertEquals(1, $ret);
}
/**
* Test addUser() with sql failure
*
* @return void
*/
public function testAddUserSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResult')
->with($this->stringContains("INSERT INTO `tblUsers`"))
->willReturn(false);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblUsers` WHERE `login` = ")
->willReturn([]);
$dms = new SeedDMS_Core_DMS($db, '');
if(self::$dbversion['major'] < 6)
$role = 1;
else
$role = $this->getAdminRole();
$user = $dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment', $role);
$this->assertFalse($user);
}
/**
* Test getGroup()
*
* Get a group by its id
*
* @return void
*/
public function testGetGroup()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblGroups` WHERE `id` = 1")
->willReturn([['id'=>1, 'name'=>'foo', 'comment'=>'']]);
$dms = new SeedDMS_Core_DMS($db, '');
$group = $dms->getGroup(1);
$this->assertIsObject($group);
$this->assertEquals(1, $group->getId());
}
/**
* Test getGroupByName()
*
* Get a group by its name
*
* qstr must be mocked because it is used in the sql statement to quote
* the name.
*
* @return void
*/
public function testGetGroupByName()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblGroups` WHERE `name` = 'foo'")
->willReturn([['id'=>1, 'name'=>'foo', 'comment'=>'']]);
$db->expects($this->once())
->method('qstr')
->will(
$this->returnCallback(
function ($a) {
return "'".$a."'";
}
)
);
$dms = new SeedDMS_Core_DMS($db, '');
$group = $dms->getGroupByName('foo');
$this->assertIsObject($group);
$this->assertEquals('foo', $group->getName());
}
/**
* Test getAllGroups()
*
* The intitial database does not have any groups
*
* @return void
*/
public function testGetAllGroups()
{
$groups = self::$dms->getAllGroups();
$this->assertIsArray($groups);
$this->assertCount(0, $groups);
}
/**
* Test addGroup()
*
* Add a new group and retrieve it afterwards. Also check if the number
* of groups has increased by one. Add a group with the same name a
* second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddGroup()
{
/* Adding a new group */
$group = self::$dms->addGroup('new group', 'with comment');
$this->assertIsObject($group);
$this->assertEquals('new group', $group->getName());
/* Adding a group with the same name must fail */
$group = self::$dms->addGroup('new group', 'with comment');
$this->assertFalse($group);
/* There should be one group now */
$groups = self::$dms->getAllGroups();
$this->assertIsArray($groups);
$this->assertCount(1, $groups);
}
/**
* Test addGroupWithPostAddHook()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddGroupWithPostAddHook()
{
/* Add the 'onPostAddGroup' callback */
$ret = 0;
$callback = function ($param, $group) use (&$ret) {
$ret = 1;
};
self::$dms->addCallback('onPostAddGroup', $callback, 1);
/* Adding a new group */
$group = self::$dms->addGroup('new group', 'with comment');
$this->assertIsObject($group);
$this->assertEquals('new group', $group->getName());
$this->assertEquals(1, $ret);
}
/**
* Test addGroup() with sql failure
*
* @return void
*/
public function testAddGroupSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResult')
->with($this->stringContains("INSERT INTO `tblGroups`"))
->willReturn(false);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblGroups` WHERE `name` = ")
->willReturn([]);
$dms = new SeedDMS_Core_DMS($db, '');
$group = $dms->addGroup('new group', 'with comment');
$this->assertFalse($group);
}
/**
* Test getAllKeywordCategories()
*
* The intitial database does not have any keyword categories
*
* @return void
*/
public function testGetAllKeywordCategories()
{
$cats = self::$dms->getAllKeywordCategories();
$this->assertIsArray($cats);
$this->assertCount(0, $cats);
/* Even passing bogus ids is handled propperly */
$cats = self::$dms->getAllKeywordCategories(['kk', '0', 3, true]);
$this->assertIsArray($cats);
$this->assertCount(0, $cats);
}
/**
* Test getAllUserKeywordCategories()
*
* Method getAllUserKeywordCategories() actually uses
* getAllKeywordCategories()
*
* The intitial database does not have any keyword categories
*
* @return void
*/
public function testGetAllUserKeywordCategories()
{
$cats = self::$dms->getAllUserKeywordCategories(1);
$this->assertIsArray($cats);
$this->assertCount(0, $cats);
/* Passing a none existing user id will return an empty array */
$cats = self::$dms->getAllUserKeywordCategories(3);
$this->assertIsArray($cats);
$this->assertCount(0, $cats);
/* Passing an invalid user id will return false */
$cats = self::$dms->getAllUserKeywordCategories(0);
$this->assertFalse($cats);
}
/**
* Test getAllKeywordCategories() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAllKeywordCategoriesSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblKeywordCategories`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$cats = $dms->getAllKeywordCategories();
$this->assertFalse($cats);
}
/**
* Test addKeywordCategory()
*
* Add a new keyword category and retrieve it afterwards. Also check if the
* number of keyword categories has increased by one. Add a keyword category
* with the same name a second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddKeywordCategory()
{
/* Adding a new keyword category */
$cat = self::$dms->addKeywordCategory(1, 'new category');
$this->assertIsObject($cat);
$this->assertEquals('new category', $cat->getName());
/* Adding a keyword category for the same user and with the same name must fail */
$cat = self::$dms->addKeywordCategory(1, 'new category');
$this->assertFalse($cat);
/* Adding a keyword category with a non existing user id must fail */
$cat = self::$dms->addKeywordCategory(0, 'new category');
$this->assertFalse($cat);
/* Adding a keyword category with an empty name must fail */
$cat = self::$dms->addKeywordCategory(1, ' ');
$this->assertFalse($cat);
/* Adding a keyword category with a non existing user id must fail */
// $cat = self::$dms->addKeywordCategory(3, 'new category');
// $this->assertFalse($cat);
/* There should be 1 keyword category now */
$cats = self::$dms->getAllKeywordCategories();
$this->assertIsArray($cats);
$this->assertCount(1, $cats);
}
/**
* Test addKeywordCategoryWithPostAddHook()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddKeywordCategoryWithPostAddHook()
{
/* Add the 'onPostAddKeywordCategory' callback */
$ret = 0;
$callback = function ($param, $cat) use (&$ret) {
$ret = 1;
};
self::$dms->addCallback('onPostAddKeywordCategory', $callback, 1);
/* Adding a new keyword category */
$cat = self::$dms->addKeywordCategory(1, 'new category');
$this->assertIsObject($cat);
$this->assertEquals('new category', $cat->getName());
$this->assertEquals(1, $ret);
}
/**
* Test addKeywordCategory() with sql failure
*
* @return void
*/
public function testAddKeywordCategorySqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResult')
->with($this->stringContains("INSERT INTO `tblKeywordCategories`"))
->willReturn(false);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblKeywordCategories` WHERE `name` ="))
->willReturn([]);
$dms = new SeedDMS_Core_DMS($db, '');
$cat = $dms->addKeywordCategory(1, 'new category');
$this->assertFalse($cat);
}
/**
* Test getKeywordCategory()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetKeywordCategory()
{
$cat = self::$dms->addKeywordCategory(1, 'new category');
$cat = self::$dms->getKeywordCategory(1);
$this->assertInstanceOf(SeedDMS_Core_Keywordcategory::class, $cat);
$this->assertEquals(1, $cat->getId());
/* Return false if the id is invalid */
$cat = self::$dms->getKeywordCategory(0);
$this->assertFalse($cat);
/* Return null if the keyword category with the id does not exist */
$cat = self::$dms->getKeywordCategory(2);
$this->assertNull($cat);
}
/**
* Test getKeywordCategory() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetKeywordCategorySqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblKeywordCategories` WHERE `id` = 1")
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$cat = $dms->getKeywordCategory(1);
$this->assertFalse($cat);
}
/**
* Test getKeywordCategoryByName()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetKeywordCategoryByName()
{
$cat = self::$dms->addKeywordCategory(1, 'new category');
$cat = self::$dms->getKeywordCategory(1);
$this->assertInstanceOf(SeedDMS_Core_Keywordcategory::class, $cat);
$this->assertEquals(1, $cat->getId());
/* Return false if the user id is invalid */
$cat = self::$dms->getKeywordCategoryByName('new category', 0);
$this->assertFalse($cat);
/* Return null if the keyword category with the passed name does not exist */
$cat = self::$dms->getKeywordCategoryByName('foo', 1);
$this->assertNull($cat);
/* Return category if the keyword category with the passed name exists */
$cat = self::$dms->getKeywordCategoryByName('new category', 1);
$this->assertIsObject($cat);
$this->assertInstanceOf(SeedDMS_Core_Keywordcategory::class, $cat);
}
/**
* Test getKeywordCategoryByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetKeywordCategoryByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblKeywordCategories` WHERE `name` ="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$cat = $dms->getKeywordCategoryByName('foo', 1);
$this->assertFalse($cat);
}
/**
* Test getDocumentCategories()
*
* The intitial database does not have any document categories
*
* @return void
*/
public function testGetDocumentCategories()
{
$cats = self::$dms->getDocumentCategories();
$this->assertIsArray($cats);
$this->assertCount(0, $cats);
}
/**
* Test getDocumentCategories() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentCategoriesNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblCategory`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$cats = $dms->getDocumentCategories();
$this->assertFalse($cats);
}
/**
* Test getDocumentCategory()
*
* The intitial database does not have any document categories
*
* @return void
*/
public function testGetDocumentCategory()
{
/* Adding a new keyword category */
$cat = self::$dms->addDocumentCategory('new category');
$this->assertIsObject($cat);
$this->assertEquals('new category', $cat->getName());
$cat = self::$dms->getDocumentCategory($cat->getId());
$this->assertIsObject($cat);
/* Return false if the id is out of range */
$cat = self::$dms->getDocumentCategory(0);
$this->assertFalse($cat);
/* Return null if the keyword category with the id does not exist */
$cat = self::$dms->getDocumentCategory(2);
$this->assertNull($cat);
}
/**
* Test getDocumentCategory() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentCategorySqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with("SELECT * FROM `tblCategory` WHERE `id` = 1")
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$cat = $dms->getDocumentCategory(1);
$this->assertFalse($cat);
}
/**
* Test getDocumentCategoryByName()
*
* The intitial database does not have any document categories
*
* @return void
*/
public function testGetDocumentCategoryByName()
{
/* Adding a new keyword category with leading and trailing spaces*/
$cat = self::$dms->addDocumentCategory(' new category ');
$this->assertIsObject($cat);
$this->assertEquals('new category', $cat->getName());
$cat = self::$dms->getDocumentCategoryByName($cat->getName());
$this->assertIsObject($cat);
$cat = self::$dms->getDocumentCategoryByName(' ');
$this->assertFalse($cat);
}
/**
* Test getDocumentCategoryByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentCategoryByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblCategory` WHERE `name`="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$cat = $dms->getDocumentCategoryByName('foo');
$this->assertFalse($cat);
}
/**
* Test addDocumentCategory()
*
* Add a new keyword category and retrieve it afterwards. Also check if the
* number of keyword categories has increased by one. Add a keyword category
* with the same name a second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddDocumentCategory()
{
/* Adding a new keyword category */
$cat = self::$dms->addDocumentCategory('new category');
$this->assertIsObject($cat);
$this->assertEquals('new category', $cat->getName());
/* Adding a document category with the same name must fail */
$cat = self::$dms->addDocumentCategory('new category');
$this->assertFalse($cat);
/* Adding a document category with an empty name must fail */
$cat = self::$dms->addDocumentCategory(' ');
$this->assertFalse($cat);
/* There should be 1 document category now */
$cats = self::$dms->getDocumentCategories();
$this->assertIsArray($cats);
$this->assertCount(1, $cats);
}
/**
* Test addDocumentCategoryWithPostAddHook()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddDocumentCategoryWithPostAddHook()
{
/* Add the 'onPostAddDocumentCategory' callback */
$ret = 0;
$callback = function ($param, $group) use (&$ret) {
$ret = 1;
};
self::$dms->addCallback('onPostAddDocumentCategory', $callback, 1);
/* Adding a new group */
$cat = self::$dms->addDocumentCategory('new category');
$this->assertIsObject($cat);
$this->assertEquals('new category', $cat->getName());
$this->assertEquals(1, $ret);
}
/**
* Test addDocumentCategory() with sql failure
*
* @return void
*/
public function testAddDocumentCategorySqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResult')
->with($this->stringContains("INSERT INTO `tblCategory`"))
->willReturn(false);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblCategory` WHERE `name`="))
->willReturn([]);
$dms = new SeedDMS_Core_DMS($db, '');
$cat = $dms->addDocumentCategory('new category');
$this->assertFalse($cat);
}
/**
* Test getAttributeDefinition() with a none existing workflow
*
* The intitial database does not have any workflows
*
* @return void
*/
public function testGetAttributeDefinitionNoExists()
{
$workflow = self::$dms->getAttributeDefinition(1);
$this->assertNull($workflow);
/* Passing an id not a numeric value returns false */
$workflow = self::$dms->getAttributeDefinition('foo');
$this->assertFalse($workflow);
/* Passing an id out of range returns false */
$workflow = self::$dms->getAttributeDefinition(0);
$this->assertFalse($workflow);
}
/**
* Test getAttributeDefinition() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAttributeDefinitionSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblAttributeDefinitions` WHERE `id` ="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$attrdef = $dms->getAttributeDefinition(1);
$this->assertFalse($attrdef);
}
/**
* Test getAttributeDefinitionByName() with a none existing workflow
*
* The intitial database does not have any workflows
*
* @return void
*/
public function testGetAttributeDefinitionByNameNoExists()
{
$workflow = self::$dms->getAttributeDefinitionByName('foo');
$this->assertNull($workflow);
}
/**
* Test getAttributeDefinitionByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAttributeDefinitionByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblAttributeDefinitions` WHERE `name` ="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$attrdef = $dms->getAttributeDefinitionByName('foo');
$this->assertFalse($attrdef);
}
/**
* Test getAllAttributeDefinitions()
*
* The intitial database does not have any attribute definitions
*
* @return void
*/
public function testGetAllAttributeDefinitions()
{
$attrdefs = self::$dms->getAllAttributeDefinitions();
$this->assertIsArray($attrdefs);
$this->assertCount(0, $attrdefs);
}
/**
* Test getAllAttributeDefinitions() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAllAttributeDefinitionsSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblAttributeDefinitions`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$attrdef = $dms->getAllAttributeDefinitions();
$this->assertFalse($attrdef);
}
/**
* Test addAttributeDefinition()
*
* Add a new group and retrieve it afterwards. Also check if the number
* of groups has increased by one. Add a group with the same name a
* second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddAttributeDefinition()
{
/* Adding a new attribute definition */
$attrdef = self::$dms->addAttributeDefinition('new attribute definition', SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertIsObject($attrdef);
$this->assertEquals('new attribute definition', $attrdef->getName());
/* Get the new attribute definition by its id */
$newattrdef = self::$dms->getAttributeDefinition($attrdef->getId());
$this->assertIsObject($newattrdef);
$this->assertEquals($attrdef->getId(), $newattrdef->getId());
/* Get the new attribute definition by its name */
$newattrdef = self::$dms->getAttributeDefinitionByName('new attribute definition');
$this->assertIsObject($newattrdef);
$this->assertEquals($attrdef->getId(), $newattrdef->getId());
/* Adding an attribute definition with the same name must fail */
$attrdef = self::$dms->addAttributeDefinition('new attribute definition', SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertFalse($attrdef);
/* Adding an attribute definition with an empty name must fail */
$attrdef = self::$dms->addAttributeDefinition(' ', SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertFalse($attrdef);
/* Adding an attribute definition with an invalid object type must fail */
$attrdef = self::$dms->addAttributeDefinition('no object type', -1, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertFalse($attrdef);
/* Adding an attribute definition without a type must fail */
$attrdef = self::$dms->addAttributeDefinition('no type', SeedDMS_Core_AttributeDefinition::objtype_folder, 0, 0, '', '');
$this->assertFalse($attrdef);
/* There should be one attribute definition now */
$attrdefs = self::$dms->getAllAttributeDefinitions();
$this->assertIsArray($attrdefs);
$this->assertCount(1, $attrdefs);
/* There should be one attribute definition of object type folder now */
$attrdefs = self::$dms->getAllAttributeDefinitions(SeedDMS_Core_AttributeDefinition::objtype_folder);
$this->assertIsArray($attrdefs);
$this->assertCount(1, $attrdefs);
/* The object type can also be passed as an array */
$attrdefs = self::$dms->getAllAttributeDefinitions([SeedDMS_Core_AttributeDefinition::objtype_folder]);
$this->assertIsArray($attrdefs);
$this->assertCount(1, $attrdefs);
/* Adding more attribute definitions of different object type */
$attrdef = self::$dms->addAttributeDefinition('new attribute definition all', SeedDMS_Core_AttributeDefinition::objtype_all, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertIsObject($attrdef);
$this->assertEquals('new attribute definition all', $attrdef->getName());
$attrdef = self::$dms->addAttributeDefinition('new attribute definition document', SeedDMS_Core_AttributeDefinition::objtype_all, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertIsObject($attrdef);
$this->assertEquals('new attribute definition document', $attrdef->getName());
$attrdef = self::$dms->addAttributeDefinition('new attribute definition documentcontent', SeedDMS_Core_AttributeDefinition::objtype_all, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', '');
$this->assertIsObject($attrdef);
$this->assertEquals('new attribute definition documentcontent', $attrdef->getName());
/* There should be four attribute definitions now */
$attrdefs = self::$dms->getAllAttributeDefinitions();
$this->assertIsArray($attrdefs);
$this->assertCount(4, $attrdefs);
}
/**
* Test getAllWorkflows()
*
* The intitial database does not have any workflows
*
* @return void
*/
public function testGetAllWorkflows()
{
$workflows = self::$dms->getAllWorkflows();
$this->assertIsArray($workflows);
$this->assertCount(0, $workflows);
}
/**
* Test getAllWorkflows() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAllWorkflowsSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflows`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$workflows = $dms->getAllWorkflows();
$this->assertFalse($workflows);
}
/**
* Test getWorkflow() with a none existing workflow
*
* The intitial database does not have any workflows
*
* @return void
*/
public function testGetWorkflowNoExists()
{
$workflow = self::$dms->getWorkflow(1);
$this->assertNull($workflow);
/* Passing an id not a numeric value returns false */
$workflow = self::$dms->getWorkflow('foo');
$this->assertFalse($workflow);
/* Passing an id out of range returns false */
$workflow = self::$dms->getWorkflow(0);
$this->assertFalse($workflow);
}
/**
* Test getWorkflow() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetWorkflowSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflows` WHERE `id`="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$workflow = $dms->getWorkflow(1);
$this->assertFalse($workflow);
}
/**
* Test getWorkflowByName() with a none existing workflow
*
* The intitial database does not have any workflows
*
* @return void
*/
public function testGetWorkflowByNameNoExists()
{
$workflow = self::$dms->getWorkflowByName('foo');
$this->assertNull($workflow);
}
/**
* Test getWorkflowByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetWorkflowByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflows` WHERE `name`="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$workflow = $dms->getWorkflowByName('foo');
$this->assertFalse($workflow);
}
/**
* Test addWorkflow()
*
* Add a new workflow and retrieve it afterwards. Also check if the number
* of workflows has increased by one. Add a workflow with the same name a
* second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddWorkflow()
{
/* Adding a new workflow */
$workflowstate = self::$dms->addWorkflowState('new workflow state', S_RELEASED);
$workflow = self::$dms->addWorkflow('new workflow', $workflowstate);
$this->assertIsObject($workflow);
$this->assertEquals('new workflow', $workflow->getName());
/* Adding a workflow with the same name must fail */
$workflow = self::$dms->addWorkflow('new workflow', $workflowstate);
$this->assertFalse($workflow);
/* Adding a workflow with an empty name must fail */
$workflow = self::$dms->addWorkflow(' ', $workflowstate);
$this->assertFalse($workflow);
/* There should be one workflow now */
$workflows = self::$dms->getAllWorkflows();
$this->assertIsArray($workflows);
$this->assertCount(1, $workflows);
}
/**
* Test getAllWorkflowStates()
*
* The intitial database does not have any workflow states
*
* @return void
*/
public function testGetAllWorkflowStates()
{
$states = self::$dms->getAllWorkflowStates();
$this->assertIsArray($states);
$this->assertCount(0, $states);
}
/**
* Test getAllWorkflowStates() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAllWorkflowStatesSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflowStates`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$states = $dms->getAllWorkflowStates();
$this->assertFalse($states);
}
/**
* Test getWorkflowState() with a none existing workflow state
*
* The intitial database does not have any workflow states
*
* @return void
*/
public function testGetWorkflowStateNoExists()
{
$workflowstate = self::$dms->getWorkflowState(1);
$this->assertNull($workflowstate);
/* Passing an id not a numeric value returns false */
$workflowstate = self::$dms->getWorkflowState('foo');
$this->assertFalse($workflowstate);
/* Passing an id out of range returns false */
$workflowstate = self::$dms->getWorkflowState(0);
$this->assertFalse($workflowstate);
}
/**
* Test getWorkflowState() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetWorkflowStateSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflowStates` WHERE `id` ="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$state = $dms->getWorkflowState(1);
$this->assertFalse($state);
}
/**
* Test getWorkflowStateByName() with a none existing workflow state
*
* The intitial database does not have any workflow states
*
* @return void
*/
public function testGetWorkflowStateByNameNoExists()
{
$workflowstate = self::$dms->getWorkflowStateByName('foo');
$this->assertNull($workflowstate);
}
/**
* Test getWorkflowStateByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetWorkflowStateByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflowStates` WHERE `name`="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$state = $dms->getWorkflowStateByName('foo');
$this->assertFalse($state);
}
/**
* Test addWorkflowState()
*
* Add a new workflow state and retrieve it afterwards. Also check if the number
* of workflow states has increased by one. Add a workflow state with the same name a
* second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddWorkflowState()
{
/* Adding a new workflow state */
$workflowstate = self::$dms->addWorkflowState('new workflow state', S_RELEASED);
$this->assertIsObject($workflowstate);
$this->assertEquals('new workflow state', $workflowstate->getName());
/* Adding a workflow state with the same name must fail */
$workflowstate = self::$dms->addWorkflowState('new workflow state', S_RELEASED);
$this->assertFalse($workflowstate);
/* Adding a workflow state with an empty name must fail */
$workflowstate = self::$dms->addWorkflowState(' ', S_RELEASED);
$this->assertFalse($workflowstate);
/* There should be one workflow state now */
$workflowstates = self::$dms->getAllWorkflowStates();
$this->assertIsArray($workflowstates);
$this->assertCount(1, $workflowstates);
}
/**
* Test getAllWorkflowActions()
*
* The intitial database does not have any workflow actions
*
* @return void
*/
public function testGetAllWorkflowActions()
{
$actions = self::$dms->getAllWorkflowActions();
$this->assertIsArray($actions);
$this->assertCount(0, $actions);
}
/**
* Test getAllWorkflowActions() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetAllWorkflowActionsSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflowActions`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$actions = $dms->getAllWorkflowActions();
$this->assertFalse($actions);
}
/**
* Test getWorkflowAction() with a none existing workflow
*
* The intitial database does not have any workflow actions
*
* @return void
*/
public function testGetWorkflowActionNoExists()
{
$workflowaction = self::$dms->getWorkflowAction(1);
$this->assertNull($workflowaction);
/* Passing an id not a numeric value returns false */
$workflowaction = self::$dms->getWorkflowAction('foo');
$this->assertFalse($workflowaction);
/* Passing an id out of range returns false */
$workflowaction = self::$dms->getWorkflowAction(0);
$this->assertFalse($workflowaction);
}
/**
* Test getWorkflowAction() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetWorkflowActionSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflowActions` WHERE `id` ="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$action = $dms->getWorkflowAction(1);
$this->assertFalse($action);
}
/**
* Test getWorkflowActionByName() with a none existing workflow action
*
* The intitial database does not have any workflow actions
*
* @return void
*/
public function testGetWorkflowActionByNameNoExists()
{
$workflowaction = self::$dms->getWorkflowActionByName('foo');
$this->assertNull($workflowaction);
}
/**
* Test getWorkflowActionByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetWorkflowActionByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblWorkflowActions` WHERE `name` ="))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$action = $dms->getWorkflowActionByName('foo');
$this->assertFalse($action);
}
/**
* Test addWorkflowAction()
*
* Add a new workflow state and retrieve it afterwards. Also check if the number
* of workflow states has increased by one. Add a workflow state with the same name a
* second time and check if it returns false.
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testAddWorkflowAction()
{
/* Adding a new workflow action */
$workflowaction = self::$dms->addWorkflowAction('new workflow action', S_RELEASED);
$this->assertIsObject($workflowaction);
$this->assertEquals('new workflow action', $workflowaction->getName());
/* Adding a workflow action with the same name must fail */
$workflowaction = self::$dms->addWorkflowAction('new workflow action', S_RELEASED);
$this->assertFalse($workflowaction);
/* Adding a workflow action with an empty name must fail */
$workflowaction = self::$dms->addWorkflowAction(' ', S_RELEASED);
$this->assertFalse($workflowaction);
/* There should be one workflow action now */
$workflowactions = self::$dms->getAllWorkflowActions();
$this->assertIsArray($workflowactions);
$this->assertCount(1, $workflowactions);
}
/**
* Test getStatisticalData()
*
* @return void
*/
public function testGetStatisticalData()
{
/* There should one folder (root folder) */
$data = self::$dms->getStatisticalData('foldersperuser');
$this->assertIsArray($data);
$this->assertEquals(1, $data[0]['total']);
/* There should be no documents */
foreach (array('docsperuser', 'docspermimetype', 'docspercategory', 'docspermonth', 'docsperstatus', 'docsaccumulated', 'sizeperuser') as $type) {
$data = self::$dms->getStatisticalData($type);
$this->assertIsArray($data);
$this->assertCount(0, $data);
}
/* Passing an unknown name returns an empty array */
$data = self::$dms->getStatisticalData('foo');
$this->assertIsArray($data);
$this->assertCount(0, $data);
}
/**
* Test getStatisticalDataFail()
*
* Check if getStatisticalData() fails if the sql statements fail
*
* @return void
*/
public function testGetStatisticalDataFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->any())
->method('getResultArray')
->with($this->stringContains("SELECT "))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
foreach (array('foldersperuser', 'docsperuser', 'docspermimetype', 'docspercategory', 'docspermonth', 'docsperstatus', 'docsaccumulated', 'sizeperuser') as $type) {
$data = $dms->getStatisticalData($type);
$this->assertFalse($data);
}
}
/**
* Test createPasswordRequest() and checkPasswordRequest()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testCreateAndCheckAndDeletePasswordRequest()
{
$user = self::$dms->getUser(1);
$hash = self::$dms->createPasswordRequest($user);
$this->assertIsString($hash);
$user = self::$dms->checkPasswordRequest($hash);
$this->assertIsObject($user);
$this->assertEquals(1, $user->getId());
/* Check a non existing hash */
$user = self::$dms->checkPasswordRequest('foo');
$this->assertFalse($user);
/* Delete the hash */
$ret = self::$dms->deletePasswordRequest($hash);
$this->assertTrue($ret);
/* Checking the hash again must return false, because it was deleted */
$user = self::$dms->checkPasswordRequest($hash);
$this->assertFalse($user);
}
/**
* Test method checkPasswordRequest() with sql failure
*
* @return void
*/
public function testCheckPasswordRequestSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblUserPasswordRequest`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->checkPasswordRequest('foo'));
}
/**
* Test method deletePasswordRequest() with sql failure
*
* @return void
*/
public function testDeletePasswordRequestSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResult')
->with($this->stringContains("DELETE FROM `tblUserPasswordRequest`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->deletePasswordRequest('foo'));
}
/**
* Test getTimeline()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetTimeline()
{
$timeline = self::$dms->getTimeline();
$this->assertIsArray($timeline);
}
/**
* Test getUnlinkedDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetUnlinkedDocumentContent()
{
$contents = self::$dms->getUnlinkedDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(0, $contents);
}
/**
* Test getNoFileSizeDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetNoFileSizeDocumentContent()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$document = self::createDocument($rootfolder, $user, 'Document 1');
$contents = self::$dms->getNoFileSizeDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(0, $contents);
/* Manipulate the file size right in the database */
$dbh = self::$dms->getDB();
$ret = $dbh->getResult("UPDATE `tblDocumentContent` SET `fileSize` = 0");
$this->assertTrue($ret);
$contents = self::$dms->getNoFileSizeDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(1, $contents);
}
/**
* Test getNoFileSizeDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetNoFileSizeDocumentContentSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `fileSize`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->getNoFileSizeDocumentContent());
}
/**
* Test getNoChecksumDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetNoChecksumDocumentContent()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$document = self::createDocument($rootfolder, $user, 'Document 1');
$contents = self::$dms->getNoChecksumDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(0, $contents);
/* Manipulate the checksum right in the database */
$dbh = self::$dms->getDB();
$ret = $dbh->getResult("UPDATE `tblDocumentContent` SET `checksum` = null");
$this->assertTrue($ret);
$contents = self::$dms->getNoChecksumDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(1, $contents);
}
/**
* Test getNoChecksumDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetNoChecksumDocumentContentSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `checksum`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->getNoChecksumDocumentContent());
}
/**
* Test getDuplicateDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDuplicateDocumentContent()
{
$contents = self::$dms->getDuplicateDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(0, $contents);
}
/**
* Test getDuplicateDocumentContent()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDuplicateDocumentContentWithDuplicates()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$document1 = self::createDocument($rootfolder, $user, 'Document 1');
$filename = self::createTempFile(200);
list($document2, $res) = $rootfolder->addDocument(
'Documet 2', // name
'', // comment
null, // no expiration
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file1.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
list($document3, $res) = $rootfolder->addDocument(
'Documet 3', // name
'', // comment
null, // no expiration
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file1.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
$contents = self::$dms->getDuplicateDocumentContent();
$this->assertIsArray($contents);
$this->assertCount(1, $contents);
}
/**
* Test method getDuplicateDocumentContent() with sql failure
*
* @return void
*/
public function testGetDuplicateDocumentContentSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT a.*, b.`id` as dupid FROM `tblDocumentContent`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->getDuplicateDocumentContent());
}
/**
* Test getNotificationsByUser()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetNotificationsByUser()
{
$user = self::$dms->getUser(1);
$notifications = self::$dms->getNotificationsByUser($user, 0);
$this->assertIsArray($notifications);
$this->assertCount(0, $notifications);
$notifications = self::$dms->getNotificationsByUser($user, 1);
$this->assertIsArray($notifications);
$this->assertCount(0, $notifications);
}
/**
* Test getNotificationsByGroup()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetNotificationsByGroup()
{
$group = self::$dms->addGroup('new group', 'with comment');
$this->assertIsObject($group);
$notifications = self::$dms->getNotificationsByGroup($group, 0);
$this->assertIsArray($notifications);
$this->assertCount(0, $notifications);
$notifications = self::$dms->getNotificationsByGroup($group, 1);
$this->assertIsArray($notifications);
$this->assertCount(0, $notifications);
}
/**
* Test getDocumentsExpired()
*
* Check if getDocumentsExpired() fails if the parameters are wrong
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentsExpiredFail()
{
$documents = self::$dms->getDocumentsExpired(false);
$this->assertFalse($documents);
$documents = self::$dms->getDocumentsExpired('2021-04');
$this->assertFalse($documents);
$documents = self::$dms->getDocumentsExpired('2021-01-32');
$this->assertFalse($documents);
$documents = self::$dms->getDocumentsExpired('2021-01-31'); // valid date
$this->assertIsArray($documents);
}
/**
* Test method getDocumentsExpired() with sql failure
*
* @return void
*/
public function testGetDocumentsExpiredSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('createTemporaryTable')
->with('ttstatid')
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->getDocumentsExpired(1));
}
/**
* Test getDocumentByName()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentByName()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder);
$subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $subfolder);
/* Add a new document */
$filename = self::createTempFile(200);
list($document, $res) = $subfolder->addDocument(
'Document 1', // name
'', // comment
null, // no expiration
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file1.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
$this->assertIsObject($document);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
/* Search without a parent folder restriction */
$document = self::$dms->getDocumentByName('Document 1');
$this->assertInstanceOf(SeedDMS_Core_Document::class, $document);
/* Searching in the root folder will return no document */
$document = self::$dms->getDocumentByName('Document 1', $rootfolder);
$this->assertNull($document);
/* Searching in the sub folder will return the document */
$document = self::$dms->getDocumentByName('Document 1', $subfolder);
$this->assertInstanceOf(SeedDMS_Core_Document::class, $document);
/* Searching for an empty name returns false */
$document = self::$dms->getDocumentByName(' ');
$this->assertFalse($document);
}
/**
* Test getDocumentByName() with sql failure
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentByNameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('getResultArray')
->with($this->stringContains("SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lockUser`"))
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$document = $dms->getDocumentByName('foo');
$this->assertFalse($document);
}
/**
* Test getDocumentByOriginalFilename()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentByOriginalFilename()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder);
$subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $subfolder);
/* Add a new document */
$filename = self::createTempFile(200);
list($document, $res) = $subfolder->addDocument(
'Document 1', // name
'', // comment
null, // no expiration
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file1.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
$this->assertIsObject($document);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
/* Search without a parent folder restriction */
$document = self::$dms->getDocumentByOriginalFilename('file1.txt');
$this->assertInstanceOf(SeedDMS_Core_Document::class, $document);
/* Searching in the root folder will return no document */
$document = self::$dms->getDocumentByOriginalFilename('file1.txt', $rootfolder);
$this->assertNull($document);
/* Searching in the sub folder will return the document */
$document = self::$dms->getDocumentByOriginalFilename('file1.txt', $subfolder);
$this->assertInstanceOf(SeedDMS_Core_Document::class, $document);
/* Searching for an empty name returns false */
$document = self::$dms->getDocumentByOriginalFilename(' ');
$this->assertFalse($document);
}
/**
* Test method getDocumentByOriginalFilename() with sql failure
*
* @return void
*/
public function testGetDocumentByOriginalFilenameSqlFail()
{
$db = $this->createMock(SeedDMS_Core_DatabaseAccess::class);
$db->expects($this->once())
->method('createTemporaryTable')
->with('ttcontentid')
->willReturn(false);
$dms = new SeedDMS_Core_DMS($db, '');
$this->assertFalse($dms->getDocumentByOriginalFilename(1));
}
/**
* Test getDocumentList()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testGetDocumentList()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder);
/* Add a new document */
$filename = self::createTempFile(200);
list($document, $res) = $rootfolder->addDocument(
'Document 1', // name
'', // comment
null, // no expiration
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file1.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
$this->assertIsObject($document);
/* Add a second new document */
$filename = self::createTempFile(200);
list($document, $res) = $rootfolder->addDocument(
'Document 2', // name
'', // comment
mktime(0, 0, 0), // expires today
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file2.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
$this->assertIsObject($document);
$documents = self::$dms->getDocumentList('MyDocs', $user);
$this->assertIsArray($documents);
$this->assertCount(2, $documents);
/* All documents expiring from 1 year ago till today */
$documents = self::$dms->getDocumentList('ExpiredOwner', $user);
$this->assertIsArray($documents);
$this->assertCount(1, $documents);
/* All documents expiring today */
$documents = self::$dms->getDocumentList('ExpiredOwner', $user, 0);
$this->assertIsArray($documents);
$this->assertCount(1, $documents);
/* All documents expiring tomorrow */
$documents = self::$dms->getDocumentList('ExpiredOwner', $user, date("Y-m-d", time()+86400));
$this->assertIsArray($documents);
$this->assertCount(1, $documents);
/* Get unknown list */
$documents = self::$dms->getDocumentList('foo', $user);
$this->assertFalse($documents);
}
/**
* Test search()
*
* This method uses a real in memory sqlite3 database.
*
* @return void
*/
public function testSearch()
{
$rootfolder = self::$dms->getRootFolder();
$user = self::$dms->getUser(1);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder);
$subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0);
$this->assertInstanceOf(SeedDMS_Core_Folder::class, $subfolder);
/* Add a new document to the subfolder*/
$filename = self::createTempFile(200);
list($document, $res) = $subfolder->addDocument(
'Document 1', // name
'', // comment
null, // no expiration
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file1.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0 // sequence
);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
/* Add a new document to the root folder. All documents expire. The first
* expires today, the second expires tomorrow, etc.
*/
for ($i=2; $i<=30; $i++) {
$filename = self::createTempFile(200);
list($document, $res) = $rootfolder->addDocument(
'Document '.$i, // name
'', // comment
mktime(0, 0, 0)+($i-2)*86400, // expires in $i-2 days
$user, // owner
'', // keywords
[], // categories
$filename, // name of file
'file'.$i.'.txt', // original file name
'.txt', // file type
'text/plain', // mime type
1.0+$i // sequence
);
$this->assertTrue(SeedDMS_Core_File::removeFile($filename));
}
$hits = self::$dms->search(['query'=>'Document']);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(30, $hits['totalDocs']);
$this->assertCount(30, $hits['docs']);
/* Limit number of documents to 10 */
$hits = self::$dms->search(['query'=>'Document', 'limit'=>10]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(30, $hits['totalDocs']);
$this->assertCount(10, $hits['docs']);
/* Same number of documents if startFolder is the root folder */
$hits = self::$dms->search(['query'=>'Document', 'startFolder'=>$rootfolder]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(30, $hits['totalDocs']);
$this->assertCount(30, $hits['docs']);
/* There is just one document below the sub folder */
$hits = self::$dms->search(['query'=>'Document', 'startFolder'=>$subfolder]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(1, $hits['totalDocs']);
/* Get documents with a given expiration date in the future
* All documents in subfolder, but not the one in the root folder
*/
$expts = mktime(0, 0, 0);
$expstart = [
'year'=>date('Y', $expts),
'month'=>date('m', $expts),
'day'=>date('d', $expts),
'hour'=>date('H', $expts),
'minute'=>date('i', $expts),
'second'=>date('s', $expts)
];
$hits = self::$dms->search(['query'=>'Document', 'expirationstartdate'=>$expstart]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(29, $hits['totalDocs']);
/* Get documents with a given expiration date in the future, starting tomorrow
* All documents in subfolder - 1
*/
$expts = mktime(0, 0, 0)+86400;
$expstart = [
'year'=>date('Y', $expts),
'month'=>date('m', $expts),
'day'=>date('d', $expts),
'hour'=>date('H', $expts),
'minute'=>date('i', $expts),
'second'=>date('s', $expts)
];
$hits = self::$dms->search(['query'=>'Document', 'expirationstartdate'=>$expstart]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(28, $hits['totalDocs']);
/* Get documents expire today or tomorrow
* 2 documents in subfolder
*/
$expts = mktime(0, 0, 0);
$expstart = [
'year'=>date('Y', $expts),
'month'=>date('m', $expts),
'day'=>date('d', $expts),
'hour'=>date('H', $expts),
'minute'=>date('i', $expts),
'second'=>date('s', $expts)
];
$expts += 1*86400;
$expstop = [
'year'=>date('Y', $expts),
'month'=>date('m', $expts),
'day'=>date('d', $expts),
'hour'=>date('H', $expts),
'minute'=>date('i', $expts),
'second'=>date('s', $expts)
];
$hits = self::$dms->search(['query'=>'Document', 'expirationstartdate'=>$expstart, 'expirationenddate'=>$expstop]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(2, $hits['totalDocs']);
/* Get documents expire before and tomorrow
* 2 documents in subfolder
*/
$expts = mktime(0, 0, 0); // Start of today
$expts += 1*86400; // Start of tomorrow
$expstop = [
'year'=>date('Y', $expts),
'month'=>date('m', $expts),
'day'=>date('d', $expts),
'hour'=>date('H', $expts),
'minute'=>date('i', $expts),
'second'=>date('s', $expts)
];
$hits = self::$dms->search(['query'=>'Document', 'expirationenddate'=>$expstop]);
$this->assertIsArray($hits);
$this->assertCount(5, $hits);
$this->assertEquals(2, $hits['totalDocs']);
}
}