fedi-feed-router/backend/tests/Unit/Services/ValidationServiceTest.php

130 lines
4.1 KiB
PHP
Raw Normal View History

2025-08-02 03:48:06 +02:00
<?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;
2025-08-07 21:19:19 +02:00
use Illuminate\Support\Facades\Http;
2025-08-02 03:48:06 +02:00
class ValidationServiceTest extends TestCase
{
use RefreshDatabase;
2025-08-07 21:19:19 +02:00
protected function setUp(): void
{
parent::setUp();
Http::fake([
'*' => Http::response('', 200)
]);
}
2025-08-02 03:48:06 +02:00
public function test_validate_returns_article_with_validation_status(): void
{
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'is_valid' => null,
'validated_at' => null
]);
$result = ValidationService::validate($article);
$this->assertInstanceOf(Article::class, $result);
$this->assertNotNull($result->validated_at);
$this->assertIsBool($result->is_valid);
}
public function test_validate_marks_article_invalid_when_missing_data(): void
{
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://invalid-url-without-parser.com/article',
'is_valid' => null,
'validated_at' => null
]);
$result = ValidationService::validate($article);
$this->assertFalse($result->is_valid);
$this->assertNotNull($result->validated_at);
}
public function test_validate_with_supported_article_content(): void
{
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'is_valid' => null,
'validated_at' => null
]);
$result = ValidationService::validate($article);
// Since we can't fetch real content in tests, it should be marked invalid
$this->assertFalse($result->is_valid);
$this->assertNotNull($result->validated_at);
}
public function test_validate_updates_article_in_database(): void
{
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'is_valid' => null,
'validated_at' => null
]);
$originalId = $article->id;
ValidationService::validate($article);
// Check that the article was updated in the database
$updatedArticle = Article::find($originalId);
$this->assertNotNull($updatedArticle->validated_at);
$this->assertNotNull($updatedArticle->is_valid);
}
public function test_validate_handles_article_with_existing_validation(): void
{
$feed = Feed::factory()->create();
$article = Article::factory()->create([
'feed_id' => $feed->id,
'url' => 'https://example.com/article',
'is_valid' => true,
'validated_at' => now()->subHour()
]);
$originalValidatedAt = $article->validated_at;
$result = ValidationService::validate($article);
// Should re-validate and update timestamp
$this->assertNotEquals($originalValidatedAt, $result->validated_at);
}
public function test_validate_keyword_checking_logic(): void
{
$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',
'is_valid' => null,
'validated_at' => null
]);
$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 invalid
$this->assertFalse($result->is_valid);
}
}