Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Astandrik.tests try fix #1112

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/containers/Tenant/Query/QueryEditor/QueryEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ function QueryEditor(props: QueryEditorProps) {

const schema = useMultiSchema ? 'multi' : 'modern';

const query = text && typeof text === 'string' ? text : input;
const query = text ?? input;

setLastUsedQueryAction(QUERY_ACTIONS.execute);
if (!isEqual(lastQueryExecutionSettings, querySettings)) {
Expand Down Expand Up @@ -312,10 +312,10 @@ function QueryEditor(props: QueryEditorProps) {
const renderControls = () => {
return (
<QueryEditorControls
onRunButtonClick={handleSendExecuteClick}
handleSendExecuteClick={handleSendExecuteClick}
onSettingsButtonClick={handleSettingsClick}
runIsLoading={executeQueryResult.isLoading}
onExplainButtonClick={handleGetExplainQueryClick}
handleGetExplainQueryClick={handleGetExplainQueryClick}
explainIsLoading={explainQueryResult.isLoading}
disabled={!executeQuery.input}
highlightedAction={lastUsedQueryAction}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,20 +54,20 @@ const SettingsButton = ({onClick, runIsLoading}: SettingsButtonProps) => {
};

interface QueryEditorControlsProps {
onRunButtonClick: () => void;
handleSendExecuteClick: () => void;
onSettingsButtonClick: () => void;
runIsLoading: boolean;
onExplainButtonClick: () => void;
handleGetExplainQueryClick: () => void;
explainIsLoading: boolean;
disabled: boolean;
highlightedAction: QueryAction;
}

export const QueryEditorControls = ({
onRunButtonClick,
handleSendExecuteClick,
onSettingsButtonClick,
runIsLoading,
onExplainButtonClick,
handleGetExplainQueryClick,
explainIsLoading,
disabled,
highlightedAction,
Expand All @@ -76,6 +76,14 @@ export const QueryEditorControls = ({
const explainView: ButtonView | undefined =
highlightedAction === 'explain' ? 'action' : undefined;

const onRunButtonClick = () => {
handleSendExecuteClick();
};

const onExplainButtonClick = () => {
handleGetExplainQueryClick();
};

return (
<div className={b()}>
<div className={b('left')}>
Expand Down
4 changes: 4 additions & 0 deletions tests/suites/tenant/queryEditor/QueryEditor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ export class QueryEditor {
}
}

async focusEditor() {
await this.editorTextArea.focus();
}

async clickGearButton() {
await this.gearButton.waitFor({state: 'visible', timeout: VISIBILITY_TIMEOUT});
await this.gearButton.click();
Expand Down
91 changes: 91 additions & 0 deletions tests/suites/tenant/queryHistory/queryHistory.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import {expect, test} from '@playwright/test';

import {tenantName} from '../../../utils/constants';
import {TenantPage} from '../TenantPage';
import {QueryEditor, QueryMode} from '../queryEditor/QueryEditor';

import executeQueryWithKeybinding from './utils';

export const VISIBILITY_TIMEOUT = 5000;

test.describe('Query History', () => {
let tenantPage: TenantPage;
let queryEditor: QueryEditor;

test.beforeEach(async ({page}) => {
const pageQueryParams = {
schema: tenantName,
name: tenantName,
general: 'query',
};

tenantPage = new TenantPage(page);
await tenantPage.goto(pageQueryParams);
queryEditor = new QueryEditor(page);
});

test('New query appears in history after execution', async ({page}) => {
const testQuery = 'SELECT 1 AS test_column;';

// Execute the query
await queryEditor.run(testQuery, QueryMode.YQLScript);

// Navigate to the history tab
await page.click('text=History');

// Check if the query appears in the history
const historyTable = page.locator('.ydb-queries-history table');
await expect(historyTable.locator(`text="${testQuery}"`)).toBeVisible({
timeout: VISIBILITY_TIMEOUT,
});
});

test('Multiple queries appear in correct order in history', async ({page}) => {
const queries = [
'SELECT 1 AS first_query;',
'SELECT 2 AS second_query;',
'SELECT 3 AS third_query;',
];

// Execute multiple queries
for (const query of queries) {
await queryEditor.run(query, QueryMode.YQLScript);
}

// Navigate to the history tab
await page.click('text=History');

// Check if queries appear in reverse order (most recent first)
const historyTable = page.locator('.ydb-queries-history table');
const rows = historyTable.locator('tbody tr');

await expect(rows).toHaveCount(queries.length);

for (let i = 0; i < queries.length; i++) {
await expect(rows.nth(i)).toContainText(queries[queries.length - 1 - i]);
}
});

test('Query executed with keybinding is saved in history', async ({page, browserName}) => {
const testQuery = 'SELECT 1 AS keybinding_test;';

// Focus on the query editor
await queryEditor.focusEditor();

// Type the query
await page.keyboard.type(testQuery);

// Use the keybinding to execute the query
await executeQueryWithKeybinding(page, browserName);

// Wait for the query to be executed
await page.waitForSelector('.ydb-query-execute-result__result', {timeout: 10000});

// Navigate to the history tab
await page.click('text=History');

// Check if the query appears in the history
const historyTable = page.locator('.ydb-queries-history table');
await expect(historyTable.locator(`text="${testQuery}"`)).toBeVisible();
});
});
24 changes: 24 additions & 0 deletions tests/suites/tenant/queryHistory/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import type {Page} from '@playwright/test';

// eslint-disable-next-line no-implicit-globals
export default async function executeQueryWithKeybinding(page: Page, browserName: string) {
const isMac = process.platform === 'darwin';
const modifierKey = browserName === 'webkit' ? 'Meta' : 'Control';

console.log(`Using ${modifierKey} key for ${browserName}`);

if (browserName !== 'webkit' || isMac) {
await page.keyboard.down(modifierKey);
await page.keyboard.press('Enter');
await page.keyboard.up(modifierKey);
} else {
await page.keyboard.press('Meta+Enter');
}

// Log the active element for debugging
const activeElement = await page.evaluate(() => document.activeElement?.tagName);
console.log(`Active element after keybinding: ${activeElement}`);

// Add a small delay to ensure the event is processed
await page.waitForTimeout(1000);
}
Loading