Page MenuHomePhabricator

Add tests for the new ULS rewrite
Open, In Progress, MediumPublic8 Estimated Story Points

Description

The new Vue 3 implementation of the Universal Language Selector currently has no automated test coverage. MediaWiki core already uses Jest with @vue/test-utils to test equivalent Vue 3 components and composables. We should adopt the same approach here.

Things to add tests for:

Composables

  • Language history persistence (load, save, dedup, ordering, size cap).
  • Suggested languages (ordering, dedup, filtering against valid codes, territory/browser/config inputs).
  • Typeahead suggestion logic (label match, code match, search-hit match, accept behaviour).
  • Progressive rendering (initial limit, growth in chunks, cleanup on unmount).
  • Country code resolution.
  • Entrypoint wiring (correct entrypoints surfaced per mode).
  • Keyboard navigation (initial state, next/previous item, highlight selection, visible change)

Entrypoint registry

  • Valid registration, type/mode validation, mode restrictions, locking behaviour, retrieval for unknown types.

Components

  • see T431386: Add ULS rewrite top-level component test
  • Empty-list / empty-search / missing-languages / quick-action entrypoint components render and trigger their handlers.
  • The index.js app wrapper: visibility defaults and onSelect/onClose callback wiring.

Details

Related Changes in Gerrit:
SubjectAuthorRepoBranchLines +/-
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+6 -2
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+61 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+122 -1
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+36 -1
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+90 -1
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+63 -1
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+63 -1
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+1 K -2
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+112 -2
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+115 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+153 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+45 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+58 -2
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+114 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+148 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+89 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+189 -0
Huei Tanmediawiki/extensions/UniversalLanguageSelectormaster+4 K -46
Show related patches Customize query in gerrit

Event Timeline

hueitan changed the task status from Open to In Progress.Mon, Jun 15, 9:31 AM
hueitan moved this task from Ready for dev to In Progress on the LPL Essential (FY2025-26 Q3&4) board.

Change #1302143 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: init Jest unit tests

https://gerrit.wikimedia.org/r/1302143

Change #1302256 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add test spec for useLanguageHistory

https://gerrit.wikimedia.org/r/1302256

Change #1302258 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add test spec for useKeyboardNavigation

https://gerrit.wikimedia.org/r/1302258

Change #1302261 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add test spec for useTypeahead

https://gerrit.wikimedia.org/r/1302261

Change #1302763 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add usePregressiveRender test spec

https://gerrit.wikimedia.org/r/1302763

Change #1302768 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useCountryCode test spec

https://gerrit.wikimedia.org/r/1302768

Change #1302773 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewriet: add EntrypointRegistry test spec

https://gerrit.wikimedia.org/r/1302773

Change #1302813 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useEntrypoints test spec

https://gerrit.wikimedia.org/r/1302813

Change #1303375 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useSuggestedLanguages test spec

https://gerrit.wikimedia.org/r/1303375

Change #1302143 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: init Jest unit tests

https://gerrit.wikimedia.org/r/1302143

Change #1302256 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useLanguageHistory test spec

https://gerrit.wikimedia.org/r/1302256

Change #1302258 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useKeyboardNavigation test spec

https://gerrit.wikimedia.org/r/1302258

Change #1302261 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useTypeahead test spec

https://gerrit.wikimedia.org/r/1302261

Change #1302763 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useProgressiveRender test spec

https://gerrit.wikimedia.org/r/1302763

Change #1306274 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EntrypointActionButton test spec

https://gerrit.wikimedia.org/r/1306274

Change #1306618 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EntrypointActionButton QUnit test

https://gerrit.wikimedia.org/r/1306618

Change #1306618 abandoned by Huei Tan:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EntrypointActionButton QUnit test

Reason:

forget it, use jest with babel supported

https://gerrit.wikimedia.org/r/1306618

Change #1306668 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EmptySearchEntrypoint test spec

https://gerrit.wikimedia.org/r/1306668

Change #1306691 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EmptyListEntrypint test spec

https://gerrit.wikimedia.org/r/1306691

Change #1306696 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add QuickActionsPanel test spec

https://gerrit.wikimedia.org/r/1306696

Change #1306702 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add MissingLanguagesEntrypoint test spec

https://gerrit.wikimedia.org/r/1306702

Change #1302768 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useCountryCode test spec

https://gerrit.wikimedia.org/r/1302768

Change #1302773 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EntrypointRegistry test spec

https://gerrit.wikimedia.org/r/1302773

Change #1302813 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useEntrypoints test spec

https://gerrit.wikimedia.org/r/1302813

Change #1303375 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useSuggestedLanguages test spec

https://gerrit.wikimedia.org/r/1303375

Change #1306879 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useEntrypointActions test spec

https://gerrit.wikimedia.org/r/1306879

Change #1306274 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EntrypointActionButton test spec

https://gerrit.wikimedia.org/r/1306274

Change #1306668 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EmptySearchEntrypoint test spec

https://gerrit.wikimedia.org/r/1306668

Change #1306691 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add EmptyListEntrypint test spec

https://gerrit.wikimedia.org/r/1306691

Change #1306696 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add QuickActionsPanel test spec

https://gerrit.wikimedia.org/r/1306696

Change #1306702 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add MissingLanguagesEntrypoint test spec

https://gerrit.wikimedia.org/r/1306702

Change #1307107 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add QuickActionTrigger test spec

https://gerrit.wikimedia.org/r/1307107

Change #1306879 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: add useEntrypointActions test spec

https://gerrit.wikimedia.org/r/1306879

Change #1307719 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: init ULS view test spec

https://gerrit.wikimedia.org/r/1307719

Change #1307847 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: test mode behaviour on ULS component

https://gerrit.wikimedia.org/r/1307847

hueitan updated the task description. (Show Details)
hueitan set Final Story Points to 4.
hueitan moved this task from In progress to Needs QA on the LPL sprints (S1 2026 July) board.

changing story point from 8 -> 4, top-level component test move to T431386

From https://integration.wikimedia.org/ci/job/mediawiki-node24/42798/console / https://gerrit.wikimedia.org/r/c/mediawiki/extensions/UniversalLanguageSelector/+/1306879

> jest
> jest --config jest.config.js

PASS  tests/jest/EntrypointRegistry.test.js
PASS  tests/jest/composables/useSuggestedLanguages.test.js
PASS  tests/jest/composables/useTypeahead.test.js
PASS  tests/jest/index.test.js
PASS  tests/jest/composables/useProgressiveRender.test.js
PASS  tests/jest/composables/useLanguageHistory.test.js
PASS  tests/jest/composables/useEntrypoints.test.js
PASS  tests/jest/composables/useKeyboardNavigation.test.js
PASS  tests/jest/entrypoints/QuickActionTrigger.test.js
PASS  tests/jest/composables/useEntrypointActions.test.js
PASS  tests/jest/entrypoints/MissingLanguagesEntrypoint.test.js
PASS  tests/jest/entrypoints/EmptySearchEntrypoint.test.js
  ● Console

    console.warn
      [Vue warn]: Missing required prop: "suggestions"
        at <EmptyListEntrypoint entrypoints= [
        {
          shouldShow: [Function: shouldShow],
          getConfig: [Function: getConfig]
        }
      ] ref="VTU_COMPONENT" >
        at <VTUROOT>

      15 |
      16 | 	it( 'renders the description paragraph and action buttons', () => {
    > 17 | 		const wrapper = shallowMount( EmptyListEntrypoint, {
         | 		                ^
      18 | 			global: {
      19 | 				mocks: {
      20 | 					$i18n: ( key ) => ( {

    console.warn
      [Vue warn]: Missing required prop: "languages"
        at <EmptyListEntrypoint entrypoints= [
        {
          shouldShow: [Function: shouldShow],
          getConfig: [Function: getConfig]
        }
      ] ref="VTU_COMPONENT" >
        at <VTUROOT>

      15 |
      16 | 	it( 'renders the description paragraph and action buttons', () => {
    > 17 | 		const wrapper = shallowMount( EmptyListEntrypoint, {
         | 		                ^
      18 | 			global: {
      19 | 				mocks: {
      20 | 					$i18n: ( key ) => ( {

    console.warn
      [Vue warn]: Missing required prop: "suggestions"
        at <EmptyListEntrypoint entrypoints= [
        {
          shouldShow: [Function: shouldShow],
          getConfig: [Function: getConfig]
        }
      ] ref="VTU_COMPONENT" >
        at <VTUROOT>

      43 | 			getConfig: () => config
      44 | 		};
    > 45 | 		const wrapper = shallowMount( EmptyListEntrypoint, {
         | 		                ^
      46 | 			global: {
      47 | 				mocks: {
      48 | 					$i18n: ( key ) => ( {

    console.warn
      [Vue warn]: Missing required prop: "languages"
        at <EmptyListEntrypoint entrypoints= [
        {
          shouldShow: [Function: shouldShow],
          getConfig: [Function: getConfig]
        }
      ] ref="VTU_COMPONENT" >
        at <VTUROOT>

      43 | 			getConfig: () => config
      44 | 		};
    > 45 | 		const wrapper = shallowMount( EmptyListEntrypoint, {
         | 		                ^
      46 | 			global: {
      47 | 				mocks: {
      48 | 					$i18n: ( key ) => ( {

PASS  tests/jest/entrypoints/QuickActionsPanel.test.js
PASS  tests/jest/composables/useCountryCode.test.js
PASS  tests/jest/entrypoints/EntrypointActionButton.test.js

----------------------------------|---------|----------|---------|---------|-------------------
File                              | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------------------------------|---------|----------|---------|---------|-------------------
All files                         |   26.16 |    90.75 |   76.19 |   26.16 |
 ext.uls.rewrite                  |   15.51 |    89.36 |   61.11 |   15.51 |
  EntrypointRegistry.js           |     100 |      100 |     100 |     100 |
  LanguageList.vue                |       0 |        0 |       0 |       0 | 1-163
  LanguageSelectorPanelHeader.vue |       0 |        0 |       0 |       0 | 1-66
  LanguageSettingsEntrypoint.js   |       0 |        0 |       0 |       0 | 1-67
  PreferredLanguagesTab.vue       |       0 |        0 |       0 |       0 | 1-86
  UniversalLanguageSelector.vue   |       0 |        0 |       0 |       0 | 1-1056
  index.js                        |   95.93 |      100 |   77.77 |   95.93 | 90,93-96
 ext.uls.rewrite/composables      |    85.9 |    93.18 |    92.3 |    85.9 |
  useClickOutside.js              |       0 |        0 |       0 |       0 | 1-34
  useCountryCode.js               |     100 |      100 |     100 |     100 |
  useEntrypointActions.js         |     100 |      100 |     100 |     100 |
  useEntrypoints.js               |     100 |      100 |     100 |     100 |
  useKeyboardNavigation.js        |     100 |      100 |     100 |     100 |
  useLanguageHistory.js           |     100 |      100 |     100 |     100 |
  usePreferredLanguages.js        |       0 |        0 |       0 |       0 | 1-40
  useProgressiveRender.js         |     100 |      100 |     100 |     100 |
  useSuggestedLanguages.js        |   98.71 |    66.66 |     100 |   98.71 | 40
  useTypeahead.js                 |     100 |      100 |     100 |     100 |
 ext.uls.rewrite/dist             |       0 |        0 |       0 |       0 |
  floating-ui.js                  |       0 |        0 |       0 |       0 | 1-1681
 ext.uls.rewrite/entrypoints      |   87.57 |    91.66 |   76.47 |   87.57 |
  EmptyListEntrypoint.vue         |     100 |      100 |     100 |     100 |
  EmptySearchEntrypoint.vue       |     100 |      100 |     100 |     100 |
  EntrypointActionButton.vue      |     100 |      100 |     100 |     100 |
  MissingLanguagesEntrypoint.vue  |   96.15 |    86.66 |      40 |   96.15 | 85-86,91-92
  MissingLanguagesPanel.vue       |       0 |        0 |       0 |       0 | 1-58
  QuickActionTrigger.vue          |     100 |      100 |     100 |     100 |
  QuickActionsPanel.vue           |     100 |      100 |     100 |     100 |
 ext.uls.rewrite/lib              |       0 |        0 |       0 |       0 |
  floating-ui.js                  |       0 |        0 |       0 |       0 | 1-10
----------------------------------|---------|----------|---------|---------|-------------------

Test Suites: 16 passed, 16 total
Tests:       77 passed, 77 total
Snapshots:   0 total
Time:        5.629 s
Ran all test suites.

Notes:

  • The run emits Vue warnings from EmptyListEntrypoint.test.js about missing required props ("suggestions" and "languages"). These do not fail the test run, but the test run output is not clean.
  • Some files have zero coverage, and it is not clear if they are in scope of this task or the top level component.

@abi_ @hueitan your thoughts?

Change #1308043 had a related patch set uploaded (by Huei Tan; author: Huei Tan):

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: fix Vue warning on test spec

https://gerrit.wikimedia.org/r/1308043

  • The run emits Vue warnings from EmptyListEntrypoint.test.js about missing required props ("suggestions" and "languages"). These do not fail the test run, but the test run output is not clean.
  • Some files have zero coverage, and it is not clear if they are in scope of this task or the top level component.
  • tests for ext.uls.rewrite have been moved to the follow up ticket;
  • floating-ui we don't need the test;
  • usePreferredLanguages useClickoutside MissingLanguagesPanel i feel like these are not really necessary, but if we want to target 100% coverage, i can add that.

Change #1308043 merged by jenkins-bot:

[mediawiki/extensions/UniversalLanguageSelector@master] ULS rewrite: fix Vue warning on test spec

https://gerrit.wikimedia.org/r/1308043