Skip to content
This repository has been archived by the owner on Dec 27, 2023. It is now read-only.

Commit

Permalink
fix(Felamimail/Spam): don't create duplicated folder
Browse files Browse the repository at this point in the history
Change-Id: Ia10e50fce777a35e89f5373d65a38016323c5578
Reviewed-on: http://gerrit.tine20.com/customers/18661
Tested-by: Jenkins CI (http://ci.tine20.com/) <tine20-jenkins@metaways.de>
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
  • Loading branch information
ccheng-dev authored and pschuele committed Dec 9, 2020
1 parent 0991440 commit a35cc21
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 38 deletions.
140 changes: 108 additions & 32 deletions tests/tine20/Felamimail/Model/MessagePipeTest.php
Expand Up @@ -14,18 +14,102 @@
*/
class Felamimail_Model_MessagePipeTest extends Felamimail_TestCase
{
/**
* test create duplicated folder from pipeline
*
* @throws Tinebase_Exception_Record_NotAllowed
* @throws Exception
*/
public function testMessagePipeCreateDuplicatedFolder()
{
$config = [
'spam' => [
'strategy' => 'copy',
'config' => [
'target' => [
'folder' => 'spam'
]
]
]
];

$pipe = 'spam';

// move to root
$this->_messagePipeTestHelper($config[$pipe]);
$this->_messagePipeTestHelper($config[$pipe]);

// move to sub folder
$config[$pipe]['config']['target']['folder'] = 'INBOX/SPAM';
$this->_messagePipeTestHelper($config[$pipe]);
$this->_messagePipeTestHelper($config[$pipe]);
}

/**
* test message pipe spam/ham with copy mail
* - copy mail to spam/ham folder of shared account
* - copy mail to spam/ham folder in internal account
* - copy mail to sub folder in internal account
*
* @throws Tinebase_Exception_Record_NotAllowed
* @throws Exception
*/
public function testMessagePipeCopyToInternalAccount()
{
// create shared account
$config = [
'spam' => [
'strategy' => 'copy',
'config' => [
'target' => [
'folder' => 'spam'
]
]
],
'ham' => [
'strategy' => 'copy',
'config' => [
'target' => [
'folder' => 'ham'
]
]
]
];

// move to root

$pipe = 'spam';

$message = $this->_messagePipeTestHelper($config[$pipe]);
$this->_assertMessageInFolder('spam', $message['subject']);

// move to sub folder
$config[$pipe]['config']['target']['folder'] = 'INBOX/SPAM';
$message = $this->_messagePipeTestHelper($config[$pipe]);
$this->_assertMessageInFolder('INBOX.SPAM', $message['subject'] );

$pipe = 'ham';

$message = $this->_messagePipeTestHelper($config[$pipe]);
$this->_assertMessageInFolder('ham', $message['subject']);

$config[$pipe]['config']['target']['folder'] = 'INBOX/HAM';
$message = $this->_messagePipeTestHelper($config[$pipe]);
$this->_assertMessageInFolder('INBOX.HAM', $message['subject'] );
}

/**
* test message pipe spam/ham with copy mail
* - copy mail to spam/ham folder in shared account
* - copy mail to sub folder in shared account
*
* @throws Tinebase_Exception_Record_NotAllowed
* @throws Exception
*/
public function testMessagePipeCopyToAnotherAccount()
{
// create shared account
$account = $this->_createSharedAccount();
$account = $this->_createSharedAccount();

$config = [
'spam' => [
'strategy' => 'copy',
Expand All @@ -46,33 +130,26 @@ public function testMessagePipeCopyToAnotherAccount()
]
]
];

// move to root
$pipe = 'spam';
// 'spam': folder called spam , '#spam': user configured spam folder
$targetFolder = 'spam';
$message = $this->_messagePipeTestHelper($config[$pipe], $targetFolder, $account);
$this->_assertMessageInFolder($targetFolder, $message['subject'], $account);

$pipe = 'ham';
$targetFolder = 'ham';
$message = $this->_messagePipeTestHelper($config[$pipe], $targetFolder, $account);
$this->_assertMessageInFolder($targetFolder, $message['subject'], $account);
$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$this->_assertMessageInFolder('spam', $message['subject'], $account);

// move to sub folder
$pipe = 'spam';
$targetFolder = 'INBOX.SPAM'; // 'spam': folder called spam , '#spam': user configured spam folder
$config[$pipe]['config']['target']['folder'] = 'INBOX/SPAM';
$message = $this->_messagePipeTestHelper($config[$pipe], $targetFolder, $account);
$this->_assertMessageInFolder($targetFolder, $message['subject'], $account);
$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$this->_assertMessageInFolder('INBOX.SPAM', $message['subject'], $account);

$pipe = 'ham';
$targetFolder = 'INBOX.HAM';
$config[$pipe]['config']['target']['folder'] = 'INBOX/HAM';
$message = $this->_messagePipeTestHelper($config[$pipe], $targetFolder, $account);
$this->_assertMessageInFolder($targetFolder, $message['subject'], $account);
$pipe = 'ham';

$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$this->_assertMessageInFolder('ham', $message['subject']);


$config[$pipe]['config']['target']['folder'] = 'INBOX/HAM';
$message = $this->_messagePipeTestHelper($config[$pipe], $account);
$this->_assertMessageInFolder('INBOX.HAM', $message['subject'], $account);
}

/**
Expand Down Expand Up @@ -106,15 +183,15 @@ public function testMessagePipeCopyToLocalDir()
];

// send message and copy to spam dir
$message = $this->_messagePipeTestHelper($config['spam'], 'spam');
$message = $this->_messagePipeTestHelper($config['spam']);
$this->_assertMessageInFolder('INBOX', $message['subject']);
// assert eml in $tmp . '/spam'
self::assertTrue(is_dir($tmp . '/spam'), 'no spam dir found');
$filename = $tmp . '/spam/' . $message->headers['message-id'] . '.eml';
self::assertTrue(file_exists($filename), 'eml file not found: ' . $filename);

// send message and copy to ham dir
$message = $this->_messagePipeTestHelper($config['ham'], 'ham');
$message = $this->_messagePipeTestHelper($config['ham']);
$this->_assertMessageInFolder('INBOX', $message['subject']);
// assert eml in $tmp . '/ham'
self::assertTrue(is_dir($tmp . '/ham'), 'no ham dir found');
Expand Down Expand Up @@ -148,7 +225,7 @@ public function testMessagePipeMove()
$inbox = $this->_getFolder('INBOX');
$inboxBefore = $this->_json->updateMessageCache($inbox['id'], 30);

$message = $this->_messagePipeTestHelper($config[$pipe], $targetFolder);
$message = $this->_messagePipeTestHelper($config[$pipe]);
$inboxAfter = $this->_getFolder('INBOX');

$this->assertEquals($inboxBefore['cache_unreadcount'], $inboxAfter['cache_unreadcount']);
Expand Down Expand Up @@ -176,7 +253,7 @@ public function testMessagePipeRewriteSubject()
]
];

$this->_messagePipeTestHelper($config[$pipe], 'INBOX');
$this->_messagePipeTestHelper($config[$pipe]);
$this->_assertMessageInFolder('INBOX', 'test messagePipe');
}

Expand All @@ -199,7 +276,7 @@ public function testMessagePipeRewriteSubject()
* @throws Tinebase_Exception_Record_NotAllowed
* @throws Tinebase_Exception_Record_Validation
*/
public function _messagePipeTestHelper($_config, $_folderName, Felamimail_Model_Account $_account = null)
public function _messagePipeTestHelper($_config, $_account = null)
{
// set spam strategy config
$this->_setFeatureForTest(Felamimail_Config::getInstance(), Felamimail_Config::FEATURE_SPAM_SUSPICION_STRATEGY);
Expand All @@ -208,20 +285,19 @@ public function _messagePipeTestHelper($_config, $_folderName, Felamimail_Model_
'pattern' => '/^SPAM\? \(.+\) \*\*\* /',
];
Felamimail_Config::getInstance()->set(Felamimail_Config::SPAM_SUSPICION_STRATEGY_CONFIG, $config);

$this->_getFolder('INBOX', true, $_account);
$this->_foldersToClear[] = ['INBOX', 'Sent', 'Trash'];

$subject = 'SPAM? (15) *** test messagePipe';

$message = $this->_sendMessage(
'INBOX',
[],
'',
$subject);

$message = Felamimail_Controller_Message::getInstance()->getCompleteMessage($message['id']);

// create and execute pipeLine
$pipeLineRecord = Felamimail_Model_MessagePipeConfig::factory($_config);
$rs = new Tinebase_Record_RecordSet(Felamimail_Model_MessagePipeConfig::class);
Expand All @@ -231,7 +307,7 @@ public function _messagePipeTestHelper($_config, $_folderName, Felamimail_Model_

$pipeLine = new Tinebase_BL_Pipe($rs);
$pipeLine->execute($message);

return $message;
}
}
22 changes: 16 additions & 6 deletions tine20/Felamimail/Model/MessagePipeMove.php
Expand Up @@ -76,19 +76,29 @@ public static function getTargetFolder($_account, $_targetFolder)
}
$_targetFolder = $_account->{$propertyName};
}

try {
$_targetFolder = str_replace('/', '.', $_targetFolder);
$_targetFolder = str_replace('/', $_account->delimiter, $_targetFolder);
Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' looking for folder ' . $_targetFolder);
$folder = Felamimail_Controller_Folder::getInstance()
->getByBackendAndGlobalName($_account['id'], $_targetFolder);
->getByBackendAndGlobalName($_account->getId(), $_targetFolder);
} catch (Tinebase_Exception_NotFound $e) {
$splitFolderName = Felamimail_Model_Folder::extractLocalnameAndParent($_targetFolder, '.');
$folder = Felamimail_Controller_Folder::getInstance()
->create($_account['id'], $splitFolderName['localname'], $splitFolderName['parent']);
Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Folder not found: ' . $_targetFolder);
$splitFolderName = Felamimail_Model_Folder::extractLocalnameAndParent($_targetFolder, $_account->delimiter);

$parentSubs = Felamimail_Controller_Cache_Folder::getInstance()
->update($_account, $splitFolderName['parent'], TRUE);
$folder = $parentSubs->filter('globalname', $_targetFolder)->getFirstRecord();

if ($folder === NULL) {
$folder = Felamimail_Controller_Folder::getInstance()
->create($_account->getId(), $splitFolderName['localname'], $splitFolderName['parent']);
}
}

return $folder;
}

public function getNewBLElement()
{
return $this;
Expand Down

0 comments on commit a35cc21

Please sign in to comment.