seedRolesAndPermissions(); $this->admin = $this->createAdmin(); } /** * Test issue assigned email */ public function test_issue_assigned_email(): void { $assignee = User::factory()->create(['email' => 'assignee@test.com']); $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'assignee_id' => null, ]); $this->actingAs($this->admin)->post( route('admin.issues.assign', $issue), ['assignee_id' => $assignee->id] ); $issue->refresh(); $this->assertEquals($assignee->id, $issue->assignee_id); } /** * Test issue status changed email */ public function test_issue_status_changed_email(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'status' => Issue::STATUS_NEW, ]); $this->actingAs($this->admin)->patch( route('admin.issues.status', $issue), ['status' => Issue::STATUS_IN_PROGRESS] ); $issue->refresh(); $this->assertEquals(Issue::STATUS_IN_PROGRESS, $issue->status); } /** * Test issue commented email */ public function test_issue_commented_email(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, ]); $this->actingAs($this->admin)->post( route('admin.issues.comments.store', $issue), ['content' => 'This is a test comment'] ); $this->assertDatabaseHas('issue_comments', [ 'issue_id' => $issue->id, 'content' => 'This is a test comment', ]); } /** * Test issue due soon email */ public function test_issue_due_soon_email(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'due_date' => now()->addDays(2), 'status' => Issue::STATUS_IN_PROGRESS, ]); // Issue is due soon (within 3 days) $this->assertTrue($issue->due_date->diffInDays(now()) <= 3); } /** * Test issue overdue email */ public function test_issue_overdue_email(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'due_date' => now()->subDay(), 'status' => Issue::STATUS_IN_PROGRESS, ]); $this->assertTrue($issue->isOverdue()); } /** * Test issue closed email */ public function test_issue_closed_email(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'status' => Issue::STATUS_REVIEW, ]); $this->actingAs($this->admin)->patch( route('admin.issues.status', $issue), ['status' => Issue::STATUS_CLOSED] ); $issue->refresh(); $this->assertEquals(Issue::STATUS_CLOSED, $issue->status); } /** * Test email sent to watchers */ public function test_email_sent_to_watchers(): void { $watcher = User::factory()->create(['email' => 'watcher@test.com']); $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, ]); $this->actingAs($this->admin)->post( route('admin.issues.watchers.store', $issue), ['user_id' => $watcher->id] ); // Watcher should be added $this->assertTrue($issue->watchers->contains($watcher)); } /** * Test email contains issue link */ public function test_email_contains_issue_link(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, ]); $issueUrl = route('admin.issues.show', $issue); $this->assertStringContainsString('/admin/issues/', $issueUrl); } /** * Test email contains issue details */ public function test_email_contains_issue_details(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'title' => 'Important Task', 'description' => 'This needs to be done urgently', 'priority' => Issue::PRIORITY_HIGH, ]); $this->assertEquals('Important Task', $issue->title); $this->assertEquals('This needs to be done urgently', $issue->description); $this->assertEquals(Issue::PRIORITY_HIGH, $issue->priority); } /** * Test email formatting is correct */ public function test_email_formatting_is_correct(): void { $issue = Issue::factory()->create([ 'created_by_user_id' => $this->admin->id, 'title' => 'Test Issue', ]); // Verify issue number is properly formatted $this->assertMatchesRegularExpression('/ISS-\d{4}-\d+/', $issue->issue_number); } }