Skip to content

Commit

Permalink
Add notification on task assigned (#60)
Browse files Browse the repository at this point in the history
* Add notification on task assigned

* fix test

* rename service provider
  • Loading branch information
mako321 authored Feb 23, 2023
1 parent 39ebd44 commit ef6db40
Show file tree
Hide file tree
Showing 8 changed files with 176 additions and 1 deletion.
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"escolalms/webinar": "^0",
"escolalms/youtube": "^0",
"escolalms/csv-users": "^0.1.0",
"escolalms/tasks": "^0",
"escolalms/assign-without-account": "^0",
"orchestra/testbench": "^5.0|^6.0",
"phpunit/phpunit": "^9.0"
Expand Down
6 changes: 6 additions & 0 deletions src/EscolaLmsTemplatesEmailServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use EscolaLms\Consultations\EscolaLmsConsultationsServiceProvider;
use EscolaLms\CourseAccess\EscolaLmsCourseAccessServiceProvider;
use EscolaLms\Settings\Facades\AdministrableConfig;
use EscolaLms\Tasks\EscolaLmsTasksServiceProvider;
use EscolaLms\Templates\EscolaLmsTemplatesServiceProvider;
use EscolaLms\Templates\Repository\Contracts\TemplateRepositoryContract;
use EscolaLms\TemplatesEmail\Core\EmailChannel;
Expand All @@ -21,6 +22,7 @@
use EscolaLms\TemplatesEmail\Providers\CourseAccessTemplatesServiceProvider;
use EscolaLms\TemplatesEmail\Providers\CourseTemplatesServiceProvider;
use EscolaLms\TemplatesEmail\Providers\CsvUsersTemplatesServiceProvider;
use EscolaLms\TemplatesEmail\Providers\TaskTemplatesServiceProvider;
use EscolaLms\TemplatesEmail\Providers\TemplateServiceProvider;
use EscolaLms\TemplatesEmail\Providers\WebinarTemplatesServiceProvider;
use EscolaLms\TemplatesEmail\Providers\YoutubeTemplatesServiceProvider;
Expand Down Expand Up @@ -85,6 +87,10 @@ class_exists(EscolaLmsTemplatesServiceProvider::class) &&
$this->app->register(CourseAccessTemplatesServiceProvider::class);
}

if (class_exists(EscolaLmsTasksServiceProvider::class)) {
$this->app->register(TaskTemplatesServiceProvider::class);
}

$this->app->register(TemplateServiceProvider::class);

$this->loadViewsFrom(__DIR__.'/../resources/views', 'templates-email');
Expand Down
21 changes: 21 additions & 0 deletions src/Providers/TaskTemplatesServiceProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace EscolaLms\TemplatesEmail\Providers;

use EscolaLms\Tasks\Events\TaskAssignedEvent;
use EscolaLms\Templates\Facades\Template;
use EscolaLms\TemplatesEmail\Core\EmailChannel;
use EscolaLms\TemplatesEmail\Tasks\TaskAssignedVariables;
use Illuminate\Support\ServiceProvider;

class TaskTemplatesServiceProvider extends ServiceProvider
{
public function boot(): void
{
Template::register(
TaskAssignedEvent::class,
EmailChannel::class,
TaskAssignedVariables::class
);
}
}
59 changes: 59 additions & 0 deletions src/Tasks/CommonTasksVariables.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace EscolaLms\TemplatesEmail\Tasks;

use EscolaLms\Core\Models\User;
use EscolaLms\Tasks\Models\Task;
use EscolaLms\Templates\Events\EventWrapper;
use EscolaLms\TemplatesEmail\Core\EmailVariables;

abstract class CommonTasksVariables extends EmailVariables
{
const VAR_USER_NAME = '@VarUserName';
const VAR_ASSIGNEE_NAME = '@VarAssigneeName';
const VAR_CREATOR_NAME = '@VarCreatorName';
const VAR_TASK_TITLE = '@VarTaskTitle';

public static function mockedVariables(?User $user = null): array
{
$faker = \Faker\Factory::create();
return array_merge(parent::mockedVariables(), [
self::VAR_USER_NAME => $faker->name(),
self::VAR_ASSIGNEE_NAME => $faker->name(),
self::VAR_CREATOR_NAME => $faker->name(),
self::VAR_TASK_TITLE => $faker->word(),
]);
}

public static function variablesFromEvent(EventWrapper $event): array
{
return array_merge(parent::variablesFromEvent($event), [
self::VAR_USER_NAME => $event->getUser()->name,
self::VAR_ASSIGNEE_NAME => $event->getTask()->user->name,
self::VAR_CREATOR_NAME => $event->getTask()->createdBy->name,
self::VAR_TASK_TITLE => $event->getTask()->title,
]);
}

public static function requiredVariables(): array
{
return [
self::VAR_TASK_TITLE,
];
}

public static function requiredVariablesInSection(string $sectionKey): array
{
if ($sectionKey === 'content') {
[
self::VAR_TASK_TITLE,
];
}
return [];
}

public static function assignableClass(): ?string
{
return Task::class;
}
}
20 changes: 20 additions & 0 deletions src/Tasks/TaskAssignedVariables.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace EscolaLms\TemplatesEmail\Tasks;

class TaskAssignedVariables extends CommonTasksVariables
{
public static function defaultSectionsContent(): array
{
return [
'title' => __('Task ":task" assigned', [
'task' => self::VAR_TASK_TITLE,
]),
'content' => self::wrapWithMjml(__('<h1>Hello :user_name!</h1><p>":task" task has been assigned to you by :creator</p>', [
'user_name' => self::VAR_USER_NAME,
'task' => self::VAR_TASK_TITLE,
'creator_name' => self::VAR_CREATOR_NAME,
])),
];
}
}
2 changes: 1 addition & 1 deletion tests/Api/CourseAccessEnquiryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public function setUp(): void
$this->seed(CourseAccessPermissionSeeder::class);
}

public function testAdminNotificationOnCourseEnquiryCreatedTest(): void
public function testAdminNotificationOnCourseEnquiryCreated(): void
{
Notification::fake();
Event::fake();
Expand Down
64 changes: 64 additions & 0 deletions tests/Api/TaskTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

namespace EscolaLms\TemplatesEmail\Tests\Api;

use EscolaLms\Tasks\Database\Seeders\TaskPermissionSeeder;
use EscolaLms\Tasks\Events\TaskAssignedEvent;
use EscolaLms\Tasks\Models\Task;
use EscolaLms\Tasks\Tests\CreatesUsers;
use EscolaLms\Templates\Listeners\TemplateEventListener;
use EscolaLms\TemplatesEmail\Core\EmailMailable;
use EscolaLms\TemplatesEmail\Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Notification;

class TaskTest extends TestCase
{
use CreatesUsers, DatabaseTransactions, WithFaker;

public function setUp(): void
{
parent::setUp();

if (!class_exists(\EscolaLms\Tasks\EscolaLmsTasksServiceProvider::class)) {
$this->markTestSkipped('Task package not installed');
}

$this->seed(TaskPermissionSeeder::class);
Notification::fake();
Mail::fake();
}

public function testNotificationOnTaskAssignment(): void
{
Event::fake([TaskAssignedEvent::class]);

$admin = $this->makeAdmin();
$student = $this->makeStudent();

$this->actingAs($admin, 'api')
->postJson('api/admin/tasks', [
'title' => $this->faker->title,
'user_id' => $student->getKey(),
])
->assertCreated();

Event::assertDispatched(function (TaskAssignedEvent $event) use ($student) {
$this->assertEquals($student->getKey(), $event->getUser()->getKey());
return true;
});

$task = Task::latest()->first();
$listener = app(TemplateEventListener::class);
$listener->handle(new TaskAssignedEvent($task->user, $task));

Mail::assertSent(EmailMailable::class, function (EmailMailable $mailable) use ($student, $task) {
$this->assertEquals(__('Task ":task" assigned', ['task' => $task->title]), $mailable->subject);
$this->assertTrue($mailable->hasTo($student->email));
return true;
});
}
}
4 changes: 4 additions & 0 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use EscolaLms\CsvUsers\EscolaLmsCsvUsersServiceProvider;
use EscolaLms\Scorm\EscolaLmsScormServiceProvider;
use EscolaLms\Settings\EscolaLmsSettingsServiceProvider;
use EscolaLms\Tasks\EscolaLmsTasksServiceProvider;
use EscolaLms\Templates\EscolaLmsTemplatesServiceProvider;
use EscolaLms\TemplatesEmail\Database\Seeders\TemplatesEmailSeeder;
use EscolaLms\TemplatesEmail\EscolaLmsTemplatesEmailServiceProvider;
Expand Down Expand Up @@ -84,6 +85,9 @@ protected function getPackageProviders($app)
if (class_exists(\EscolaLms\Cart\EscolaLmsCartServiceProvider::class)) {
$providers[] = EscolaLmsCartServiceProvider::class;
}
if (class_exists(\EscolaLms\Tasks\EscolaLmsTasksServiceProvider::class)) {
$providers[] = EscolaLmsTasksServiceProvider::class;
}
return $providers;
}

Expand Down

0 comments on commit ef6db40

Please sign in to comment.