Allow rich object subjects for Notifications

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2016-10-14 16:55:20 +02:00
parent 2098648850
commit b35d2fd8f2
No known key found for this signature in database
GPG Key ID: E166FD8976B3BAC8
4 changed files with 109 additions and 31 deletions

View File

@ -24,6 +24,7 @@
namespace OC\Notification;
use OC\RichObjectStrings\Validator;
use OCP\Notification\IApp;
use OCP\Notification\IManager;
use OCP\Notification\INotification;
@ -149,7 +150,9 @@ class Manager implements IManager {
* @since 8.2.0
*/
public function createNotification() {
return new Notification();
return new Notification(
new Validator()
);
}
/**

View File

@ -26,8 +26,14 @@ namespace OC\Notification;
use OCP\Notification\IAction;
use OCP\Notification\INotification;
use OCP\RichObjectStrings\InvalidObjectExeption;
use OCP\RichObjectStrings\IValidator;
class Notification implements INotification {
/** @var IValidator */
protected $richValidator;
/** @var string */
protected $app;
@ -52,6 +58,12 @@ class Notification implements INotification {
/** @var string */
protected $subjectParsed;
/** @var string */
protected $subjectRich;
/** @var array */
protected $subjectRichParameters;
/** @var string */
protected $message;
@ -81,8 +93,11 @@ class Notification implements INotification {
/**
* Constructor
*
* @param IValidator $richValidator
*/
public function __construct() {
public function __construct(IValidator $richValidator) {
$this->richValidator = $richValidator;
$this->app = '';
$this->user = '';
$this->dateTime = new \DateTime();
@ -92,6 +107,8 @@ class Notification implements INotification {
$this->subject = '';
$this->subjectParameters = [];
$this->subjectParsed = '';
$this->subjectRich = '';
$this->subjectRichParameters = [];
$this->message = '';
$this->messageParameters = [];
$this->messageParsed = '';
@ -261,6 +278,43 @@ class Notification implements INotification {
return $this->subjectParsed;
}
/**
* @param string $subject
* @param array $parameters
* @return $this
* @throws \InvalidArgumentException if the subject or parameters are invalid
* @since 9.2.0
*/
public function setRichSubject($subject, array $parameters = []) {
if (!is_string($subject) || $subject === '') {
throw new \InvalidArgumentException('The given parsed subject is invalid');
}
$this->subjectRich = $subject;
if (!is_array($parameters)) {
throw new \InvalidArgumentException('The given subject parameters are invalid');
}
$this->subjectRichParameters = $parameters;
return $this;
}
/**
* @return string
* @since 9.2.0
*/
public function getRichSubject() {
return $this->subjectRich;
}
/**
* @return array[]
* @since 9.2.0
*/
public function getRichSubjectParameters() {
return $this->subjectRichParameters;
}
/**
* @param string $message
* @param array $parameters
@ -454,6 +508,14 @@ class Notification implements INotification {
* @since 8.2.0
*/
public function isValidParsed() {
if ($this->getRichSubject() !== '' || !empty($this->getRichSubjectParameters())) {
try {
$this->richValidator->validate($this->getRichSubject(), $this->getRichSubjectParameters());
} catch (InvalidObjectExeption $e) {
return false;
}
}
return
$this->isValidCommon()
&&

View File

@ -127,6 +127,27 @@ interface INotification {
*/
public function getParsedSubject();
/**
* @param string $subject
* @param array $parameters
* @return $this
* @throws \InvalidArgumentException if the subject or parameters are invalid
* @since 9.2.0
*/
public function setRichSubject($subject, array $parameters = []);
/**
* @return string
* @since 9.2.0
*/
public function getRichSubject();
/**
* @return array[]
* @since 9.2.0
*/
public function getRichSubjectParameters();
/**
* @param string $message
* @param array $parameters

View File

@ -23,16 +23,21 @@ namespace Test\Notification;
use OC\Notification\Notification;
use OCP\Notification\IAction;
use OCP\Notification\INotification;
use OCP\RichObjectStrings\IValidator;
use Test\TestCase;
class NotificationTest extends TestCase {
/** @var INotification */
protected $notification;
/** @var IValidator|\PHPUnit_Framework_MockObject_MockObject */
protected $validator;
public function setUp() {
parent::setUp();
$this->notification = new Notification();
$this->validator = $this->createMock(IValidator::class);
$this->notification = new Notification($this->validator);
}
protected function dataValidString($maxLength) {
@ -416,14 +421,12 @@ class NotificationTest extends TestCase {
public function testCreateAction() {
$action = $this->notification->createAction();
$this->assertInstanceOf('OCP\Notification\IAction', $action);
$this->assertInstanceOf(IAction::class, $action);
}
public function testAddAction() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action = $this->createMock(IAction::class);
$action->expects($this->once())
->method('isValid')
->willReturn(true);
@ -441,9 +444,7 @@ class NotificationTest extends TestCase {
*/
public function testAddActionInvalid() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action = $this->createMock(IAction::class);
$action->expects($this->once())
->method('isValid')
->willReturn(false);
@ -455,9 +456,7 @@ class NotificationTest extends TestCase {
public function testAddActionSecondPrimary() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action = $this->createMock(IAction::class);
$action->expects($this->exactly(2))
->method('isValid')
->willReturn(true);
@ -473,9 +472,7 @@ class NotificationTest extends TestCase {
public function testAddParsedAction() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action = $this->createMock(IAction::class);
$action->expects($this->once())
->method('isValidParsed')
->willReturn(true);
@ -493,9 +490,7 @@ class NotificationTest extends TestCase {
*/
public function testAddParsedActionInvalid() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action = $this->createMock(IAction::class);
$action->expects($this->once())
->method('isValidParsed')
->willReturn(false);
@ -507,9 +502,7 @@ class NotificationTest extends TestCase {
public function testAddActionSecondParsedPrimary() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action = $this->createMock(IAction::class);
$action->expects($this->exactly(2))
->method('isValidParsed')
->willReturn(true);
@ -525,9 +518,7 @@ class NotificationTest extends TestCase {
public function testAddActionParsedPrimaryEnd() {
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action1 = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action1 = $this->createMock(IAction::class);
$action1->expects($this->exactly(2))
->method('isValidParsed')
->willReturn(true);
@ -535,9 +526,7 @@ class NotificationTest extends TestCase {
->method('isPrimary')
->willReturn(false);
/** @var \OCP\Notification\IAction|\PHPUnit_Framework_MockObject_MockObject $action */
$action2 = $this->getMockBuilder('OCP\Notification\IAction')
->disableOriginalConstructor()
->getMock();
$action2 = $this->createMock(IAction::class);
$action2->expects($this->once())
->method('isValidParsed')
->willReturn(true);
@ -570,12 +559,13 @@ class NotificationTest extends TestCase {
*/
public function testIsValid($isValidCommon, $subject, $expected) {
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
$notification = $this->getMockBuilder('\OC\Notification\Notification')
$notification = $this->getMockBuilder(Notification::class)
->setMethods([
'isValidCommon',
'getSubject',
'getParsedSubject',
])
->setConstructorArgs([$this->validator])
->getMock();
$notification->expects($this->once())
@ -602,12 +592,13 @@ class NotificationTest extends TestCase {
*/
public function testIsParsedValid($isValidCommon, $subject, $expected) {
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
$notification = $this->getMockBuilder('\OC\Notification\Notification')
$notification = $this->getMockBuilder(Notification::class)
->setMethods([
'isValidCommon',
'getParsedSubject',
'getSubject',
])
->setConstructorArgs([$this->validator])
->getMock();
$notification->expects($this->once())
@ -648,7 +639,7 @@ class NotificationTest extends TestCase {
*/
public function testIsValidCommon($app, $user, $timestamp, $objectType, $objectId, $expected) {
/** @var \OCP\Notification\INotification|\PHPUnit_Framework_MockObject_MockObject $notification */
$notification = $this->getMockBuilder('\OC\Notification\Notification')
$notification = $this->getMockBuilder(Notification::class)
->setMethods([
'getApp',
'getUser',
@ -656,6 +647,7 @@ class NotificationTest extends TestCase {
'getObjectType',
'getObjectId',
])
->setConstructorArgs([$this->validator])
->getMock();
$notification->expects($this->any())