diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 22d29a2..c81c0f6 100644 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -9,6 +9,7 @@ use App\Models\Setting; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Validation\Rule; use Inertia\Inertia; use Inertia\Response; @@ -19,6 +20,7 @@ class SettingsController extends Controller 'agenda_end_title', 'agenda_announcement_position', 'agenda_sermon_matching', + 'default_translation_language', ]; public function index(): Response @@ -48,10 +50,16 @@ public function index(): Response public function update(Request $request): JsonResponse { $validated = $request->validate([ - 'key' => ['required', 'string', 'in:'.implode(',', self::AGENDA_KEYS)], + 'key' => ['required', 'string', Rule::in(self::AGENDA_KEYS)], 'value' => ['nullable', 'string', 'max:500'], ]); + if ($validated['key'] === 'default_translation_language') { + validator($validated, [ + 'value' => ['nullable', Rule::in(['DE', 'EN', 'FR', 'ES', 'NL', 'IT'])], + ])->validate(); + } + Setting::set($validated['key'], $validated['value']); return response()->json(['success' => true]); diff --git a/database/seeders/CcliSettingsSeeder.php b/database/seeders/CcliSettingsSeeder.php new file mode 100644 index 0000000..28354b5 --- /dev/null +++ b/database/seeders/CcliSettingsSeeder.php @@ -0,0 +1,17 @@ + 'default_translation_language'], + ['value' => 'DE'], + ); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 6b901f8..db42742 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -21,5 +21,7 @@ public function run(): void 'name' => 'Test User', 'email' => 'test@example.com', ]); + + $this->call(CcliSettingsSeeder::class); } } diff --git a/tests/Feature/SettingsDefaultLanguageTest.php b/tests/Feature/SettingsDefaultLanguageTest.php new file mode 100644 index 0000000..7150bc6 --- /dev/null +++ b/tests/Feature/SettingsDefaultLanguageTest.php @@ -0,0 +1,87 @@ +seed(CcliSettingsSeeder::class); + + $setting = Setting::where('key', 'default_translation_language')->first(); + + $this->assertNotNull($setting); + $this->assertSame('DE', $setting?->value); + } + + #[DataProvider('validLanguages')] + public function test_accepts_valid_default_translation_language_via_patch(string $language): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->patchJson(route('settings.update'), [ + 'key' => 'default_translation_language', + 'value' => $language, + ]); + + $response->assertOk()->assertJson(['success' => true]); + + $this->assertSame($language, Setting::get('default_translation_language')); + } + + public static function validLanguages(): array + { + return [ + ['DE'], + ['EN'], + ['FR'], + ['ES'], + ['NL'], + ['IT'], + ]; + } + + public function test_rejects_invalid_default_translation_language_via_patch(): void + { + $user = User::factory()->create(); + + $response = $this->actingAs($user)->patchJson(route('settings.update'), [ + 'key' => 'default_translation_language', + 'value' => 'ZZ', + ]); + + $response->assertUnprocessable(); + $response->assertJsonValidationErrors('value'); + } + + public function test_exposes_default_translation_language_in_settings_props(): void + { + $user = User::factory()->create(); + + $this->seed(CcliSettingsSeeder::class); + + $response = $this->actingAs($user) + ->withoutVite() + ->get(route('settings.index')); + + $response->assertInertia( + fn ($page) => $page + ->component('Settings') + ->has('settings.default_translation_language') + ->where('settings.default_translation_language', 'DE') + ); + } +}