Handle rejected subscriptions and add local client compose
All checks were successful
Build and Deploy Gateway / build-and-push (push) Successful in 14s
Build and Deploy Gateway / deploy (push) Successful in 6s

This commit is contained in:
2026-07-13 20:23:37 +03:00
parent 8c19f2cba9
commit 56f5e408e3
10 changed files with 306 additions and 443 deletions

View File

@@ -9,6 +9,7 @@ import {
formatConnectionDurationWords,
isSubscriptionUrlValid,
localProxyUrls,
routePresentation,
subscriptionDomain,
subscriptionDaysLeft,
subscriptionUsage,
@@ -74,6 +75,14 @@ test('gateway proxy URLs use its network address', () => {
});
});
test('route copy distinguishes found, stale, lost, disabled and local states', () => {
assert.equal(routePresentation({ mode: 'gateway-direct', reason: 'gateway-found' }).title, 'Через Harbor Gateway');
assert.equal(routePresentation({ mode: 'gateway-direct', reason: 'gateway-stale' }).tone, 'stale');
assert.match(routePresentation({ mode: 'local-vpn', reason: 'gateway-lost' }).title, /Gateway недоступен/);
assert.match(routePresentation({ mode: 'local-vpn', reason: 'disabled' }).detail, /выключен/);
assert.equal(routePresentation({ mode: 'local-vpn', reason: 'local' }).title, 'Локальный VPN');
});
test('copy uses the synchronous native path available on gateway HTTP', async () => {
const textarea = {
style: {},

View File

@@ -94,7 +94,7 @@ test('tooltips stay opaque, above adjacent content, and do not stick after point
assert.match(styles, /\.client-tooltip-anchor:has\(> :focus-visible\) > \.client-tooltip/);
assert.doesNotMatch(styles, /\.client-tooltip-anchor:focus-within > \.client-tooltip/);
assert.match(rule('.harbor-version-tooltip'), /background:\s*oklch\(0\.14 0\.012 145\)/);
assert.match(rule('.harbor-mode-tooltip'), /background:\s*oklch\(0\.14 0\.012 145\)/);
assert.doesNotMatch(component, /harbor-mode-tooltip|harbor-brand-control/);
});
test('subscription validation waits for the provider and keeps diagnostics below errors', () => {

View File

@@ -69,3 +69,13 @@ test('copy feedback, drawers and Gateway tabs expose complete keyboard semantics
assert.match(styles, /@media \(max-width: 560px\)[\s\S]*\.client-copy-button \{[\s\S]*min-height: 44px/);
assert.match(styles, /@media \(max-width: 560px\)[\s\S]*\.client-local-rule-enabled,[\s\S]*\.client-local-rule-delete \{[\s\S]*width: 44px;[\s\S]*height: 44px/);
});
test('Connect route uses a labelled native Auto control instead of the logo', () => {
assert.match(component, /aria-label="Маршрут Connect"/);
assert.match(component, /type="checkbox"[\s\S]*checked={route\?\.autoEnabled !== false}/);
assert.match(component, /onChange={\(event\) => onSetGatewayAuto\(event\.target\.checked\)}/);
assert.match(component, /Использовать домашний Gateway автоматически/);
assert.doesNotMatch(component, /harbor-brand-control|:3456/);
assert.match(styles, /\.client-route-auto \{[\s\S]*min-height: 44px/);
assert.match(styles, /\.client-route-auto:has\(input:focus-visible\)/);
});