Preserve shortage signals during global pause (Refs #137)
CI / checks (push) Successful in 4m47s
CI / checks (push) Successful in 4m47s
This commit is contained in:
@@ -51,6 +51,7 @@ function report(): MetricsData {
|
||||
firstRetainedSampleAt: now - 14 * 86400000,
|
||||
latestSampleAt: now,
|
||||
registeredServerCount: 24,
|
||||
autoscalingPaused: false,
|
||||
scope: { game: null, map: null, timeZone: 'America/New_York' },
|
||||
scopeOptions: { games: ['t5'], maps: [] },
|
||||
scopeFirstSampleAt: now - 14 * 86400000,
|
||||
@@ -224,6 +225,45 @@ it('highlights at most three supported policy changes and collapses tentative fi
|
||||
);
|
||||
});
|
||||
|
||||
it('shows a global pause once while keeping Kino’s shortage ahead of quiet maps', () => {
|
||||
const data = report();
|
||||
data.autoscalingPaused = true;
|
||||
const policy = {
|
||||
id: 't5-all',
|
||||
mode: 'create-destroy' as const,
|
||||
minimum: 1,
|
||||
maximum: 3,
|
||||
spares: 1,
|
||||
pausedReason: null
|
||||
};
|
||||
data.maps = [
|
||||
map(1, {
|
||||
map: 'Kino Der Toten',
|
||||
policy,
|
||||
observed: 100,
|
||||
active: 10,
|
||||
idle: 90,
|
||||
availabilityObserved: 100,
|
||||
noEmpty: 4.1,
|
||||
noEmptyAtMaximum: 4.1
|
||||
}),
|
||||
...Array.from({ length: 5 }, (_, i) => map(i + 2, { policy, noEmpty: 0 }))
|
||||
];
|
||||
let body = render(MetricsExplore, { props: { report: data } }).body;
|
||||
expect(body.match(/Autoscaling is globally paused\./g)).toHaveLength(1);
|
||||
expect(body).toContain('Consider raising the policy maximum');
|
||||
expect(body).toContain('4.1%');
|
||||
expect(body).toContain('href="/autoscaling#t5-all"');
|
||||
expect(body).not.toContain('Review and resume the autoscaling policy');
|
||||
const highlighted = body.slice(0, body.indexOf('Other findings'));
|
||||
expect(highlighted.match(/class="recommendation /g)).toHaveLength(1);
|
||||
expect(highlighted).toContain('Kino Der Toten');
|
||||
data.autoscalingPaused = false;
|
||||
body = render(MetricsExplore, { props: { report: data } }).body;
|
||||
expect(body).not.toContain('Autoscaling is globally paused.');
|
||||
expect(body).toContain('Consider raising the policy maximum');
|
||||
});
|
||||
|
||||
it('keeps accessible chart selection, partial periods and gaps while collapsing inspection controls', () => {
|
||||
const data = report();
|
||||
data.points.push({
|
||||
@@ -296,6 +336,30 @@ it('keeps average lobby bar heights comparable across partial periods and collec
|
||||
).toBe(true);
|
||||
});
|
||||
|
||||
it('renders whole-lobby axis ticks without rounding fractional averages or other measures', () => {
|
||||
const data = report();
|
||||
data.points[0] = { ...data.points[0], active: 1.5, idle: 1, observed: 2.5, unknown: 1.25 };
|
||||
const renderChart = () =>
|
||||
render(MetricsChart, {
|
||||
props: { points: data.points, days: data.days, timeZone: data.scope.timeZone }
|
||||
}).body;
|
||||
const axisLabels = (body: string) => {
|
||||
const axis = body.match(/<div class="y-axis[\s\S]*?<\/div>/)?.[0] ?? '';
|
||||
return [...axis.matchAll(/<span[^>]*>([^<]+)<\/span>/g)].map((match) => match[1]);
|
||||
};
|
||||
let body = renderChart();
|
||||
expect(axisLabels(body)).toEqual(['4', '3', '2', '1', '0']);
|
||||
expect(body).toContain('1.5 with players');
|
||||
scope('?chartMode=percent');
|
||||
body = renderChart();
|
||||
expect(axisLabels(body)).toEqual(['100%', '75%', '50%', '25%', '0%']);
|
||||
scope('?chartMode=hours');
|
||||
body = renderChart();
|
||||
expect(axisLabels(body)).toEqual(['4', '3', '2', '1', '0']);
|
||||
data.points[0] = { ...data.points[0], active: 0.5, idle: 0, observed: 0.5, unknown: 0 };
|
||||
expect(axisLabels(renderChart())).toContain('0.375');
|
||||
});
|
||||
|
||||
it('uses shallow URL state for the selected breakdown while retaining the common summary', () => {
|
||||
scope('?view=maps', '?view=instances&serverQ=theater&serverPage=2');
|
||||
let body = render(MetricsPage, {
|
||||
|
||||
Reference in New Issue
Block a user