chart/tests/e2e/price-scale.test.mjs

70 lines
3.3 KiB
JavaScript

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { withChart, assertNoPageErrors } from './helpers.mjs';
test('every price overlay shares the candle price scale',
{ timeout: 180000 }, async () => {
await withChart(async page => {
const state = await page.evaluate(() => {
const c = window.__chart;
const series = [...c.levelSeries.entries()].map(([id, entry]) => ({
id,
scale: entry.series.options().priceScaleId,
context: window.ConfluenceChart.isContextLevel(c.levels.find(level => level.id === id)),
title: entry.series.options().title,
}));
const priceLines = [...c.priceLines.entries()].map(([id, entry]) => ({
id,
usesCandles: entry.host === c.candles,
}));
const average = c.levels.find(level => level.kind === 'ma');
const averageSeries = average ? c.levelSeries.get(average.id)?.series : null;
const value = average?.anchor_p ?? null;
return {
leftVisible: c.chart.priceScale('left').options().visible,
series,
priceLines,
coordinateDifference: averageSeries && value != null
? Math.abs(averageSeries.priceToCoordinate(value) - c.candles.priceToCoordinate(value))
: null,
leftLabels: document.querySelectorAll('.chart-context-label').length,
};
});
assert.equal(state.leftVisible, false, 'an independent left price scale is visible');
assert.ok(state.series.length > 0, 'no overlay series were available to check');
assert.ok(state.series.every(item => item.scale === 'right'),
`overlay series left the candle scale: ${JSON.stringify(state.series)}`);
assert.ok(state.series.filter(item => item.context).every(item => item.title === ''),
`long-term labels still clutter the right: ${JSON.stringify(state.series)}`);
assert.ok(state.leftLabels > 0, 'long-term labels are missing from the left side');
assert.ok(state.priceLines.every(item => item.usesCandles),
`a price line uses another scale: ${JSON.stringify(state.priceLines)}`);
assert.ok(state.coordinateDifference != null && state.coordinateDifference < 0.1,
`the same price differs by ${state.coordinateDifference}px between MA and candles`);
const intradayType = await page.evaluate(() => {
const c = window.__chart;
const average = c.levels.find(level => level.kind === 'ma');
return {
actual: c.levelSeries.get(average.id).series.options().lineType,
expected: LightweightCharts.LineType.WithSteps,
};
});
assert.equal(intradayType.actual, intradayType.expected,
'an intraday daily MA is not held as steps');
await page.click('.timeframes button:text-is("1d")');
await page.waitForTimeout(1500);
const dailyType = await page.evaluate(() => {
const c = window.__chart;
const average = c.levels.find(level => level.kind === 'ma');
return {
actual: c.levelSeries.get(average.id).series.options().lineType,
expected: LightweightCharts.LineType.Simple,
};
});
assert.equal(dailyType.actual, dailyType.expected,
'a daily MA is still rendered as a staircase');
assertNoPageErrors(page, assert);
});
});