- Extract ContentLanguageOption into @/types and use it for availableContentLanguages across BrandForm, BrandTab, Brand, Create, and the LanguagePicker options, so the englishName field that drives search is visible to TypeScript instead of being dropped silently by the pass-through prop types. - Add BrandAnalyzerTest: assert the language schema enum equals the full 15-language set (guards against it shrinking back to a hardcoded subset behind ::fake()) and that instructions() lists every code. - Isolate the "LLM language wins" autofill test by declaring the page as `en` while the LLM returns `de`, so it actually proves mergeLlm precedence instead of both paths agreeing. - Cover SetLocale's cookie side effect: the default locale cookie is set on an invalid/absent cookie and left untouched for a valid locale.
66 lines
2.2 KiB
PHP
66 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Http\Middleware\App\SetLocale;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\View;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
/**
|
|
* Run the middleware with the given `locale` cookie (null = no cookie) and
|
|
* return the response, whose shared `htmlDir` and queued cookies can be asserted.
|
|
*/
|
|
function setLocaleResponse(?string $locale): Response
|
|
{
|
|
$request = Request::create('/', 'GET');
|
|
|
|
if ($locale !== null) {
|
|
$request->cookies->set('locale', $locale);
|
|
}
|
|
|
|
return (new SetLocale)->handle($request, fn () => response('ok'));
|
|
}
|
|
|
|
/** The shared `htmlDir` the Blade root view renders into `<html dir>`. */
|
|
function runSetLocale(?string $locale): string
|
|
{
|
|
setLocaleResponse($locale);
|
|
|
|
return View::shared('htmlDir');
|
|
}
|
|
|
|
test('shares rtl direction and sets the locale for Arabic', function () {
|
|
expect(runSetLocale('ar'))->toBe('rtl');
|
|
expect(app()->getLocale())->toBe('ar');
|
|
});
|
|
|
|
test('shares ltr direction for a left-to-right locale', function (string $locale) {
|
|
expect(runSetLocale($locale))->toBe('ltr');
|
|
expect(app()->getLocale())->toBe($locale);
|
|
})->with(['en', 'ja', 'pt-BR', 'de']);
|
|
|
|
test('falls back to the default locale and ltr for an unknown cookie', function () {
|
|
expect(runSetLocale('sv'))->toBe('ltr');
|
|
expect(app()->getLocale())->toBe(config('languages.default'));
|
|
});
|
|
|
|
test('falls back to the default locale and ltr when no cookie is set', function () {
|
|
expect(runSetLocale(null))->toBe('ltr');
|
|
expect(app()->getLocale())->toBe(config('languages.default'));
|
|
});
|
|
|
|
test('persists the default locale cookie when the incoming cookie is invalid or absent', function (?string $locale) {
|
|
$cookie = collect(setLocaleResponse($locale)->headers->getCookies())
|
|
->first(fn ($cookie) => $cookie->getName() === 'locale');
|
|
|
|
expect($cookie)->not->toBeNull();
|
|
expect($cookie->getValue())->toBe(config('languages.default'));
|
|
})->with(['sv', null]);
|
|
|
|
test('does not reset the cookie when a valid locale is present', function () {
|
|
$cookie = collect(setLocaleResponse('ar')->headers->getCookies())
|
|
->first(fn ($cookie) => $cookie->getName() === 'locale');
|
|
|
|
expect($cookie)->toBeNull();
|
|
});
|