fedi-feed-router/tests/Feature/Http/Controllers/Api/V1/SettingsControllerTest.php
myrmidex 6784af2ff6
Some checks failed
CI / ci (push) Failing after 4m31s
25 - Fix all PHPStan errors and add mockery extension
2026-03-08 14:18:28 +01:00

148 lines
4.4 KiB
PHP

<?php
namespace Tests\Feature\Http\Controllers\Api\V1;
use App\Models\Setting;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class SettingsControllerTest extends TestCase
{
use RefreshDatabase;
public function test_index_returns_current_settings(): void
{
$response = $this->getJson('/api/v1/settings');
$response->assertStatus(200)
->assertJsonStructure([
'success',
'data' => [
'article_processing_enabled',
'publishing_approvals_enabled',
'article_publishing_interval',
],
'message',
])
->assertJson([
'success' => true,
'message' => 'Settings retrieved successfully.',
]);
}
public function test_update_modifies_article_processing_setting(): void
{
$response = $this->putJson('/api/v1/settings', [
'article_processing_enabled' => false,
]);
$response->assertStatus(200)
->assertJson([
'success' => true,
'message' => 'Settings updated successfully.',
'data' => [
'article_processing_enabled' => false,
],
]);
}
public function test_update_modifies_publishing_approvals_setting(): void
{
$response = $this->putJson('/api/v1/settings', [
'publishing_approvals_enabled' => true,
]);
$response->assertStatus(200)
->assertJson([
'success' => true,
'message' => 'Settings updated successfully.',
'data' => [
'publishing_approvals_enabled' => true,
],
]);
}
public function test_update_validates_boolean_values(): void
{
$response = $this->putJson('/api/v1/settings', [
'article_processing_enabled' => 'not-a-boolean',
'publishing_approvals_enabled' => 'also-not-boolean',
]);
$response->assertStatus(422)
->assertJsonValidationErrors([
'article_processing_enabled',
'publishing_approvals_enabled',
]);
}
public function test_update_accepts_partial_updates(): void
{
// Update only one setting
$response = $this->putJson('/api/v1/settings', [
'article_processing_enabled' => true,
]);
$response->assertStatus(200)
->assertJson([
'success' => true,
'data' => [
'article_processing_enabled' => true,
],
]);
// Should still have structure for all settings
$response->assertJsonStructure([
'data' => [
'article_processing_enabled',
'publishing_approvals_enabled',
'article_publishing_interval',
],
]);
}
public function test_index_returns_article_publishing_interval(): void
{
$response = $this->getJson('/api/v1/settings');
$response->assertStatus(200)
->assertJsonStructure([
'data' => [
'article_publishing_interval',
],
])
->assertJsonPath('data.article_publishing_interval', 5);
}
public function test_update_accepts_valid_article_publishing_interval(): void
{
$response = $this->putJson('/api/v1/settings', [
'article_publishing_interval' => 15,
]);
$response->assertStatus(200)
->assertJsonPath('data.article_publishing_interval', 15);
$this->assertSame(15, Setting::getArticlePublishingInterval());
}
public function test_update_rejects_negative_article_publishing_interval(): void
{
$response = $this->putJson('/api/v1/settings', [
'article_publishing_interval' => -5,
]);
$response->assertStatus(422)
->assertJsonValidationErrors(['article_publishing_interval']);
}
public function test_update_rejects_non_integer_article_publishing_interval(): void
{
$response = $this->putJson('/api/v1/settings', [
'article_publishing_interval' => 'abc',
]);
$response->assertStatus(422)
->assertJsonValidationErrors(['article_publishing_interval']);
}
}