libra/tests/Feature/BilingualInfrastructureTest...

135 lines
4.7 KiB
PHP

<?php
use App\Helpers\DateHelper;
use App\Models\User;
use Illuminate\Support\Facades\App;
describe('Language Toggle Route', function () {
test('language toggle stores preference in session for guests', function () {
$this->get(route('language.switch', 'en'))
->assertRedirect();
expect(session('locale'))->toBe('en');
$this->get(route('language.switch', 'ar'))
->assertRedirect();
expect(session('locale'))->toBe('ar');
});
test('language toggle stores preference in database for authenticated users', function () {
$user = User::factory()->create(['preferred_language' => 'ar']);
$this->actingAs($user)
->get(route('language.switch', 'en'))
->assertRedirect();
expect(session('locale'))->toBe('en');
expect($user->fresh()->preferred_language)->toBe('en');
});
test('language toggle rejects invalid locales', function () {
$this->get(route('language.switch', 'fr'))
->assertStatus(400);
$this->get(route('language.switch', 'invalid'))
->assertStatus(400);
});
test('language switch redirects back to same page', function () {
$this->from('/login')
->get(route('language.switch', 'en'))
->assertRedirect('/login');
});
});
describe('SetLocale Middleware', function () {
test('middleware sets correct locale from user preference', function () {
$user = User::factory()->create(['preferred_language' => 'en']);
$this->actingAs($user)
->get(route('home'));
expect(App::getLocale())->toBe('en');
});
test('middleware falls back to session for guests', function () {
session(['locale' => 'en']);
$this->get(route('home'));
expect(App::getLocale())->toBe('en');
});
test('middleware defaults to Arabic when no preference set', function () {
$this->get(route('home'));
expect(App::getLocale())->toBe('ar');
});
});
describe('Date Formatting Helper', function () {
test('date formatting helper returns DD/MM/YYYY for Arabic locale', function () {
$date = '2024-12-25';
$formatted = DateHelper::formatDate($date, 'ar');
expect($formatted)->toBe('25/12/2024');
});
test('date formatting helper returns MM/DD/YYYY for English locale', function () {
$date = '2024-12-25';
$formatted = DateHelper::formatDate($date, 'en');
expect($formatted)->toBe('12/25/2024');
});
test('date formatting helper handles null values', function () {
expect(DateHelper::formatDate(null))->toBe('');
expect(DateHelper::formatTime(null))->toBe('');
expect(DateHelper::formatDateTime(null))->toBe('');
});
test('date formatting helper uses current locale by default', function () {
App::setLocale('ar');
expect(DateHelper::formatDate('2024-12-25'))->toBe('25/12/2024');
App::setLocale('en');
expect(DateHelper::formatDate('2024-12-25'))->toBe('12/25/2024');
});
test('time formatting helper returns 12-hour format', function () {
expect(DateHelper::formatTime('14:30:00'))->toBe('2:30 PM');
expect(DateHelper::formatTime('08:15:00'))->toBe('8:15 AM');
});
test('datetime formatting helper combines date and time correctly', function () {
$datetime = '2024-12-25 14:30:00';
expect(DateHelper::formatDateTime($datetime, 'ar'))->toBe('25/12/2024 2:30 PM');
expect(DateHelper::formatDateTime($datetime, 'en'))->toBe('12/25/2024 2:30 PM');
});
});
describe('Translation Files', function () {
test('Arabic translation files exist and have content', function () {
expect(__('auth.failed', [], 'ar'))->not->toBe('auth.failed');
expect(__('validation.required', [], 'ar'))->not->toBe('validation.required');
expect(__('navigation.dashboard', [], 'ar'))->not->toBe('navigation.dashboard');
expect(__('pagination.previous', [], 'ar'))->not->toBe('pagination.previous');
});
test('English translation files exist and have content', function () {
expect(__('auth.failed', [], 'en'))->not->toBe('auth.failed');
expect(__('validation.required', [], 'en'))->not->toBe('validation.required');
expect(__('navigation.dashboard', [], 'en'))->not->toBe('navigation.dashboard');
expect(__('pagination.previous', [], 'en'))->not->toBe('pagination.previous');
});
test('validation attribute translations work', function () {
expect(__('validation.attributes.email', [], 'ar'))->toBe('البريد الإلكتروني');
expect(__('validation.attributes.email', [], 'en'))->toBe('email');
});
});