How to write automated tests for a multilingual WordPress site using Lang Forge.
PHPUnit Test Setup
php
/**
* Base test class for Lang Forge integration tests.
* Extend WP_UnitTestCase and set up language fixtures.
*/
class LF_Test_Case extends WP_UnitTestCase {
protected function setUp(): void {
parent::setUp();
// Set up test languages
update_option('lf_active_languages', [
'ru' => ['name' => 'Russian', 'native_name' => 'Русский', 'flag' => 'ru', 'locale' => 'ru_RU'],
'en' => ['name' => 'English', 'native_name' => 'English', 'flag' => 'gb', 'locale' => 'en_US'],
]);
update_option('lf_default_language', 'ru');
}
/**
* Helper: Create a post with a language and optionally link a translation.
*/
protected function create_translated_pair($post_type = 'post') {
$ru_id = $this->factory()->post->create([
'post_type' => $post_type,
'post_title' => 'Тестовый пост',
]);
update_post_meta($ru_id, '_lf_language', 'ru');
$en_id = $this->factory()->post->create([
'post_type' => $post_type,
'post_title' => 'Test Post',
]);
update_post_meta($en_id, '_lf_language', 'en');
LF_Post_Translation::instance()->link_translations($ru_id, $en_id);
return ['ru' => $ru_id, 'en' => $en_id];
}
}Testing Translation Functions
php
class Test_Translation_Functions extends LF_Test_Case {
public function test_get_post_language() {
$pair = $this->create_translated_pair();
$this->assertEquals('ru', lf_get_post_language($pair['ru']));
$this->assertEquals('en', lf_get_post_language($pair['en']));
}
public function test_get_post_translations() {
$pair = $this->create_translated_pair();
$translations = lf_get_post_translations($pair['ru']);
$this->assertArrayHasKey('ru', $translations);
$this->assertArrayHasKey('en', $translations);
$this->assertEquals($pair['ru'], $translations['ru']);
$this->assertEquals($pair['en'], $translations['en']);
}
public function test_get_translation() {
$pair = $this->create_translated_pair();
$en_id = lf_get_translation($pair['ru'], 'en');
$this->assertEquals($pair['en'], $en_id);
$null_result = lf_get_translation($pair['ru'], 'fr');
$this->assertNull($null_result);
}
public function test_string_translation() {
// Auto-registration via __() — string appears in String Translation admin
$result = __('Hello', 'test');
$this->assertEquals('Hello', $result);
}
}Playwright E2E Tests
javascript
// tests/translation-switcher.spec.js
import { test, expect } from '@playwright/test';
test.describe('Language Switcher', () => {
test('switches between languages', async ({ page }) => {
await page.goto('http://localhost:8888/');
// Verify we are on the default language
const lang = await page.getAttribute('html', 'lang');
expect(lang).toBe('ru-RU');
// Click the language switcher
await page.click('.lf-language-switcher .lf-current-lang');
await page.click('.lf-language-switcher a[hreflang="en"]');
// Verify language switched
await page.waitForURL('**/en/**');
const newLang = await page.getAttribute('html', 'lang');
expect(newLang).toBe('en-US');
});
test('shows correct translations on single post', async ({ page }) => {
await page.goto('http://localhost:8888/sample-post/');
// Verify translation links exist
const translationLinks = page.locator('.also-available a');
expect(await translationLinks.count()).toBeGreaterThan(0);
});
});—