diff --git a/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts b/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts index 1a626fa25d..b82e7f6649 100644 --- a/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts +++ b/tests/playwright/pages/Dashboard/common/Toolbar/Filter.ts @@ -1,6 +1,7 @@ import { expect } from '@playwright/test'; import BasePage from '../../../Base'; import { ToolbarPage } from './index'; +import { UITypes } from 'nocodb-sdk'; export class ToolbarFilterPage extends BasePage { readonly toolbar: ToolbarPage; @@ -33,11 +34,13 @@ export class ToolbarFilterPage extends BasePage { opType, value, isLocallySaved, + dataType, }: { columnTitle: string; opType: string; value?: string; isLocallySaved: boolean; + dataType?: string; }) { await this.get().locator(`button:has-text("Add Filter")`).first().click(); @@ -86,14 +89,25 @@ export class ToolbarFilterPage extends BasePage { // if value field was provided, fill it if (value) { - const fillFilter = this.rootPage.locator('.nc-filter-value-select > input').last().fill(value); - await this.waitForResponse({ - uiAction: fillFilter, - httpMethodsToMatch: ['GET'], - requestUrlPathToMatch: isLocallySaved ? `/api/v1/db/public/` : `/api/v1/db/data/noco/`, - }); - await this.toolbar.parent.dashboard.waitForLoaderToDisappear(); - await this.toolbar.parent.waitLoading(); + let fillFilter: any = null; + switch (dataType) { + case UITypes.Rating: + await this.get('.nc-filter-value-select') + .locator('.ant-rate-star > div') + .nth(parseInt(value) - 1) + .click(); + break; + default: + fillFilter = this.rootPage.locator('.nc-filter-value-select > input').last().fill(value); + await this.waitForResponse({ + uiAction: fillFilter, + httpMethodsToMatch: ['GET'], + requestUrlPathToMatch: isLocallySaved ? `/api/v1/db/public/` : `/api/v1/db/data/noco/`, + }); + await this.toolbar.parent.dashboard.waitForLoaderToDisappear(); + await this.toolbar.parent.waitLoading(); + break; + } } } diff --git a/tests/playwright/tests/filters.spec.ts b/tests/playwright/tests/filters.spec.ts index 774a70aac0..48d949ac51 100644 --- a/tests/playwright/tests/filters.spec.ts +++ b/tests/playwright/tests/filters.spec.ts @@ -36,7 +36,13 @@ async function validateRowArray(param) { // } } -async function verifyFilter(param: { column: string; opType: string; value?: string; result: { rowCount: number } }) { +async function verifyFilter(param: { + column: string; + opType: string; + value?: string; + result: { rowCount: number }; + dataType?: string; +}) { // if opType was included in skip list, skip it if (skipList[param.column]?.includes(param.opType)) { return; @@ -48,6 +54,7 @@ async function verifyFilter(param: { column: string; opType: string; value?: str opType: param.opType, value: param.value, isLocallySaved: false, + dataType: param?.dataType, }); await toolbar.clickFilter(); @@ -414,4 +421,74 @@ test.describe('Filter Tests: Numerical', () => { }); } }); + + test('Filter: Rating', async () => { + // close 'Team & Auth' tab + await dashboard.closeTab({ title: 'Team & Auth' }); + await dashboard.treeView.openTable({ title: 'numberBased' }); + const dataType = 'Rating'; + + const filterList = [ + { + op: '=', + value: '3', + rowCount: records.list.filter(r => r[dataType] === 3).length, + }, + { + op: '!=', + value: '3', + rowCount: records.list.filter(r => r[dataType] !== 3).length, + }, + { + op: 'is null', + value: '', + rowCount: records.list.filter(r => r[dataType] === null).length, + }, + { + op: 'is not null', + value: '', + rowCount: records.list.filter(r => r[dataType] !== null).length, + }, + { + op: 'is blank', + value: '', + rowCount: records.list.filter(r => r[dataType] === null).length, + }, + { + op: 'is not blank', + value: '', + rowCount: records.list.filter(r => r[dataType] !== null).length, + }, + { + op: '>', + value: '2', + rowCount: records.list.filter(r => r[dataType] > 2 && r[dataType] != null).length, + }, + { + op: '>=', + value: '2', + rowCount: records.list.filter(r => r[dataType] >= 2 && r[dataType] != null).length, + }, + { + op: '<', + value: '2', + rowCount: records.list.filter(r => r[dataType] < 2 && r[dataType] != null).length, + }, + { + op: '<=', + value: '2', + rowCount: records.list.filter(r => r[dataType] <= 2 && r[dataType] != null).length, + }, + ]; + + for (let i = 0; i < filterList.length; i++) { + await verifyFilter({ + column: dataType, + opType: filterList[i].op, + value: filterList[i].value, + result: { rowCount: filterList[i].rowCount }, + dataType: dataType, + }); + } + }); });