fedi-feed-router/backend/tests/Unit/Services/ValidationServiceTest.php
2025-08-11 18:26:00 +02:00

145 lines
4.9 KiB
PHP

<?php
namespace Tests\Unit\Services;
use App\Services\Article\ValidationService;
use App\Models\Article;
use App\Models\Feed;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Http;
class ValidationServiceTest extends TestCase
{
use RefreshDatabase;
public function test_validate_returns_article_with_validation_status(): void
{
// Mock HTTP requests
Http::fake([
'https://example.com/article' => Http::response('<html><body>Test content with Belgium news</body></html>', 200)
]);
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'approval_status' => 'pending'
]);
$result = ValidationService::validate($article);
$this->assertInstanceOf(Article::class, $result);
$this->assertContains($result->approval_status, ['pending', 'approved', 'rejected']);
}
public function test_validate_marks_article_invalid_when_missing_data(): void
{
// Mock HTTP requests to return HTML without article content
Http::fake([
'https://invalid-url-without-parser.com/article' => Http::response('<html><body>Empty</body></html>', 200)
]);
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://invalid-url-without-parser.com/article',
'approval_status' => 'pending'
]);
$result = ValidationService::validate($article);
$this->assertEquals('rejected', $result->approval_status);
}
public function test_validate_with_supported_article_content(): void
{
// Mock HTTP requests
Http::fake([
'https://example.com/article' => Http::response('<html><body>Article content</body></html>', 200)
]);
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'approval_status' => 'pending'
]);
$result = ValidationService::validate($article);
// Since we can't fetch real content in tests, it should be marked rejected
$this->assertEquals('rejected', $result->approval_status);
}
public function test_validate_updates_article_in_database(): void
{
// Mock HTTP requests
Http::fake([
'https://example.com/article' => Http::response('<html><body>Article content</body></html>', 200)
]);
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'approval_status' => 'pending'
]);
$originalId = $article->id;
ValidationService::validate($article);
// Check that the article was updated in the database
$updatedArticle = Article::find($originalId);
$this->assertContains($updatedArticle->approval_status, ['pending', 'approved', 'rejected']);
}
public function test_validate_handles_article_with_existing_validation(): void
{
// Mock HTTP requests
Http::fake([
'https://example.com/article' => Http::response('<html><body>Article content</body></html>', 200)
]);
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'approval_status' => 'approved'
]);
$originalApprovalStatus = $article->approval_status;
$result = ValidationService::validate($article);
// Should re-validate - status may change based on content validation
$this->assertContains($result->approval_status, ['pending', 'approved', 'rejected']);
}
public function test_validate_keyword_checking_logic(): void
{
// Mock HTTP requests with content that contains Belgian keywords
Http::fake([
'https://example.com/article-about-bart-de-wever' => Http::response(
'<html><body><article>Article about Bart De Wever and Belgian politics</article></body></html>',
200
)
]);
$feed = Feed::factory()->create();
// Create an article that would match the validation keywords if content was available
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article-about-bart-de-wever',
'approval_status' => 'pending'
]);
$result = ValidationService::validate($article);
// The service looks for keywords in the full_article content
// Since we can't fetch real content, it will be marked rejected
$this->assertEquals('rejected', $result->approval_status);
}
}