diff options
Diffstat (limited to 'tests/units')
-rw-r--r-- | tests/units/ActionTaskMoveColumnCategoryChangeTest.php | 61 | ||||
-rw-r--r-- | tests/units/ActionTaskUpdateStartDateTest.php | 2 | ||||
-rw-r--r-- | tests/units/Base.php | 35 | ||||
-rw-r--r-- | tests/units/FileTest.php | 163 | ||||
-rw-r--r-- | tests/units/MailgunTest.php (renamed from tests/units/MailgunWebhookTest.php) | 36 | ||||
-rw-r--r-- | tests/units/NotificationTest.php | 303 | ||||
-rw-r--r-- | tests/units/PostmarkTest.php (renamed from tests/units/PostmarkWebhookTest.php) | 45 | ||||
-rw-r--r-- | tests/units/SendgridTest.php (renamed from tests/units/SendgridWebhookTest.php) | 50 | ||||
-rw-r--r-- | tests/units/TaskDuplicationTest.php | 4 | ||||
-rw-r--r-- | tests/units/TaskMovedDateSubscriberTest.php | 77 | ||||
-rw-r--r-- | tests/units/TextHelperTest.php | 8 |
11 files changed, 687 insertions, 97 deletions
diff --git a/tests/units/ActionTaskMoveColumnCategoryChangeTest.php b/tests/units/ActionTaskMoveColumnCategoryChangeTest.php new file mode 100644 index 00000000..0ddee786 --- /dev/null +++ b/tests/units/ActionTaskMoveColumnCategoryChangeTest.php @@ -0,0 +1,61 @@ +<?php + +require_once __DIR__.'/Base.php'; + +use Event\GenericEvent; +use Model\Task; +use Model\TaskCreation; +use Model\TaskFinder; +use Model\Project; +use Model\Category; +use Integration\GithubWebhook; + +class ActionTaskMoveColumnCategoryChangeTest extends Base +{ + public function testExecute() + { + $action = new Action\TaskMoveColumnCategoryChange($this->container, 1, Task::EVENT_UPDATE); + $action->setParam('dest_column_id', 3); + $action->setParam('category_id', 1); + + $this->assertEquals(3, $action->getParam('dest_column_id')); + $this->assertEquals(1, $action->getParam('category_id')); + + // We create a task in the first column + $tc = new TaskCreation($this->container); + $tf = new TaskFinder($this->container); + $p = new Project($this->container); + $c = new Category($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $c->create(array('name' => 'bug', 'project_id' => 1))); + $this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 1))); + + // No category should be assigned + column_id=1 + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEmpty($task['category_id']); + $this->assertEquals(1, $task['column_id']); + + // We create an event to move the task to the 2nd column + $event = array( + 'task_id' => 1, + 'column_id' => 1, + 'project_id' => 1, + 'category_id' => 1, + ); + + // Our event should be executed + $this->assertTrue($action->hasCompatibleEvent()); + $this->assertTrue($action->hasRequiredProject($event)); + $this->assertTrue($action->hasRequiredParameters($event)); + $this->assertTrue($action->hasRequiredCondition($event)); + $this->assertTrue($action->isExecutable($event)); + $this->assertTrue($action->execute(new GenericEvent($event))); + + // Our task should be moved to the other column + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEquals(3, $task['column_id']); + } +} diff --git a/tests/units/ActionTaskUpdateStartDateTest.php b/tests/units/ActionTaskUpdateStartDateTest.php index da36551d..4bf87452 100644 --- a/tests/units/ActionTaskUpdateStartDateTest.php +++ b/tests/units/ActionTaskUpdateStartDateTest.php @@ -38,7 +38,7 @@ class ActionTaskUpdateStartDateTest extends Base // Our event should be executed $this->assertTrue($action->execute(new GenericEvent($event))); - // Our task should be closed + // Our task should be updated $task = $tf->getById(1); $this->assertNotEmpty($task); $this->assertEquals(time(), $task['date_started'], '', 2); diff --git a/tests/units/Base.php b/tests/units/Base.php index 20f4a8cc..bc6518fb 100644 --- a/tests/units/Base.php +++ b/tests/units/Base.php @@ -11,10 +11,27 @@ use SimpleLogger\File; date_default_timezone_set('UTC'); +class FakeEmailClient +{ + public $email; + public $name; + public $subject; + public $html; + + public function send($email, $name, $subject, $html) + { + $this->email = $email; + $this->name = $name; + $this->subject = $subject; + $this->html = $html; + } +} + class FakeHttpClient { private $url = ''; private $data = array(); + private $headers = array(); public function getUrl() { @@ -26,16 +43,29 @@ class FakeHttpClient return $this->data; } + public function getHeaders() + { + return $this->headers; + } + public function toPrettyJson() { return json_encode($this->data, JSON_PRETTY_PRINT); } - public function post($url, array $data) + public function postJson($url, array $data, array $headers = array()) + { + $this->url = $url; + $this->data = $data; + $this->headers = $headers; + return true; + } + + public function postForm($url, array $data, array $headers = array()) { $this->url = $url; $this->data = $data; - //echo $this->toPrettyJson(); + $this->headers = $headers; return true; } } @@ -73,6 +103,7 @@ abstract class Base extends PHPUnit_Framework_TestCase $this->container['logger'] = new Logger; $this->container['logger']->setLogger(new File('/dev/null')); $this->container['httpClient'] = new FakeHttpClient; + $this->container['emailClient'] = new FakeEmailClient; } public function tearDown() diff --git a/tests/units/FileTest.php b/tests/units/FileTest.php index 5e882fdb..4ea7f386 100644 --- a/tests/units/FileTest.php +++ b/tests/units/FileTest.php @@ -9,6 +9,36 @@ use Model\Project; class FileTest extends Base { + public function testCreation() + { + $p = new Project($this->container); + $f = new File($this->container); + $tc = new TaskCreation($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test'))); + + $this->assertEquals(1, $f->create(1, 'test', '/tmp/foo', 10)); + + $file = $f->getById(1); + $this->assertNotEmpty($file); + $this->assertEquals('test', $file['name']); + $this->assertEquals('/tmp/foo', $file['path']); + $this->assertEquals(0, $file['is_image']); + $this->assertEquals(1, $file['task_id']); + $this->assertEquals(time(), $file['date'], '', 2); + $this->assertEquals(0, $file['user_id']); + $this->assertEquals(10, $file['size']); + + $this->assertEquals(2, $f->create(1, 'test2.png', '/tmp/foobar', 10)); + + $file = $f->getById(2); + $this->assertNotEmpty($file); + $this->assertEquals('test2.png', $file['name']); + $this->assertEquals('/tmp/foobar', $file['path']); + $this->assertEquals(1, $file['is_image']); + } + public function testCreationFileNameTooLong() { $p = new Project($this->container); @@ -18,8 +48,8 @@ class FileTest extends Base $this->assertEquals(1, $p->create(array('name' => 'test'))); $this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test'))); - $this->assertTrue($f->create(1, 'test', '/tmp/foo', false, 10)); - $this->assertTrue($f->create(1, str_repeat('a', 1000), '/tmp/foo', false, 10)); + $this->assertNotFalse($f->create(1, 'test', '/tmp/foo', 10)); + $this->assertNotFalse($f->create(1, str_repeat('a', 1000), '/tmp/foo', 10)); $files = $f->getAll(1); $this->assertNotEmpty($files); @@ -28,4 +58,133 @@ class FileTest extends Base $this->assertEquals(str_repeat('a', 255), $files[0]['name']); $this->assertEquals('test', $files[1]['name']); } + + public function testIsImage() + { + $f = new File($this->container); + + $this->assertTrue($f->isImage('test.png')); + $this->assertTrue($f->isImage('test.jpeg')); + $this->assertTrue($f->isImage('test.gif')); + $this->assertTrue($f->isImage('test.jpg')); + $this->assertTrue($f->isImage('test.JPG')); + + $this->assertFalse($f->isImage('test.bmp')); + $this->assertFalse($f->isImage('test')); + $this->assertFalse($f->isImage('test.pdf')); + } + + public function testGeneratePath() + { + $f = new File($this->container); + + $this->assertStringStartsWith('12/34/', $f->generatePath(12, 34, 'test.png')); + $this->assertNotEquals($f->generatePath(12, 34, 'test1.png'), $f->generatePath(12, 34, 'test2.png')); + } + + public function testUploadScreenshot() + { + $p = new Project($this->container); + $f = new File($this->container); + $tc = new TaskCreation($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test'))); + + $this->assertEquals(1, $f->uploadScreenshot(1, 1, base64_encode('image data'))); + + $file = $f->getById(1); + $this->assertNotEmpty($file); + $this->assertStringStartsWith('Screenshot taken ', $file['name']); + $this->assertStringStartsWith('1/1/', $file['path']); + $this->assertEquals(1, $file['is_image']); + $this->assertEquals(1, $file['task_id']); + $this->assertEquals(time(), $file['date'], '', 2); + $this->assertEquals(0, $file['user_id']); + $this->assertEquals(10, $file['size']); + } + + public function testUploadFileContent() + { + $p = new Project($this->container); + $f = new File($this->container); + $tc = new TaskCreation($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test'))); + + $this->assertEquals(1, $f->uploadContent(1, 1, 'my file.pdf', base64_encode('file data'))); + + $file = $f->getById(1); + $this->assertNotEmpty($file); + $this->assertEquals('my file.pdf', $file['name']); + $this->assertStringStartsWith('1/1/', $file['path']); + $this->assertEquals(0, $file['is_image']); + $this->assertEquals(1, $file['task_id']); + $this->assertEquals(time(), $file['date'], '', 2); + $this->assertEquals(0, $file['user_id']); + $this->assertEquals(9, $file['size']); + } + + public function testGetAll() + { + $p = new Project($this->container); + $f = new File($this->container); + $tc = new TaskCreation($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test'))); + + $this->assertEquals(1, $f->create(1, 'B.pdf', '/tmp/foo', 10)); + $this->assertEquals(2, $f->create(1, 'A.png', '/tmp/foo', 10)); + $this->assertEquals(3, $f->create(1, 'D.doc', '/tmp/foo', 10)); + $this->assertEquals(4, $f->create(1, 'C.JPG', '/tmp/foo', 10)); + + $files = $f->getAll(1); + $this->assertNotEmpty($files); + $this->assertCount(4, $files); + $this->assertEquals('A.png', $files[0]['name']); + $this->assertEquals('B.pdf', $files[1]['name']); + $this->assertEquals('C.JPG', $files[2]['name']); + $this->assertEquals('D.doc', $files[3]['name']); + + $files = $f->getAllImages(1); + $this->assertNotEmpty($files); + $this->assertCount(2, $files); + $this->assertEquals('A.png', $files[0]['name']); + $this->assertEquals('C.JPG', $files[1]['name']); + + $files = $f->getAllDocuments(1); + $this->assertNotEmpty($files); + $this->assertCount(2, $files); + $this->assertEquals('B.pdf', $files[0]['name']); + $this->assertEquals('D.doc', $files[1]['name']); + } + + public function testRemove() + { + $p = new Project($this->container); + $f = new File($this->container); + $tc = new TaskCreation($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test'))); + + $this->assertEquals(1, $f->create(1, 'B.pdf', '/tmp/foo', 10)); + $this->assertEquals(2, $f->create(1, 'A.png', '/tmp/foo', 10)); + $this->assertEquals(3, $f->create(1, 'D.doc', '/tmp/foo', 10)); + + $this->assertTrue($f->remove(2)); + + $files = $f->getAll(1); + $this->assertNotEmpty($files); + $this->assertCount(2, $files); + $this->assertEquals('B.pdf', $files[0]['name']); + $this->assertEquals('D.doc', $files[1]['name']); + + $this->assertTrue($f->removeAll(1)); + + $files = $f->getAll(1); + $this->assertEmpty($files); + } } diff --git a/tests/units/MailgunWebhookTest.php b/tests/units/MailgunTest.php index c2745180..b33a66fe 100644 --- a/tests/units/MailgunWebhookTest.php +++ b/tests/units/MailgunTest.php @@ -2,18 +2,38 @@ require_once __DIR__.'/Base.php'; -use Integration\MailgunWebhook; +use Integration\Mailgun; use Model\TaskCreation; use Model\TaskFinder; use Model\Project; use Model\ProjectPermission; use Model\User; -class MailgunWebhookTest extends Base +class MailgunTest extends Base { + public function testSendEmail() + { + $pm = new Mailgun($this->container); + $pm->sendEmail('test@localhost', 'Me', 'Test', 'Content', 'Bob'); + + $this->assertStringStartsWith('https://api.mailgun.net/v3/', $this->container['httpClient']->getUrl()); + + $data = $this->container['httpClient']->getData(); + + $this->assertArrayHasKey('from', $data); + $this->assertArrayHasKey('to', $data); + $this->assertArrayHasKey('subject', $data); + $this->assertArrayHasKey('html', $data); + + $this->assertEquals('Me <test@localhost>', $data['to']); + $this->assertEquals('Bob <notifications@kanboard.local>', $data['from']); + $this->assertEquals('Test', $data['subject']); + $this->assertEquals('Content', $data['html']); + } + public function testHandlePayload() { - $w = new MailgunWebhook($this->container); + $w = new Mailgun($this->container); $p = new Project($this->container); $pp = new ProjectPermission($this->container); $u = new User($this->container); @@ -26,20 +46,20 @@ class MailgunWebhookTest extends Base $this->assertEquals(2, $p->create(array('name' => 'test2', 'identifier' => 'TEST1'))); // Empty payload - $this->assertFalse($w->parsePayload(array())); + $this->assertFalse($w->receiveEmail(array())); // Unknown user - $this->assertFalse($w->parsePayload(array('sender' => 'a@b.c', 'subject' => 'Email task', 'recipient' => 'foobar', 'stripped-text' => 'boo'))); + $this->assertFalse($w->receiveEmail(array('sender' => 'a@b.c', 'subject' => 'Email task', 'recipient' => 'foobar', 'stripped-text' => 'boo'))); // Project not found - $this->assertFalse($w->parsePayload(array('sender' => 'me@localhost', 'subject' => 'Email task', 'recipient' => 'foo+test@localhost', 'stripped-text' => 'boo'))); + $this->assertFalse($w->receiveEmail(array('sender' => 'me@localhost', 'subject' => 'Email task', 'recipient' => 'foo+test@localhost', 'stripped-text' => 'boo'))); // User is not member - $this->assertFalse($w->parsePayload(array('sender' => 'me@localhost', 'subject' => 'Email task', 'recipient' => 'foo+test1@localhost', 'stripped-text' => 'boo'))); + $this->assertFalse($w->receiveEmail(array('sender' => 'me@localhost', 'subject' => 'Email task', 'recipient' => 'foo+test1@localhost', 'stripped-text' => 'boo'))); $this->assertTrue($pp->addMember(2, 2)); // The task must be created - $this->assertTrue($w->parsePayload(array('sender' => 'me@localhost', 'subject' => 'Email task', 'recipient' => 'foo+test1@localhost', 'stripped-text' => 'boo'))); + $this->assertTrue($w->receiveEmail(array('sender' => 'me@localhost', 'subject' => 'Email task', 'recipient' => 'foo+test1@localhost', 'stripped-text' => 'boo'))); $task = $tf->getById(1); $this->assertNotEmpty($task); diff --git a/tests/units/NotificationTest.php b/tests/units/NotificationTest.php index 37285212..92b839c4 100644 --- a/tests/units/NotificationTest.php +++ b/tests/units/NotificationTest.php @@ -2,14 +2,168 @@ require_once __DIR__.'/Base.php'; +use Model\TaskFinder; +use Model\TaskCreation; +use Model\Subtask; +use Model\Comment; use Model\User; +use Model\File; use Model\Project; use Model\ProjectPermission; use Model\Notification; +use Subscriber\NotificationSubscriber; class NotificationTest extends Base { - public function testGetUsersWithNotification() + public function testFilterNone() + { + $u = new User($this->container); + $n = new Notification($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user1', 'notifications_filter' => Notification::FILTER_NONE))); + $this->assertTrue($n->filterNone($u->getById(2), array())); + + $this->assertEquals(3, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_BOTH))); + $this->assertFalse($n->filterNone($u->getById(3), array())); + } + + public function testFilterCreator() + { + $u = new User($this->container); + $n = new Notification($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user1', 'notifications_filter' => Notification::FILTER_CREATOR))); + $this->assertTrue($n->filterCreator($u->getById(2), array('task' => array('creator_id' => 2)))); + + $this->assertEquals(3, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_CREATOR))); + $this->assertFalse($n->filterCreator($u->getById(3), array('task' => array('creator_id' => 1)))); + + $this->assertEquals(4, $u->create(array('username' => 'user3', 'notifications_filter' => Notification::FILTER_NONE))); + $this->assertFalse($n->filterCreator($u->getById(4), array('task' => array('creator_id' => 2)))); + } + + public function testFilterAssignee() + { + $u = new User($this->container); + $n = new Notification($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user1', 'notifications_filter' => Notification::FILTER_ASSIGNEE))); + $this->assertTrue($n->filterAssignee($u->getById(2), array('task' => array('owner_id' => 2)))); + + $this->assertEquals(3, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_ASSIGNEE))); + $this->assertFalse($n->filterAssignee($u->getById(3), array('task' => array('owner_id' => 1)))); + + $this->assertEquals(4, $u->create(array('username' => 'user3', 'notifications_filter' => Notification::FILTER_NONE))); + $this->assertFalse($n->filterAssignee($u->getById(4), array('task' => array('owner_id' => 2)))); + } + + public function testFilterBoth() + { + $u = new User($this->container); + $n = new Notification($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user1', 'notifications_filter' => Notification::FILTER_BOTH))); + $this->assertTrue($n->filterBoth($u->getById(2), array('task' => array('owner_id' => 2, 'creator_id' => 1)))); + $this->assertTrue($n->filterBoth($u->getById(2), array('task' => array('owner_id' => 0, 'creator_id' => 2)))); + + $this->assertEquals(3, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_BOTH))); + $this->assertFalse($n->filterBoth($u->getById(3), array('task' => array('owner_id' => 1, 'creator_id' => 1)))); + $this->assertFalse($n->filterBoth($u->getById(3), array('task' => array('owner_id' => 2, 'creator_id' => 1)))); + + $this->assertEquals(4, $u->create(array('username' => 'user3', 'notifications_filter' => Notification::FILTER_NONE))); + $this->assertFalse($n->filterBoth($u->getById(4), array('task' => array('owner_id' => 2, 'creator_id' => 1)))); + } + + public function testFilterProject() + { + $u = new User($this->container); + $n = new Notification($this->container); + $p = new Project($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $this->assertEquals(2, $p->create(array('name' => 'UnitTest2'))); + + // No project selected + $this->assertTrue($n->filterProject($u->getById(1), array())); + + // User that select only some projects + $this->assertEquals(2, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_NONE))); + $n->saveSettings(2, array('notifications_enabled' => 1, 'projects' => array(2 => true))); + + $this->assertFalse($n->filterProject($u->getById(2), array('task' => array('project_id' => 1)))); + $this->assertTrue($n->filterProject($u->getById(2), array('task' => array('project_id' => 2)))); + } + + public function testFilterUserWithNoFilter() + { + $u = new User($this->container); + $n = new Notification($this->container); + $p = new Project($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_NONE))); + + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1)))); + } + + public function testFilterUserWithAssigneeFilter() + { + $u = new User($this->container); + $n = new Notification($this->container); + $p = new Project($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_ASSIGNEE))); + + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'owner_id' => 2)))); + $this->assertFalse($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'owner_id' => 1)))); + } + + public function testFilterUserWithCreatorFilter() + { + $u = new User($this->container); + $n = new Notification($this->container); + $p = new Project($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_CREATOR))); + + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 2)))); + $this->assertFalse($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 1)))); + } + + public function testFilterUserWithBothFilter() + { + $u = new User($this->container); + $n = new Notification($this->container); + $p = new Project($this->container); + + $this->assertEquals(2, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_BOTH))); + + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 2, 'owner_id' => 3)))); + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 0, 'owner_id' => 2)))); + $this->assertFalse($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 4, 'owner_id' => 1)))); + $this->assertFalse($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 5, 'owner_id' => 0)))); + } + + public function testFilterUserWithBothFilterAndProjectSelected() + { + $u = new User($this->container); + $n = new Notification($this->container); + $p = new Project($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $this->assertEquals(2, $p->create(array('name' => 'UnitTest2'))); + + $this->assertEquals(2, $u->create(array('username' => 'user2', 'notifications_filter' => Notification::FILTER_BOTH))); + + $n->saveSettings(2, array('notifications_enabled' => 1, 'projects' => array(2 => true))); + + $this->assertFalse($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 2, 'owner_id' => 3)))); + $this->assertFalse($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 1, 'creator_id' => 0, 'owner_id' => 2)))); + + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 2, 'creator_id' => 2, 'owner_id' => 3)))); + $this->assertTrue($n->shouldReceiveNotification($u->getById(2), array('task' => array('project_id' => 2, 'creator_id' => 0, 'owner_id' => 2)))); + } + + public function testGetProjectMembersWithNotifications() { $u = new User($this->container); $p = new Project($this->container); @@ -32,7 +186,7 @@ class NotificationTest extends Base // Nobody is member of any projects $this->assertEmpty($pp->getMembers(1)); - $this->assertEmpty($n->getUsersWithNotification(1)); + $this->assertEmpty($n->getUsersWithNotificationEnabled(1)); // We allow all users to be member of our projects $this->assertTrue($pp->addMember(1, 1)); @@ -41,7 +195,7 @@ class NotificationTest extends Base $this->assertTrue($pp->addMember(1, 4)); $this->assertNotEmpty($pp->getMembers(1)); - $users = $n->getUsersWithNotification(1); + $users = $n->getUsersWithNotificationEnabled(1); $this->assertNotEmpty($users); $this->assertEquals(2, count($users)); @@ -49,16 +203,15 @@ class NotificationTest extends Base $this->assertEquals('user3@here', $users[1]['email']); } - public function testGetUserList() + public function testGetUsersWithNotificationsWhenEverybodyAllowed() { $u = new User($this->container); $p = new Project($this->container); - $pp = new ProjectPermission($this->container); $n = new Notification($this->container); + $pp = new ProjectPermission($this->container); - $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); - $this->assertEquals(2, $p->create(array('name' => 'UnitTest2'))); - $this->assertEquals(3, $p->create(array('name' => 'UnitTest3', 'is_everybody_allowed' => 1))); + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1', 'is_everybody_allowed' => 1))); + $this->assertTrue($pp->isEverybodyAllowed(1)); // Email + Notifications enabled $this->assertNotFalse($u->create(array('username' => 'user1', 'email' => 'user1@here', 'notifications_enabled' => 1))); @@ -72,62 +225,108 @@ class NotificationTest extends Base // No email + notifications disabled $this->assertNotFalse($u->create(array('username' => 'user4'))); - // We allow all users to be member of our projects - $this->assertTrue($pp->addMember(1, 1)); - $this->assertTrue($pp->addMember(1, 2)); - $this->assertTrue($pp->addMember(1, 3)); - $this->assertTrue($pp->addMember(1, 4)); - - $this->assertTrue($pp->addMember(2, 1)); - $this->assertTrue($pp->addMember(2, 2)); - $this->assertTrue($pp->addMember(2, 3)); - $this->assertTrue($pp->addMember(2, 4)); + $users = $n->getUsersWithNotificationEnabled(1); - $users = $n->getUsersList(1); $this->assertNotEmpty($users); $this->assertEquals(2, count($users)); $this->assertEquals('user1@here', $users[0]['email']); $this->assertEquals('user3@here', $users[1]['email']); + } - $users = $n->getUsersList(2); - $this->assertNotEmpty($users); - $this->assertEquals(2, count($users)); - $this->assertEquals('user1@here', $users[0]['email']); - $this->assertEquals('user3@here', $users[1]['email']); + public function testGetMailContent() + { + $n = new Notification($this->container); + $p = new Project($this->container); + $tf = new TaskFinder($this->container); + $tc = new TaskCreation($this->container); + $s = new Subtask($this->container); + $c = new Comment($this->container); + $f = new File($this->container); - // User 3 choose to receive notification only for project 2 - $n->saveSettings(4, array('notifications_enabled' => 1, 'projects' => array(2 => true))); + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1))); + $this->assertEquals(1, $s->create(array('title' => 'test', 'task_id' => 1))); + $this->assertEquals(1, $c->create(array('comment' => 'test', 'task_id' => 1, 'user_id' => 1))); + $this->assertEquals(1, $f->create(1, 'test', 'blah', 123)); - $users = $n->getUsersList(1); - $this->assertNotEmpty($users); - $this->assertEquals(1, count($users)); - $this->assertEquals('user1@here', $users[0]['email']); + $task = $tf->getDetails(1); + $subtask = $s->getById(1, true); + $comment = $c->getById(1); + $file = $c->getById(1); - $users = $n->getUsersList(2); - $this->assertNotEmpty($users); - $this->assertEquals(2, count($users)); - $this->assertEquals('user1@here', $users[0]['email']); - $this->assertEquals('user3@here', $users[1]['email']); + $this->assertNotEmpty($task); + $this->assertNotEmpty($subtask); + $this->assertNotEmpty($comment); + $this->assertNotEmpty($file); - // User 1 excluded - $users = $n->getUsersList(1, array(2)); - $this->assertEmpty($users); + foreach (Subscriber\NotificationSubscriber::getSubscribedEvents() as $event => $values) { + $this->assertNotEmpty($n->getMailContent($event, array('task' => $task, 'comment' => $comment, 'subtask' => $subtask, 'file' => $file, 'changes' => array()))); + } + } - $users = $n->getUsersList(2, array(2)); - $this->assertNotEmpty($users); - $this->assertEquals(1, count($users)); - $this->assertEquals('user3@here', $users[0]['email']); + public function testGetEmailSubject() + { + $n = new Notification($this->container); - // Project #3 allow everybody - $users = $n->getUsersList(3); - $this->assertNotEmpty($users); - $this->assertEquals(1, count($users)); - $this->assertEquals('user1@here', $users[0]['email']); + $this->assertEquals( + '[test][Task opened] blah (#2)', + $n->getMailSubject('task.open', array('task' => array('id' => 2, 'title' => 'blah', 'project_name' => 'test'))) + ); + } - $users = $n->getUsersWithNotification(3); - $this->assertNotEmpty($users); - $this->assertEquals(2, count($users)); - $this->assertEquals('user1@here', $users[0]['email']); - $this->assertEquals('user3@here', $users[1]['email']); + public function testSendNotificationsToCreator() + { + $u = new User($this->container); + $p = new Project($this->container); + $n = new Notification($this->container); + $pp = new ProjectPermission($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $this->assertEquals(2, $u->create(array('username' => 'user1', 'email' => 'user1@here', 'notifications_enabled' => 1))); + $this->assertTrue($pp->addMember(1, 2)); + + $n->sendNotifications('task.open', array('task' => array( + 'id' => 2, 'title' => 'blah', 'project_name' => 'test', 'project_id' => 1, 'owner_id' => 0, 'creator_id' => 2 + ))); + + $this->assertEquals('user1@here', $this->container['emailClient']->email); + $this->assertEquals('user1', $this->container['emailClient']->name); + $this->assertEquals('[test][Task opened] blah (#2)', $this->container['emailClient']->subject); + $this->assertNotEmpty($this->container['emailClient']->html); + } + + public function testSendNotificationsToAnotherAssignee() + { + $u = new User($this->container); + $p = new Project($this->container); + $n = new Notification($this->container); + $pp = new ProjectPermission($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $this->assertEquals(2, $u->create(array('username' => 'user1', 'email' => 'user1@here', 'notifications_enabled' => 1))); + $this->assertTrue($pp->addMember(1, 2)); + + $n->sendNotifications('task.open', array('task' => array( + 'id' => 2, 'title' => 'blah', 'project_name' => 'test', 'project_id' => 1, 'owner_id' => 1, 'creator_id' => 1 + ))); + + $this->assertEmpty($this->container['emailClient']->email); + } + + public function testSendNotificationsToNotMember() + { + $u = new User($this->container); + $p = new Project($this->container); + $n = new Notification($this->container); + $pp = new ProjectPermission($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $this->assertEquals(2, $u->create(array('username' => 'user1', 'email' => 'user1@here', 'notifications_enabled' => 1))); + + $n->sendNotifications('task.open', array('task' => array( + 'id' => 2, 'title' => 'blah', 'project_name' => 'test', 'project_id' => 1, 'owner_id' => 0, 'creator_id' => 2 + ))); + + $this->assertEmpty($this->container['emailClient']->email); } } diff --git a/tests/units/PostmarkWebhookTest.php b/tests/units/PostmarkTest.php index 34be8515..b708217d 100644 --- a/tests/units/PostmarkWebhookTest.php +++ b/tests/units/PostmarkTest.php @@ -2,18 +2,41 @@ require_once __DIR__.'/Base.php'; -use Integration\PostmarkWebhook; +use Integration\Postmark; use Model\TaskCreation; use Model\TaskFinder; use Model\Project; use Model\ProjectPermission; use Model\User; -class PostmarkWebhookTest extends Base +class PostmarkTest extends Base { + public function testSendEmail() + { + $pm = new Postmark($this->container); + $pm->sendEmail('test@localhost', 'Me', 'Test', 'Content', 'Bob'); + + $this->assertEquals('https://api.postmarkapp.com/email', $this->container['httpClient']->getUrl()); + + $data = $this->container['httpClient']->getData(); + + $this->assertArrayHasKey('From', $data); + $this->assertArrayHasKey('To', $data); + $this->assertArrayHasKey('Subject', $data); + $this->assertArrayHasKey('HtmlBody', $data); + + $this->assertEquals('Me <test@localhost>', $data['To']); + $this->assertEquals('Bob <notifications@kanboard.local>', $data['From']); + $this->assertEquals('Test', $data['Subject']); + $this->assertEquals('Content', $data['HtmlBody']); + + $this->assertContains('Accept: application/json', $this->container['httpClient']->getHeaders()); + $this->assertContains('X-Postmark-Server-Token: ', $this->container['httpClient']->getHeaders()); + } + public function testHandlePayload() { - $w = new PostmarkWebhook($this->container); + $w = new Postmark($this->container); $p = new Project($this->container); $pp = new ProjectPermission($this->container); $u = new User($this->container); @@ -26,20 +49,20 @@ class PostmarkWebhookTest extends Base $this->assertEquals(2, $p->create(array('name' => 'test2', 'identifier' => 'TEST1'))); // Empty payload - $this->assertFalse($w->parsePayload(array())); + $this->assertFalse($w->receiveEmail(array())); // Unknown user - $this->assertFalse($w->parsePayload(array('From' => 'a@b.c', 'Subject' => 'Email task', 'MailboxHash' => 'foobar', 'TextBody' => 'boo'))); + $this->assertFalse($w->receiveEmail(array('From' => 'a@b.c', 'Subject' => 'Email task', 'MailboxHash' => 'foobar', 'TextBody' => 'boo'))); // Project not found - $this->assertFalse($w->parsePayload(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test', 'TextBody' => 'boo'))); + $this->assertFalse($w->receiveEmail(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test', 'TextBody' => 'boo'))); // User is not member - $this->assertFalse($w->parsePayload(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => 'boo'))); + $this->assertFalse($w->receiveEmail(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => 'boo'))); $this->assertTrue($pp->addMember(2, 2)); // The task must be created - $this->assertTrue($w->parsePayload(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => 'boo'))); + $this->assertTrue($w->receiveEmail(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => 'boo'))); $task = $tf->getById(1); $this->assertNotEmpty($task); @@ -51,7 +74,7 @@ class PostmarkWebhookTest extends Base public function testHtml2Markdown() { - $w = new PostmarkWebhook($this->container); + $w = new Postmark($this->container); $p = new Project($this->container); $pp = new ProjectPermission($this->container); $u = new User($this->container); @@ -62,7 +85,7 @@ class PostmarkWebhookTest extends Base $this->assertEquals(1, $p->create(array('name' => 'test2', 'identifier' => 'TEST1'))); $this->assertTrue($pp->addMember(1, 2)); - $this->assertTrue($w->parsePayload(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => 'boo', 'HtmlBody' => '<p><strong>boo</strong></p>'))); + $this->assertTrue($w->receiveEmail(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => 'boo', 'HtmlBody' => '<p><strong>boo</strong></p>'))); $task = $tf->getById(1); $this->assertNotEmpty($task); @@ -71,7 +94,7 @@ class PostmarkWebhookTest extends Base $this->assertEquals('**boo**', $task['description']); $this->assertEquals(2, $task['creator_id']); - $this->assertTrue($w->parsePayload(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => '**boo**', 'HtmlBody' => ''))); + $this->assertTrue($w->receiveEmail(array('From' => 'me@localhost', 'Subject' => 'Email task', 'MailboxHash' => 'test1', 'TextBody' => '**boo**', 'HtmlBody' => ''))); $task = $tf->getById(2); $this->assertNotEmpty($task); diff --git a/tests/units/SendgridWebhookTest.php b/tests/units/SendgridTest.php index 3b30d212..1814c761 100644 --- a/tests/units/SendgridWebhookTest.php +++ b/tests/units/SendgridTest.php @@ -2,18 +2,46 @@ require_once __DIR__.'/Base.php'; -use Integration\SendgridWebhook; +use Integration\Sendgrid; use Model\TaskCreation; use Model\TaskFinder; use Model\Project; use Model\ProjectPermission; use Model\User; -class SendgridWebhookTest extends Base +class SendgridTest extends Base { + public function testSendEmail() + { + $pm = new Sendgrid($this->container); + $pm->sendEmail('test@localhost', 'Me', 'Test', 'Content', 'Bob'); + + $this->assertEquals('https://api.sendgrid.com/api/mail.send.json', $this->container['httpClient']->getUrl()); + + $data = $this->container['httpClient']->getData(); + + $this->assertArrayHasKey('api_user', $data); + $this->assertArrayHasKey('api_key', $data); + $this->assertArrayHasKey('from', $data); + $this->assertArrayHasKey('fromname', $data); + $this->assertArrayHasKey('to', $data); + $this->assertArrayHasKey('toname', $data); + $this->assertArrayHasKey('subject', $data); + $this->assertArrayHasKey('html', $data); + + $this->assertEquals('test@localhost', $data['to']); + $this->assertEquals('Me', $data['toname']); + $this->assertEquals('notifications@kanboard.local', $data['from']); + $this->assertEquals('Bob', $data['fromname']); + $this->assertEquals('Test', $data['subject']); + $this->assertEquals('Content', $data['html']); + $this->assertEquals('', $data['api_key']); + $this->assertEquals('', $data['api_user']); + } + public function testHandlePayload() { - $w = new SendgridWebhook($this->container); + $w = new Sendgrid($this->container); $p = new Project($this->container); $pp = new ProjectPermission($this->container); $u = new User($this->container); @@ -26,22 +54,22 @@ class SendgridWebhookTest extends Base $this->assertEquals(2, $p->create(array('name' => 'test2', 'identifier' => 'TEST1'))); // Empty payload - $this->assertFalse($w->parsePayload(array())); + $this->assertFalse($w->receiveEmail(array())); // Unknown user - $this->assertFalse($w->parsePayload(array( + $this->assertFalse($w->receiveEmail(array( 'envelope' => '{"to":["a@b.c"],"from":"a.b.c"}', 'subject' => 'Email task' ))); // Project not found - $this->assertFalse($w->parsePayload(array( + $this->assertFalse($w->receiveEmail(array( 'envelope' => '{"to":["a@b.c"],"from":"me@localhost"}', 'subject' => 'Email task' ))); // User is not member - $this->assertFalse($w->parsePayload(array( + $this->assertFalse($w->receiveEmail(array( 'envelope' => '{"to":["something+test1@localhost"],"from":"me@localhost"}', 'subject' => 'Email task' ))); @@ -49,7 +77,7 @@ class SendgridWebhookTest extends Base $this->assertTrue($pp->addMember(2, 2)); // The task must be created - $this->assertTrue($w->parsePayload(array( + $this->assertTrue($w->receiveEmail(array( 'envelope' => '{"to":["something+test1@localhost"],"from":"me@localhost"}', 'subject' => 'Email task' ))); @@ -62,7 +90,7 @@ class SendgridWebhookTest extends Base $this->assertEquals(2, $task['creator_id']); // Html content - $this->assertTrue($w->parsePayload(array( + $this->assertTrue($w->receiveEmail(array( 'envelope' => '{"to":["something+test1@localhost"],"from":"me@localhost"}', 'subject' => 'Email task', 'html' => '<strong>bold</strong> text', @@ -76,7 +104,7 @@ class SendgridWebhookTest extends Base $this->assertEquals(2, $task['creator_id']); // Text content - $this->assertTrue($w->parsePayload(array( + $this->assertTrue($w->receiveEmail(array( 'envelope' => '{"to":["something+test1@localhost"],"from":"me@localhost"}', 'subject' => 'Email task', 'text' => '**bold** text', @@ -90,7 +118,7 @@ class SendgridWebhookTest extends Base $this->assertEquals(2, $task['creator_id']); // Text + html content - $this->assertTrue($w->parsePayload(array( + $this->assertTrue($w->receiveEmail(array( 'envelope' => '{"to":["something+test1@localhost"],"from":"me@localhost"}', 'subject' => 'Email task', 'html' => '<strong>bold</strong> html', diff --git a/tests/units/TaskDuplicationTest.php b/tests/units/TaskDuplicationTest.php index f991efd6..cd791312 100644 --- a/tests/units/TaskDuplicationTest.php +++ b/tests/units/TaskDuplicationTest.php @@ -548,7 +548,7 @@ class TaskDuplicationTest extends Base $this->assertNotEmpty($task); $this->assertEquals(Task::RECURRING_STATUS_PROCESSED, $task['recurrence_status']); $this->assertEquals(2, $task['recurrence_child']); - $this->assertEquals(1436561776, $task['date_due']); + $this->assertEquals(1436561776, $task['date_due'], '', 2); $task = $tf->getById(2); $this->assertNotEmpty($task); @@ -558,6 +558,6 @@ class TaskDuplicationTest extends Base $this->assertEquals(Task::RECURRING_BASEDATE_TRIGGERDATE, $task['recurrence_basedate']); $this->assertEquals(1, $task['recurrence_parent']); $this->assertEquals(2, $task['recurrence_factor']); - $this->assertEquals(strtotime('+2 days'), $task['date_due']); + $this->assertEquals(strtotime('+2 days'), $task['date_due'], '', 2); } } diff --git a/tests/units/TaskMovedDateSubscriberTest.php b/tests/units/TaskMovedDateSubscriberTest.php new file mode 100644 index 00000000..e0364918 --- /dev/null +++ b/tests/units/TaskMovedDateSubscriberTest.php @@ -0,0 +1,77 @@ +<?php + +require_once __DIR__.'/Base.php'; + +use Model\TaskPosition; +use Model\TaskCreation; +use Model\TaskFinder; +use Model\Project; +use Model\Swimlane; +use Subscriber\TaskMovedDateSubscriber; +use Symfony\Component\EventDispatcher\EventDispatcher; + +class TaskMovedDateSubscriberTest extends Base +{ + public function testMoveTaskAnotherColumn() + { + $tp = new TaskPosition($this->container); + $tc = new TaskCreation($this->container); + $p = new Project($this->container); + $tf = new TaskFinder($this->container); + + $this->container['dispatcher'] = new EventDispatcher; + $this->container['dispatcher']->addSubscriber(new TaskMovedDateSubscriber($this->container)); + + $now = time(); + + $this->assertEquals(1, $p->create(array('name' => 'Project #1'))); + $this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1))); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEquals($now, $task['date_moved'], '', 1); + + sleep(1); + + $this->assertTrue($tp->movePosition(1, 1, 2, 1)); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertNotEquals($now, $task['date_moved']); + } + + public function testMoveTaskAnotherSwimlane() + { + $tp = new TaskPosition($this->container); + $tc = new TaskCreation($this->container); + $p = new Project($this->container); + $tf = new TaskFinder($this->container); + $s = new Swimlane($this->container); + + $this->container['dispatcher'] = new EventDispatcher; + $this->container['dispatcher']->addSubscriber(new TaskMovedDateSubscriber($this->container)); + + $now = time(); + + $this->assertEquals(1, $p->create(array('name' => 'Project #1'))); + $this->assertEquals(1, $s->create(1, 'S1')); + $this->assertEquals(2, $s->create(1, 'S2')); + $this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1))); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEquals($now, $task['date_moved'], '', 1); + $this->assertEquals(1, $task['column_id']); + $this->assertEquals(0, $task['swimlane_id']); + + sleep(1); + + $this->assertTrue($tp->movePosition(1, 1, 2, 1, 2)); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertNotEquals($now, $task['date_moved']); + $this->assertEquals(2, $task['column_id']); + $this->assertEquals(2, $task['swimlane_id']); + } +} diff --git a/tests/units/TextHelperTest.php b/tests/units/TextHelperTest.php index 20b89fa8..95c83e57 100644 --- a/tests/units/TextHelperTest.php +++ b/tests/units/TextHelperTest.php @@ -39,14 +39,6 @@ class TextHelperTest extends Base $this->assertEquals('33.71k', $h->bytes(34520)); } - public function testTruncate() - { - $h = new Text($this->container); - - $this->assertEquals('abc', $h->truncate('abc')); - $this->assertEquals(str_repeat('a', 85).' [...]', $h->truncate(str_repeat('a', 200))); - } - public function testContains() { $h = new Text($this->container); |