hana-cli
Version:
HANA Developer Command Line Interface
222 lines (187 loc) • 6.51 kB
JavaScript
// @ts-check
/// <reference types="@wdio/globals/types" />
/**
* @module tablesUI.ui.test - WDI5 UI Tests for SAPUI5 Tables Interface
*
* These tests validate the actual SAPUI5 UI functionality including:
* - Page navigation and loading
* - UI5 control rendering and visibility
* - User interactions (clicks, input, selection)
* - Data binding and table display
* - UI state and behavior validation
*/
describe('TablesUI - SAPUI5 Interface Tests', function() {
this.timeout(60000)
const BASE_URL = 'http://localhost:3010'
const UI_PATH = '/ui/tables/index.html'
before(async function() {
// Navigate to the tables UI
await browser.url(BASE_URL + UI_PATH)
await browser.waitForUI5()
})
describe('Page Structure', () => {
it('should load the tables UI page', async () => {
const title = await browser.getTitle()
expect(title).toContain('Tables')
})
it('should display the SAPUI5 application', async () => {
// Check if the UI5 root element exists
const ui5Root = await $('[data-sap-ui-area]')
await expect(ui5Root).toBeDisplayed()
})
it('should initialize the tables component', async () => {
// Wait for component to be available
const componentExists = await browser.executeAsync((done) => {
sap.ui.require(['sap/ui/core/Component'], function(Component) {
const components = Component.registry.all()
const tablesComponent = components.find(c =>
c.getMetadata().getName() === 'sap.hanacli.tables.Component'
)
done(!!tablesComponent)
})
})
expect(componentExists).toBe(true)
})
})
describe('Tables Display', () => {
it('should display the tables table control', async () => {
const table = await browser.asControl({
selector:{
id: /__table\d+/,
controlType: 'sap.m.Table',
viewName: 'sap.hanacli.tables.view.App'
}
})
await expect(table).toBeDefined()
})
it('should have table columns defined', async () => {
const columns = await browser.asControl({
selector: {
controlType: 'sap.m.Column',
viewName: 'sap.hanacli.tables.view.App',
ancestor: {
controlType: 'sap.m.Table'
}
}
})
expect(columns).toBeDefined()
})
it('should display schema column header', async () => {
const headersExist = await browser.execute(() => {
const columns = document.querySelectorAll('.sapMListTblHeaderCell')
return columns.length > 0
})
expect(headersExist).toBe(true)
})
})
describe('Data Loading', () => {
it('should load table data from the backend', async () => {
// Wait for data to be loaded
await browser.pause(2000)
const hasData = await browser.execute(() => {
const rows = document.querySelectorAll('.sapMLIB')
return rows.length > 0
})
// May not have data if no DB connection, so just verify the structure exists
expect(typeof hasData).toBe('boolean')
})
it('should display table rows when data is available', async () => {
const items = await browser.asControl({
selector: {
controlType: 'sap.m.ColumnListItem',
viewName: 'sap.hanacli.tables.view.App'
}
})
// Check if items exist (may be empty if no DB connection)
expect(items).toBeDefined()
})
})
describe('UI Controls', () => {
it('should have a search field', async () => {
const searchField = await browser.asControl({
selector: {
controlType: 'sap.m.SearchField',
viewName: 'sap.hanacli.tables.view.App'
}
})
if (searchField) {
await expect(searchField).toBeDefined()
}
})
it('should have action buttons or toolbar', async () => {
const toolbar = await browser.asControl({
selector: {
controlType: 'sap.m.OverflowToolbar',
viewName: 'sap.hanacli.tables.view.App'
}
})
if (toolbar) {
await expect(toolbar).toBeDefined()
}
})
})
describe('User Interactions', () => {
it('should allow searching tables', async () => {
const searchField = await browser.asControl({
selector: {
controlType: 'sap.m.SearchField',
viewName: 'sap.hanacli.tables.view.App'
}
})
if (searchField) {
// Enter search text
await searchField.enterText('TEST')
await browser.pause(500)
// Verify search was performed (UI updated)
const searchValue = await searchField.getValue()
expect(searchValue).toBe('TEST')
}
})
it('should allow clearing search', async () => {
const searchField = await browser.asControl({
selector: {
controlType: 'sap.m.SearchField',
viewName: 'sap.hanacli.tables.view.App'
}
})
if (searchField) {
await searchField.enterText('')
await browser.pause(500)
const searchValue = await searchField.getValue()
expect(searchValue).toBe('')
}
})
})
describe('Responsive Behavior', () => {
it('should adapt to different screen sizes', async () => {
// Test desktop size
await browser.setWindowSize(1920, 1080)
await browser.pause(500)
const desktopLayout = await browser.execute(() => {
return Math.abs(window.innerWidth - 1920) <= 40
})
expect(desktopLayout).toBe(true)
// Test mobile size
await browser.setWindowSize(375, 667)
await browser.pause(500)
const mobileLayout = await browser.execute(() => {
return Math.abs(window.innerWidth - 375) <= 10
})
expect(mobileLayout).toBe(true)
// Restore desktop size
await browser.setWindowSize(1920, 1080)
})
})
describe('Error Handling', () => {
it('should display error messages when backend fails', async () => {
// This would be tested with a mock backend or invalid configuration
const messagePopover = await browser.asControl({
selector: {
controlType: 'sap.m.MessagePopover'
}
})
// May not exist if no errors, which is fine
expect(typeof messagePopover).toBeDefined()
})
})
})