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; namespace OC\Notification;
use OC\RichObjectStrings\Validator;
use OCP\Notification\IApp; use OCP\Notification\IApp;
use OCP\Notification\IManager; use OCP\Notification\IManager;
use OCP\Notification\INotification; use OCP\Notification\INotification;
@ -149,7 +150,9 @@ class Manager implements IManager {
* @since 8.2.0 * @since 8.2.0
*/ */
public function createNotification() { 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\IAction;
use OCP\Notification\INotification; use OCP\Notification\INotification;
use OCP\RichObjectStrings\InvalidObjectExeption;
use OCP\RichObjectStrings\IValidator;
class Notification implements INotification { class Notification implements INotification {
/** @var IValidator */
protected $richValidator;
/** @var string */ /** @var string */
protected $app; protected $app;
@ -52,6 +58,12 @@ class Notification implements INotification {
/** @var string */ /** @var string */
protected $subjectParsed; protected $subjectParsed;
/** @var string */
protected $subjectRich;
/** @var array */
protected $subjectRichParameters;
/** @var string */ /** @var string */
protected $message; protected $message;
@ -81,8 +93,11 @@ class Notification implements INotification {
/** /**
* Constructor * Constructor
*
* @param IValidator $richValidator
*/ */
public function __construct() { public function __construct(IValidator $richValidator) {
$this->richValidator = $richValidator;
$this->app = ''; $this->app = '';
$this->user = ''; $this->user = '';
$this->dateTime = new \DateTime(); $this->dateTime = new \DateTime();
@ -92,6 +107,8 @@ class Notification implements INotification {
$this->subject = ''; $this->subject = '';
$this->subjectParameters = []; $this->subjectParameters = [];
$this->subjectParsed = ''; $this->subjectParsed = '';
$this->subjectRich = '';
$this->subjectRichParameters = [];
$this->message = ''; $this->message = '';
$this->messageParameters = []; $this->messageParameters = [];
$this->messageParsed = ''; $this->messageParsed = '';
@ -261,6 +278,43 @@ class Notification implements INotification {
return $this->subjectParsed; 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 string $message
* @param array $parameters * @param array $parameters
@ -454,6 +508,14 @@ class Notification implements INotification {
* @since 8.2.0 * @since 8.2.0
*/ */
public function isValidParsed() { public function isValidParsed() {
if ($this->getRichSubject() !== '' || !empty($this->getRichSubjectParameters())) {
try {
$this->richValidator->validate($this->getRichSubject(), $this->getRichSubjectParameters());
} catch (InvalidObjectExeption $e) {
return false;
}
}
return return
$this->isValidCommon() $this->isValidCommon()
&& &&

View File

@ -127,6 +127,27 @@ interface INotification {
*/ */
public function getParsedSubject(); 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 string $message
* @param array $parameters * @param array $parameters

View File

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