Support Log in

40. Automated Testing with Lang Forge

Developer Guide
Prefer video? Watch the Lang Forge tutorials 9 short guides covering every feature Watch

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);
    });
});

Forge AI Assistant Online

Hi! I'm the Lang Forge AI assistant. Ask me anything about the plugin — setup, features, troubleshooting, or development.

Just now
Powered by Forge AI · Browse docs