mirror of https://github.com/grafana/grafana.git
Search e2e (#102827)
* search e2e * add github action * run test for every ini file in test folder
This commit is contained in:
parent
cd53070a00
commit
2489e423d0
|
|
@ -816,6 +816,7 @@ embed.go @grafana/grafana-as-code
|
|||
/.github/workflows/verify-kinds.yml @grafana/platform-monitoring
|
||||
/.github/workflows/dashboards-issue-add-label.yml @grafana/dashboards-squad
|
||||
/.github/workflows/run-schema-v2-e2e.yml @grafana/dashboards-squad
|
||||
/.github/workflows/run-dashboard-search-e2e.yml @grafana/grafana-search-and-storage
|
||||
/.github/workflows/ephemeral-instances-pr-comment.yml @grafana/grafana-backend-services-squad
|
||||
/.github/workflows/create-security-patch-from-security-mirror.yml @grafana/grafana-developer-enablement-squad
|
||||
/.github/workflows/core-plugins-build-and-release.yml @grafana/plugins-platform-frontend @grafana/plugins-platform-backend
|
||||
|
|
|
|||
|
|
@ -0,0 +1,121 @@
|
|||
name: Run dashboard search e2e
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
env:
|
||||
ARCH: linux-amd64
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
outputs:
|
||||
ini_files: ${{ steps.get_files.outputs.ini_files }}
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Pin Go version to mod file
|
||||
uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version-file: 'go.mod'
|
||||
cache: true
|
||||
- run: go version
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: 'yarn'
|
||||
- name: Cache Node Modules
|
||||
id: cache-node-modules
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
node_modules
|
||||
/home/runner/.cache/Cypress
|
||||
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
|
||||
- name: Install dependencies
|
||||
if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
||||
run: yarn install --immutable
|
||||
- name: Install Cypress dependencies
|
||||
if: steps.cache-node-modules.outputs.cache-hit != 'true'
|
||||
uses: cypress-io/github-action@v6
|
||||
with:
|
||||
runTests: false
|
||||
- name: Cache Grafana Build and Dependencies
|
||||
id: cache-grafana
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
bin/
|
||||
scripts/grafana-server/
|
||||
tools/
|
||||
public/
|
||||
conf/
|
||||
e2e/test-plugins/
|
||||
devenv/
|
||||
key: ${{ runner.os }}-grafana-${{ hashFiles('go.mod', 'package-lock.json', 'Makefile', 'pkg/storage/**/*.go', 'public/app/features/search/**/*.ts', 'public/app/features/search/**/*.tsx') }}
|
||||
# only rebuild grafana if search files have changed ( or dependencies )
|
||||
- name: Build Grafana (Runs Only If Not Cached)
|
||||
if: steps.cache-grafana.outputs.cache-hit != 'true'
|
||||
run: make build
|
||||
|
||||
- name: Get list of .ini files
|
||||
id: get_files
|
||||
run: |
|
||||
INI_FILES=$(ls ${{ github.workspace }}/e2e/dashboards-search-suite/*.ini | jq -R -s -c 'split("\n")[:-1]')
|
||||
echo "ini_files=$INI_FILES" >> $GITHUB_OUTPUT
|
||||
shell: bash
|
||||
|
||||
run_tests:
|
||||
needs: setup
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
if: github.event.pull_request.draft == false
|
||||
strategy:
|
||||
matrix:
|
||||
ini_file: ${{ fromJson(needs.setup.outputs.ini_files) }}
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Restore Cached Node Modules
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
node_modules
|
||||
/home/runner/.cache/Cypress
|
||||
key: foo
|
||||
|
||||
- name: Restore Cached Grafana Build and Dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
bin/
|
||||
scripts/grafana-server/
|
||||
tools/
|
||||
public/
|
||||
conf/
|
||||
e2e/test-plugins/
|
||||
devenv/
|
||||
key: ${{ runner.os }}-grafana-${{ hashFiles('go.mod', 'package-lock.json', 'Makefile', 'pkg/storage/**/*.go', 'public/app/features/search/**/*.ts', 'public/app/features/search/**/*.tsx') }}
|
||||
- name: Prettify the name
|
||||
run: echo "Running tests for $(basename "${{ matrix.ini_file }}")"
|
||||
- name: Set the step name
|
||||
id: set_file_name
|
||||
run: |
|
||||
FILE_NAME=$(basename "${{ matrix.ini_file }}" .ini)
|
||||
echo "FILE_NAME=$FILE_NAME" >> $GITHUB_ENV
|
||||
- name: Run tests for ${{ env.FILE_NAME }}
|
||||
run: |
|
||||
cp -rf ${{ matrix.ini_file }} ${{ github.workspace }}/scripts/grafana-server/custom.ini
|
||||
yarn e2e:dashboards-search || echo "Test failed but marking as success since unified search is behind a feature flag and should not block PRs"
|
||||
- name: Always succeed # This is a workaround to make the job pass even if the previous step fails
|
||||
if: failure()
|
||||
run: exit 0
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
import { e2e } from '../utils';
|
||||
|
||||
const rowGroup = '[role="rowgroup"]';
|
||||
const row = '[role="row"]';
|
||||
const searchInput = '[data-testid="input-wrapper"]';
|
||||
|
||||
describe('Dashboard search', () => {
|
||||
beforeEach(() => {
|
||||
e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD'));
|
||||
});
|
||||
|
||||
it('Search - Dashboards list', () => {
|
||||
e2e.pages.Dashboards.visit();
|
||||
|
||||
toggleSearchView();
|
||||
|
||||
assertResultsCount(24);
|
||||
});
|
||||
|
||||
it('Search - Filter by search input', () => {
|
||||
e2e.pages.Dashboards.visit();
|
||||
|
||||
toggleSearchView();
|
||||
|
||||
assertResultsCount(24);
|
||||
|
||||
// prefix match
|
||||
cy.get(searchInput).type('Datasource tests - MySQL');
|
||||
assertResultsCount(2);
|
||||
|
||||
cy.get(searchInput).type('{selectall}{backspace}'); // clear input
|
||||
|
||||
// exact match
|
||||
cy.get(searchInput).type('Datasource tests - MySQL (unittest)');
|
||||
assertResultsCount(1);
|
||||
|
||||
cy.get(searchInput).type('{selectall}{backspace}'); // clear input
|
||||
|
||||
// suffix match
|
||||
cy.get(searchInput).type('- MySQL');
|
||||
assertResultsCount(1);
|
||||
});
|
||||
});
|
||||
|
||||
const assertResultsCount = (length: number) => {
|
||||
e2e.pages.SearchDashboards.table().should('exist');
|
||||
|
||||
const table = e2e.pages.SearchDashboards.table();
|
||||
const group = table.find(rowGroup);
|
||||
group.should('have.length', 1);
|
||||
const rows = group.find(row);
|
||||
rows.should('have.length', length);
|
||||
};
|
||||
|
||||
const toggleSearchView = () => {
|
||||
e2e.pages.Dashboards.toggleView().each((e, i) => {
|
||||
if (i === 1) {
|
||||
cy.wrap(e).click();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = true
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 0
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 0
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = true
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 1
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 1
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = false
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 2
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 2
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = true
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 2
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 2
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = true
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 3
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 3
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = true
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 4
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 4
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
[server]
|
||||
|
||||
[feature_toggles]
|
||||
kubernetesFolders = true
|
||||
unifiedStorageSearch = true
|
||||
unifiedStorageSearchUI = true
|
||||
grafanaAPIServerWithExperimentalAPIs = true
|
||||
kubernetesDashboardsAPI = true
|
||||
kubernetesCliDashboards = true
|
||||
unifiedStorageSearchSprinkles = true
|
||||
kubernetesFoldersServiceV2 = true
|
||||
unifiedStorageSearchPermissionFiltering = true
|
||||
kubernetesClientDashboardsFolders = true
|
||||
|
||||
[unified_storage.folders.folder.grafana.app]
|
||||
dualWriterMode = 5
|
||||
|
||||
[unified_storage.dashboards.dashboard.grafana.app]
|
||||
dualWriterMode = 5
|
||||
|
|
@ -29,6 +29,7 @@ testFilesForSingleSuite="*.spec.ts"
|
|||
rootForEnterpriseSuite="./e2e/extensions-suite"
|
||||
rootForOldArch="./e2e/old-arch"
|
||||
rootForKubernetesDashboards="./e2e/dashboards-suite"
|
||||
rootForSearchDashboards="./e2e/dashboards-search-suite"
|
||||
|
||||
declare -A cypressConfig=(
|
||||
[screenshotsFolder]=./e2e/"${args[0]}"/screenshots
|
||||
|
|
@ -130,6 +131,24 @@ case "$1" in
|
|||
;;
|
||||
esac
|
||||
;;
|
||||
"dashboards-search")
|
||||
env[kubernetesDashboards]=true
|
||||
cypressConfig[specPattern]=$rootForSearchDashboards/$testFilesForSingleSuite
|
||||
cypressConfig[video]=false
|
||||
case "$2" in
|
||||
"debug")
|
||||
echo -e "Debug mode"
|
||||
env[SLOWMO]=1
|
||||
PARAMS="--no-exit"
|
||||
enterpriseSuite=$(basename "${args[2]}")
|
||||
;;
|
||||
"dev")
|
||||
echo "Dev mode"
|
||||
CMD="cypress open"
|
||||
enterpriseSuite=$(basename "${args[2]}")
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
"enterprise-smtp")
|
||||
env[SMTP_PLUGIN_ENABLED]=true
|
||||
cypressConfig[specPattern]=./e2e/extensions/enterprise/smtp-suite/$testFilesForSingleSuite
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
"e2e": "./e2e/start-and-run-suite",
|
||||
"e2e:old-arch": "./e2e/start-and-run-suite old-arch",
|
||||
"e2e:schema-v2": "./e2e/start-and-run-suite dashboards-schema-v2",
|
||||
"e2e:dashboards-search": "./e2e/start-and-run-suite dashboards-search",
|
||||
"e2e:debug": "./e2e/start-and-run-suite debug",
|
||||
"e2e:dev": "./e2e/start-and-run-suite dev",
|
||||
"e2e:benchmark:live": "./e2e/start-and-run-suite benchmark live",
|
||||
|
|
|
|||
|
|
@ -569,6 +569,9 @@ export const versionedPages = {
|
|||
dashboards: {
|
||||
'10.2.0': (title: string) => `Dashboard search item ${title}`,
|
||||
},
|
||||
toggleView: {
|
||||
[MIN_GRAFANA_VERSION]: 'data-testid radio-button',
|
||||
},
|
||||
},
|
||||
SaveDashboardAsModal: {
|
||||
newName: {
|
||||
|
|
@ -945,6 +948,11 @@ export const versionedPages = {
|
|||
},
|
||||
},
|
||||
},
|
||||
SearchDashboards: {
|
||||
table: {
|
||||
'10.2.0': 'Search results table',
|
||||
},
|
||||
},
|
||||
Search: {
|
||||
url: {
|
||||
'9.3.0': '/?search=openn',
|
||||
|
|
|
|||
Loading…
Reference in New Issue