174 lines
5.5 KiB
TypeScript
174 lines
5.5 KiB
TypeScript
import * as fs from 'fs'
|
|
import * as os from 'os'
|
|
import * as path from 'path'
|
|
|
|
import { ElectronApplication, _electron as electron } from 'playwright'
|
|
|
|
import mockMqtt, { stop as stopMqtt } from './mock-mqtt'
|
|
import { default as MockSparkplug } from './mock-sparkplugb'
|
|
import { clearOldTopics } from './scenarios/clearOldTopics'
|
|
import { clearSearch, searchTree } from './scenarios/searchTree'
|
|
import { clickOnHistory, createFakeMousePointer, hideText, showText, sleep } from './util'
|
|
import { connectTo } from './scenarios/connect'
|
|
import { copyTopicToClipboard } from './scenarios/copyTopicToClipboard'
|
|
import { copyValueToClipboard } from './scenarios/copyValueToClipboard'
|
|
import { disconnect } from './scenarios/disconnect'
|
|
import { publishTopic } from './scenarios/publishTopic'
|
|
import { Scene, SceneBuilder } from './SceneBuilder'
|
|
import { showAdvancedConnectionSettings } from './scenarios/showAdvancedConnectionSettings'
|
|
import { showJsonPreview } from './scenarios/showJsonPreview'
|
|
import { showMenu } from './scenarios/showMenu'
|
|
import { showNumericPlot } from './scenarios/showNumericPlot'
|
|
import { showOffDiffCapability } from './scenarios/showOffDiffCapability'
|
|
import { showZoomLevel } from './scenarios/showZoomLevel'
|
|
import { showSparkPlugDecoding } from './scenarios/showSparkplugDecoding'
|
|
|
|
/**
|
|
* A convenience method that handles gracefully cleaning up the test run.
|
|
*/
|
|
const cleanUp = async (scenes: SceneBuilder, electronApp: ElectronApplication) => {
|
|
// Exit app.
|
|
fs.writeFileSync('scenes.json', JSON.stringify(scenes.scenes, undefined, ' '))
|
|
await electronApp.close()
|
|
}
|
|
|
|
process.on('unhandledRejection', (error: Error | any) => {
|
|
console.error('unhandledRejection', error.message, error.stack)
|
|
process.exit(1)
|
|
})
|
|
|
|
setTimeout(
|
|
() => {
|
|
console.error('Timeout reached')
|
|
process.exit(1)
|
|
},
|
|
60 * 10 * 1000
|
|
)
|
|
|
|
const runningUiTestOnCi = os.platform() === 'darwin' ? [] : ['--runningUiTestOnCi']
|
|
|
|
async function doStuff() {
|
|
console.log('Waiting for MQTT Broker on port 1880 (no auth)')
|
|
await mockMqtt()
|
|
|
|
console.log('Starting playwright/electron')
|
|
|
|
// Launch Electron app.
|
|
const electronApp: ElectronApplication = await electron.launch({
|
|
args: [`${__dirname}/../../..`, ...runningUiTestOnCi],
|
|
})
|
|
|
|
console.log('Playwright started')
|
|
// Get the first window that the app opens, wait if necessary.
|
|
const page = await electronApp.firstWindow({ timeout: 3000 })
|
|
// Print the title.
|
|
console.log(await page.title())
|
|
// Capture a screenshot.
|
|
await page.screenshot({ path: 'intro.png' })
|
|
// Direct Electron console to Node terminal.
|
|
page.on('console', console.log)
|
|
|
|
// Wait for Username input to be visible
|
|
await page.locator('//label[contains(text(), "Username")]/..//input')
|
|
|
|
const scenes = new SceneBuilder()
|
|
await scenes.record('connect', async () => {
|
|
await connectTo('127.0.0.1', page)
|
|
await MockSparkplug.run() // Start sparkplug client after connect or birth topics will be missed
|
|
await sleep(1000)
|
|
})
|
|
|
|
await scenes.record('numeric_plots', async () => {
|
|
await showText('Plot topic history', 1500, page)
|
|
await showNumericPlot(page)
|
|
await sleep(2000)
|
|
})
|
|
|
|
await scenes.record('json-formatting', async () => {
|
|
await showJsonPreview(page)
|
|
await showText('Formatted messages', 1500, page, 'top')
|
|
await sleep(1500)
|
|
})
|
|
|
|
await scenes.record('diffs', async () => {
|
|
await showOffDiffCapability(page)
|
|
await hideText(page)
|
|
})
|
|
|
|
// disable this scenario for now until expandTopic is sorted out
|
|
// await scenes.record('publish_topic', async () => {
|
|
// await showText('Publish topics', 1500, page, 'top')
|
|
// await clickOnHistory(page)
|
|
// await publishTopic(page)
|
|
// await sleep(1000)
|
|
// })
|
|
|
|
await scenes.record('clipboard', async () => {
|
|
await showText('Copy to Clipboard', 1500, page)
|
|
await copyTopicToClipboard(page)
|
|
await hideText(page)
|
|
await copyValueToClipboard(page)
|
|
await sleep(1000)
|
|
})
|
|
|
|
await scenes.record('topic_filter', async () => {
|
|
await showText('Search topic hierarchy', 0, page, 'middle')
|
|
await searchTree('temp', page)
|
|
await hideText(page)
|
|
await showText('Topics containing "temp"', 1500, page)
|
|
await sleep(1500)
|
|
await clearSearch(page)
|
|
await sleep(1000)
|
|
})
|
|
|
|
await scenes.record('sparkplugb-decoding', async () => {
|
|
await showText('SparkplugB Decoding', 2000, page, 'top')
|
|
await showSparkPlugDecoding(page)
|
|
})
|
|
|
|
// disable this scenario for now until expandTopic is sorted out
|
|
// await scenes.record('delete_retained_topics', async () => {
|
|
// await hideText(page)
|
|
// await showText('Delete retained topics', 5000, page)
|
|
// await clearOldTopics(page)
|
|
// await hideText(page)
|
|
// })
|
|
|
|
await scenes.record('settings', async () => {
|
|
await showText('Settings', 1500, page)
|
|
await showMenu(page)
|
|
})
|
|
|
|
await scenes.record('customize_subscriptions', async () => {
|
|
await sleep(2000)
|
|
await disconnect(page)
|
|
await showText('Customize Subscriptions', 1500, page, 'top')
|
|
await showAdvancedConnectionSettings(page)
|
|
})
|
|
|
|
await scenes.record('keyboard_shortcuts', async () => {
|
|
await showText('Keyboard shortcuts', 1500, page, 'middle')
|
|
await sleep(1750)
|
|
await showZoomLevel(page)
|
|
})
|
|
|
|
await scenes.record('end', async () => {
|
|
await showText('The End', 3000, page, 'middle')
|
|
await sleep(3000)
|
|
})
|
|
|
|
setTimeout(() => {
|
|
console.log('Forced quit')
|
|
process.exit(0)
|
|
}, 10 * 1000)
|
|
stopMqtt()
|
|
console.log('Stopped mqtt client')
|
|
|
|
cleanUp(scenes, electronApp)
|
|
|
|
// Force exit since there appear to be open handles
|
|
process.exit(0)
|
|
}
|
|
|
|
doStuff()
|