189 lines
6.7 KiB
PHP
189 lines
6.7 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit\Requests;
|
|
|
|
use Domains\Feed\Models\Feed;
|
|
use Domains\Feed\Requests\StoreRouteRequest;
|
|
use Domains\Platform\Models\PlatformChannel;
|
|
use Domains\Settings\Models\Language;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Tests\TestCase;
|
|
|
|
class StoreRouteRequestTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
public function test_authorize_returns_true(): void
|
|
{
|
|
$request = new StoreRouteRequest();
|
|
|
|
$this->assertTrue($request->authorize());
|
|
}
|
|
|
|
public function test_rules_include_required_fields(): void
|
|
{
|
|
$request = new StoreRouteRequest();
|
|
$rules = $request->rules();
|
|
|
|
$this->assertArrayHasKey('feed_id', $rules);
|
|
$this->assertArrayHasKey('platform_channel_id', $rules);
|
|
$this->assertArrayHasKey('language_id', $rules);
|
|
$this->assertArrayHasKey('is_active', $rules);
|
|
$this->assertArrayHasKey('priority', $rules);
|
|
|
|
$this->assertStringContainsString('required', $rules['feed_id']);
|
|
$this->assertStringContainsString('exists:feeds,id', $rules['feed_id']);
|
|
$this->assertStringContainsString('required', $rules['platform_channel_id']);
|
|
$this->assertStringContainsString('exists:platform_channels,id', $rules['platform_channel_id']);
|
|
$this->assertStringContainsString('required', $rules['language_id']);
|
|
$this->assertStringContainsString('exists:languages,id', $rules['language_id']);
|
|
}
|
|
|
|
public function test_validation_passes_with_valid_data(): void
|
|
{
|
|
$language = Language::factory()->create();
|
|
$feed = Feed::factory()->create();
|
|
$channel = PlatformChannel::factory()->create(['language_id' => $language->id]);
|
|
|
|
// Attach language to feed
|
|
$feed->languages()->attach($language->id, [
|
|
'url' => $feed->url,
|
|
'is_active' => true,
|
|
'is_primary' => true
|
|
]);
|
|
|
|
$data = [
|
|
'feed_id' => $feed->id,
|
|
'platform_channel_id' => $channel->id,
|
|
'language_id' => $language->id,
|
|
'is_active' => true,
|
|
'priority' => 50
|
|
];
|
|
|
|
$request = new StoreRouteRequest();
|
|
$rules = $request->rules();
|
|
$validator = Validator::make($data, $rules);
|
|
|
|
$this->assertTrue($validator->passes());
|
|
}
|
|
|
|
public function test_validation_fails_without_required_fields(): void
|
|
{
|
|
$data = [];
|
|
|
|
$request = new StoreRouteRequest();
|
|
$rules = $request->rules();
|
|
$validator = Validator::make($data, $rules);
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertArrayHasKey('feed_id', $validator->errors()->toArray());
|
|
$this->assertArrayHasKey('platform_channel_id', $validator->errors()->toArray());
|
|
$this->assertArrayHasKey('language_id', $validator->errors()->toArray());
|
|
}
|
|
|
|
public function test_validation_fails_with_invalid_foreign_keys(): void
|
|
{
|
|
$data = [
|
|
'feed_id' => 999,
|
|
'platform_channel_id' => 999,
|
|
'language_id' => 999,
|
|
'is_active' => true,
|
|
'priority' => 50
|
|
];
|
|
|
|
$request = new StoreRouteRequest();
|
|
$rules = $request->rules();
|
|
$validator = Validator::make($data, $rules);
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertArrayHasKey('feed_id', $validator->errors()->toArray());
|
|
$this->assertArrayHasKey('platform_channel_id', $validator->errors()->toArray());
|
|
$this->assertArrayHasKey('language_id', $validator->errors()->toArray());
|
|
}
|
|
|
|
public function test_language_consistency_validation_fails_when_feed_lacks_language(): void
|
|
{
|
|
$language1 = Language::factory()->create();
|
|
$language2 = Language::factory()->create();
|
|
$feed = Feed::factory()->create();
|
|
$channel = PlatformChannel::factory()->create(['language_id' => $language1->id]);
|
|
|
|
// Attach only language2 to feed, but request language1
|
|
$feed->languages()->attach($language2->id, [
|
|
'url' => $feed->url,
|
|
'is_active' => true,
|
|
'is_primary' => true
|
|
]);
|
|
|
|
$data = [
|
|
'feed_id' => $feed->id,
|
|
'platform_channel_id' => $channel->id,
|
|
'language_id' => $language1->id,
|
|
'is_active' => true,
|
|
'priority' => 50
|
|
];
|
|
|
|
$request = new StoreRouteRequest();
|
|
$request->merge($data);
|
|
|
|
$rules = $request->rules();
|
|
$validator = Validator::make($data, $rules);
|
|
|
|
// Call the custom validation method
|
|
$request->withValidator($validator);
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertStringContainsString('The selected feed does not support this language',
|
|
$validator->errors()->first('language_id'));
|
|
}
|
|
|
|
public function test_language_consistency_validation_fails_when_channel_lacks_language(): void
|
|
{
|
|
$language1 = Language::factory()->create();
|
|
$language2 = Language::factory()->create();
|
|
$feed = Feed::factory()->create();
|
|
$channel = PlatformChannel::factory()->create(['language_id' => $language2->id]);
|
|
|
|
// Attach language1 to feed, but channel has language2
|
|
$feed->languages()->attach($language1->id, [
|
|
'url' => $feed->url,
|
|
'is_active' => true,
|
|
'is_primary' => true
|
|
]);
|
|
|
|
$data = [
|
|
'feed_id' => $feed->id,
|
|
'platform_channel_id' => $channel->id,
|
|
'language_id' => $language1->id,
|
|
'is_active' => true,
|
|
'priority' => 50
|
|
];
|
|
|
|
$request = new StoreRouteRequest();
|
|
$request->merge($data);
|
|
|
|
$rules = $request->rules();
|
|
$validator = Validator::make($data, $rules);
|
|
|
|
// Call the custom validation method
|
|
$request->withValidator($validator);
|
|
|
|
$this->assertFalse($validator->passes());
|
|
$this->assertStringContainsString('The selected channel does not support this language',
|
|
$validator->errors()->first('language_id'));
|
|
}
|
|
|
|
public function test_custom_messages(): void
|
|
{
|
|
$request = new StoreRouteRequest();
|
|
$messages = $request->messages();
|
|
|
|
$this->assertArrayHasKey('feed_id.required', $messages);
|
|
$this->assertArrayHasKey('platform_channel_id.required', $messages);
|
|
$this->assertArrayHasKey('language_id.required', $messages);
|
|
$this->assertEquals('A feed must be selected.', $messages['feed_id.required']);
|
|
$this->assertEquals('A platform channel must be selected.', $messages['platform_channel_id.required']);
|
|
$this->assertEquals('A language must be selected.', $messages['language_id.required']);
|
|
}
|
|
}
|