Skip to content

Commit

Permalink
Merge pull request #184 from alimranahmed/183-better-code-coverage
Browse files Browse the repository at this point in the history
183 better code coverage
  • Loading branch information
alimranahmed authored Aug 1, 2024
2 parents 81f6a32 + 0e6088c commit 3e88dce
Show file tree
Hide file tree
Showing 15 changed files with 403 additions and 17 deletions.
8 changes: 4 additions & 4 deletions app/Livewire/Backend/Article/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,16 @@ class Form extends Component
'articleData.meta.image_url' => 'nullable|url',
];

public function mount(?Article $article = null): void
public function mount($article = null): void
{
if ($article->id) {
if ($article?->id) {
$this->originalArticle = $article;
$this->articleData = $article->toArray();
$this->articleData['keywords'] = $article->keywords->pluck('name')->implode(' ');
$this->articleData['meta'] = $article->meta ?: [];
}

$this->method = $article->id ? 'put' : 'post';
$this->method = $article?->id ? 'put' : 'post';
}

public function render(): View
Expand Down Expand Up @@ -75,7 +75,7 @@ protected function store(array $articleData): void
$newArticle = Article::query()->create($articleData);

//add keywords
$keywordsToAttach = array_unique(explode(' ', Arr::get($this->article, 'keywords')));
$keywordsToAttach = array_unique(explode(' ', Arr::get($this->articleData, 'keywords')));

foreach ($keywordsToAttach as $keywordToAttach) {
if (empty($keywordToAttach)) {
Expand Down
2 changes: 1 addition & 1 deletion app/Livewire/Backend/Config/Index.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ public function update(): void
Config::query()->findOrFail($this->editingConfig['id'])
->update(Arr::get($data, 'editingConfig'));

$this->reset(['editingConfig', 'editingConfigId']);
$this->reset(['editingConfig']);
}
}
2 changes: 2 additions & 0 deletions app/Models/Feedback.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Feedback extends Model
{
use CanFormatDates;
use HasFactory;

protected $table = 'feedbacks';

Expand Down
3 changes: 2 additions & 1 deletion database/factories/ArticleFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Database\Factories;

use App\Models\Article;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

Expand All @@ -26,7 +27,7 @@ public function definition(): array
'user_id' => null,
'language' => $language = $this->faker->randomElement(['ben', 'eng']),
'slug' => Str::slug($heading, '-', $language),
'category_id' => null,
'category_id' => Category::factory()->create()->id,
];
}

Expand Down
29 changes: 29 additions & 0 deletions database/factories/FeedbackFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Database\Factories;

use App\Models\Feedback;
use Illuminate\Database\Eloquent\Factories\Factory;

/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Feedback>
*/
class FeedbackFactory extends Factory
{

protected $model = Feedback::class;

/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'content' => $this->faker->text(),
];
}
}
2 changes: 1 addition & 1 deletion tests/Feature/Controllers/ArticleControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public function testShowById()

$this->get("article/{$article->id}/{$article->heading}")->assertOk();

$this->get('article/'.Str::random()."/{$article->heading}")
$this->get('article/'.Str::random().time()."/{$article->heading}")
->assertRedirectToRoute('home');
}

Expand Down
45 changes: 38 additions & 7 deletions tests/Feature/Controllers/CommentControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

namespace Tests\Feature\Controllers;

use App\Mail\NotifyCommentThread;
use App\Models\Article;
use App\Models\Category;
use App\Models\Comment;
use App\Models\Reader;
use App\Models\User;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Spatie\Permission\Models\Role;
use Tests\TestCase;
Expand All @@ -27,6 +30,12 @@ public function setUp(): void
$this->user = User::factory()
->create(['name' => 'Example User', 'email' => 'example@test.com']);

Reader::query()->create([
'user_id' => $this->user->id,
'is_verified' => false,
'notify' => true,
]);

$this->category = Category::factory()->create();

$this->article = Article::factory()->published()->create([
Expand All @@ -38,23 +47,39 @@ public function setUp(): void

public function testConfirmComment()
{
$parentComment = Comment::factory()->create([
'user_id' => $this->user->id,
'article_id' => $this->article->id,
]);

$comment = Comment::factory()
->create([
'user_id' => $this->user->id,
'article_id' => $this->article->id,
'is_published' => 0,
'is_confirmed' => 0,
'token' => 'test-token',
'parent_comment_id' => $parentComment->id,
]);

Mail::fake();

$this->get("comment/{$comment->id}/confirm/?token={$comment->token}")
->assertRedirect(route('get-article', [$comment->article->id]))
->assertSessionHas('successMsg');

$comment = Comment::query()->find($comment->id);
$this->assertDatabaseHas('comments', [
'id' => $comment->id,
'is_published' => 1,
'is_confirmed' => 1,
]);

$this->assertDatabaseHas('readers', [
'user_id' => $this->user->id,
'is_verified' => 1,
]);

$this->assertEquals(1, $comment->is_published);
$this->assertEquals(1, $comment->is_confirmed);
Mail::assertQueued(NotifyCommentThread::class);
}

public function testConfirmCommentFailsWithInvalidToken()
Expand All @@ -72,8 +97,11 @@ public function testConfirmCommentFailsWithInvalidToken()
->assertRedirectToRoute('home')
->assertSessionHas('errorMsg');

$this->assertEquals(0, $comment->is_published);
$this->assertEquals(0, $comment->is_confirmed);
$this->assertDatabaseHas('comments', [
'id' => $comment->id,
'is_published' => 0,
'is_confirmed' => 0,
]);
}

public function testConfirmCommentFailsWithAlreadyPublishedComment()
Expand All @@ -91,7 +119,10 @@ public function testConfirmCommentFailsWithAlreadyPublishedComment()
->assertRedirectToRoute('get-article', [$comment->article->id])
->assertSessionHas('warningMsg');

$this->assertEquals(1, $comment->is_published);
$this->assertEquals(1, $comment->is_confirmed);
$this->assertDatabaseHas('comments', [
'id' => $comment->id,
'is_published' => 1,
'is_confirmed' => 1,
]);
}
}
16 changes: 16 additions & 0 deletions tests/Feature/Controllers/HomeControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use App\Models\User;
use Exception;
use Illuminate\Validation\ValidationException;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

class HomeControllerTest extends TestCase
Expand Down Expand Up @@ -46,6 +47,21 @@ public function testHomePage()
->assertSee(Config::get('site_title'));
}

public function testAdminDashboard()
{
Category::factory()->create();
$admin = Role::findOrCreate('admin');
$user = User::factory()->create();
$user->assignRole($admin);

$this->actingAs($user)
->get('/')
->assertViewIs('backend.dashboard')
->assertViewHas('categories')
->assertViewHas('latestComments')
->assertViewHas('latestFeedbacks');
}

public function testGetMessage()
{
$controller = new HomeController();
Expand Down
135 changes: 135 additions & 0 deletions tests/Feature/Livewire/Backend/Article/FormTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
<?php

namespace Tests\Feature\Livewire\Backend\Article;

use App\Livewire\Backend\Article\Form;
use App\Livewire\Backend\Config\Index;
use App\Mail\NotifySubscriberForNewArticle;
use App\Models\Article;
use App\Models\Category;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Livewire\Livewire;
use Symfony\Component\HttpFoundation\Response;
use Tests\TestCase;

class FormTest extends TestCase
{

public function testRender(): void
{
Livewire::test(Form::class)
->assertStatus(Response::HTTP_OK)
->assertViewIs('livewire.backend.article.form')
->assertViewHas('categories');
}

public function test_initializes_correctly_without_article()
{
Livewire::test(Form::class)
->assertSet('method', 'post')
->assertSet('articleData', []);
}

public function test_initializes_correctly_with_article()
{
$article = Article::factory()->create();
Livewire::test(Form::class, ['article' => $article])
->assertSet('method', 'put')
->assertSet('articleData.heading', $article->heading)
->assertSet('articleData.slug', $article->slug)
->assertSet('articleData.category_id', $article->category_id);
}

public function test_generates_slug_when_heading_changes()
{
Livewire::test(Form::class)
->set('articleData.heading', 'New Article')
->set('articleData.language', 'en')
->assertSet('articleData.slug', Str::slug('New Article'));
}

public function test_validates_article_data_correctly()
{
Livewire::test(Form::class)
->set('articleData.heading', '')
->set('articleData.slug', '')
->set('articleData.category_id', null)
->set('articleData.content', '')
->set('articleData.language', '')
->call('submit')
->assertHasErrors([
'articleData.heading' => 'required',
'articleData.slug' => 'required',
'articleData.category_id' => 'required',
'articleData.content' => 'required',
'articleData.language' => 'required',
]);
}

public function test_stores_a_new_article_correctly()
{
Mail::fake();
Auth::loginUsingId(User::factory()->create()->id);

$category = Category::factory()->create();
$data = [
'heading' => 'Test Article',
'slug' => 'test-article',
'category_id' => $category->id,
'content' => 'This is a test article.',
'language' => 'en',
'is_comment_enabled' => true,
'meta' => [
'description' => 'Test description',
'image_url' => 'http://example.com/image.jpg',
],
'keywords' => 'test article',
];

Livewire::test(Form::class, ['article' => null])
->set('articleData', $data)
->call('submit')
->assertSessionHas('success', 'Article published successfully!');

$this->assertDatabaseHas('articles', ['heading' => 'Test Article']);
$this->assertDatabaseHas('keywords', ['name' => 'test']);
$this->assertDatabaseHas('keywords', ['name' => 'article']);
Mail::assertQueued(NotifySubscriberForNewArticle::class);
}

public function test_updates_an_existing_article_correctly()
{
Mail::fake();
Auth::loginUsingId(User::factory()->create()->id);

$article = Article::factory()->create();
$data = [
'heading' => 'Updated Article',
'slug' => 'updated-article',
'category_id' => $article->category_id,
'content' => 'This is an updated article.',
'language' => 'en',
'is_comment_enabled' => true,
'meta' => [
'description' => 'Updated description',
'image_url' => 'http://example.com/updated-image.jpg',
],
'keywords' => 'updated article',
];

Livewire::test(Form::class, ['article' => $article])
->set('articleData', $data)
->call('submit')
->assertSessionHas('successMsg', 'Article updated successfully!');

$this->assertDatabaseHas('articles', [
'id' => $article->id,
'heading' => 'Updated Article'
]);
$this->assertDatabaseHas('keywords', ['name' => 'updated']);
$this->assertDatabaseHas('keywords', ['name' => 'article']);
}
}
Loading

0 comments on commit 3e88dce

Please sign in to comment.