mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-08-28 16:31:13 +08:00
67 lines
2.5 KiB
TypeScript
67 lines
2.5 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
import { createElement } from 'react';
|
|
import { renderToStaticMarkup } from 'react-dom/server';
|
|
import i18n from '@/i18n';
|
|
import { ApiKeyStrengthMeter } from '@/features/config/components/blocks/ApiKeyStrengthMeter';
|
|
import { SEGMENT_STAGGER_MS, segmentFillDelayMs } from '@/features/config/components/blocks/shared';
|
|
import { generateSecureApiKey } from '@/utils/apiKey';
|
|
|
|
const LOCALES = ['en', 'zh-CN', 'zh-TW', 'ru'];
|
|
|
|
describe('ApiKeyStrengthMeter', () => {
|
|
test('exposes the tier through the progressbar', () => {
|
|
const markup = renderToStaticMarkup(
|
|
createElement(ApiKeyStrengthMeter, { value: generateSecureApiKey() })
|
|
);
|
|
|
|
expect(markup).toContain('aria-valuenow="4"');
|
|
expect(markup).toContain('aria-valuemax="4"');
|
|
expect(markup).toContain(
|
|
`aria-valuetext="${i18n.t('config_management.visual.api_keys.strength.strong')}"`
|
|
);
|
|
expect(markup.match(/data-filled="true"/g)).toHaveLength(4);
|
|
});
|
|
|
|
test('empty input lights nothing and shows a placeholder label', () => {
|
|
const markup = renderToStaticMarkup(createElement(ApiKeyStrengthMeter, { value: '' }));
|
|
|
|
expect(markup).toContain('aria-valuenow="0"');
|
|
expect(markup).not.toContain('data-filled="true"');
|
|
expect(markup).toContain('—');
|
|
});
|
|
|
|
test('segments cascade only over the newly lit ones', () => {
|
|
const delays = (segments: number, previous: number) =>
|
|
[0, 1, 2, 3].map((index) => segmentFillDelayMs(index, segments, previous));
|
|
|
|
// 0 → 4(点「生成」):四段依次起跑
|
|
expect(delays(4, 0)).toEqual([
|
|
0,
|
|
SEGMENT_STAGGER_MS,
|
|
SEGMENT_STAGGER_MS * 2,
|
|
SEGMENT_STAGGER_MS * 3,
|
|
]);
|
|
// 2 → 3(键入一个字符):新增的那段立刻亮,不为它的下标排队
|
|
expect(delays(3, 2)).toEqual([0, 0, 0, 0]);
|
|
// 1 → 3:只有新增的两段排队
|
|
expect(delays(3, 1)).toEqual([0, 0, SEGMENT_STAGGER_MS, 0]);
|
|
// 4 → 2(删字符):熄灭立即发生
|
|
expect(delays(2, 4)).toEqual([0, 0, 0, 0]);
|
|
});
|
|
|
|
test('every tier label is translated in all locales', async () => {
|
|
const original = i18n.language;
|
|
|
|
for (const locale of LOCALES) {
|
|
await i18n.changeLanguage(locale);
|
|
for (const key of ['label', 'empty', 'weak', 'fair', 'good', 'strong']) {
|
|
const path = `config_management.visual.api_keys.strength.${key}`;
|
|
expect(i18n.exists(path)).toBe(true);
|
|
expect(i18n.t(path)).not.toBe(path);
|
|
}
|
|
}
|
|
|
|
await i18n.changeLanguage(original);
|
|
});
|
|
});
|