Story 12 — Integration Testing: Multi-Locale End-to-End
Epic: EPIC-010 — Global Internationalization & Multi-Language Support (GitHub #100)
Priority: P2
User Story
As a developer, I want comprehensive integration tests covering all 5 locales across critical user paths, so I can be confident that internationalization works correctly end-to-end.
Requirements
Test Categories
1. Locale Detection & Switching Tests
| # |
Test |
Validates |
| 1 |
testDefaultLocaleIsEnglish |
New session defaults to en |
| 2 |
testQueryParamSwitchesLocale |
?lang=es sets Spanish |
| 3 |
testSessionPersistsLocale |
Locale persists across requests |
| 4 |
testCookieFallback |
Cookie used when no session |
| 5 |
testAcceptLanguageHeader |
Browser header detected correctly |
| 6 |
testInvalidLocaleFallsBack |
?lang=xx falls back to en |
2. Translation Rendering Tests
| # |
Test |
Validates |
| 7 |
testEnglishDashboardRendersCorrectly |
EN translations render |
| 8 |
testSpanishDashboardRendersCorrectly |
ES translations render |
| 9 |
testArabicDashboardRendersCorrectly |
AR translations render |
| 10 |
testAmharicDashboardRendersCorrectly |
AM translations render |
| 11 |
testTigrignaRendersCorrectly |
TI translations render |
| 12 |
testMissingKeyFallsBackToEnglish |
Missing key → English fallback |
| 13 |
testParameterizedTranslation |
{0} placeholders resolved |
3. RTL Layout Tests
| # |
Test |
Validates |
| 14 |
testArabicSetsRtlDirection |
dir="rtl" on <html> |
| 15 |
testEnglishSetsLtrDirection |
dir="ltr" on <html> |
| 16 |
testRtlStylesheetLoaded |
rtl.css included for Arabic |
| 17 |
testRtlStylesheetNotLoadedForLtr |
rtl.css absent for English |
4. Currency Formatting Tests
| # |
Test |
Validates |
| 18 |
testUsdFormatting |
$1,234.56 |
| 19 |
testEurFormatting |
€1.234,56 (European) |
| 20 |
testEtbFormatting |
Br 1,234.56 |
| 21 |
testCurrencyConversion |
USD → ETB at stored rate |
| 22 |
testInvalidCurrencyFallsBack |
Unknown code → USD |
5. Phone Number Tests
| # |
Test |
Validates |
| 23 |
testUsPhoneValidation |
Valid US number passes |
| 24 |
testEthiopianPhoneValidation |
Valid ET number passes |
| 25 |
testInvalidPhoneRejected |
Invalid number fails |
| 26 |
testE164Storage |
Phone stored as +XXXXXXXXXXX |
| 27 |
testPhoneDisplayFormatting |
Display format matches locale |
6. Address Format Tests
| # |
Test |
Validates |
| 28 |
testUsAddressFormat |
US format with ZIP |
| 29 |
testEthiopianAddressFormat |
Ethiopia format without ZIP |
| 30 |
testCountryChangesFieldRequirements |
Dynamic field validation |
7. Board Rendering Tests (All Locales)
| # |
Test |
Validates |
| 31-35 |
test{Board}RendersInAllLocales |
Each board × 5 locales |
| 36 |
testLanguageSwitcherPresent |
Switcher in nav bar |
| 37 |
testLanguageSwitcherChangesLanguage |
Click switches locale |
8. vCard International Tests
| # |
Test |
Validates |
| 38 |
testVcardUtf8Encoding |
Ge'ez characters in vCard |
| 39 |
testVcardInternationalPhone |
E.164 TEL property |
| 40 |
testVcardInternationalAddress |
Country-formatted address |
Test Infrastructure
- Test trait:
LocaleTestTrait — helpers for setting locale in test requests
- Test fixture:
i18n_test_data.sql — test users with various locales/currencies
- All tests in
tests/integration/I18nTest.php
Acceptance Criteria
| # |
Criteria |
Priority |
| 1 |
40+ integration tests covering all i18n features |
P0 |
| 2 |
All 5 locales tested for critical paths |
P0 |
| 3 |
RTL rendering validated |
P1 |
| 4 |
Currency/phone/address formatting tested |
P1 |
| 5 |
All tests pass in CI pipeline |
P0 |
| 6 |
Test coverage > 80% for i18n code |
P2 |
Files to Create
app/app.portalv2/tests/integration/I18nTest.php
app/app.portalv2/tests/_support/Traits/LocaleTestTrait.php
app/app.portalv2/tests/_support/Fixtures/i18n_test_data.sql