83 lines
2.7 KiB
JavaScript
83 lines
2.7 KiB
JavaScript
const { Given, When, Then, AfterAll } = require('@cucumber/cucumber')
|
|
const { Builder, By } = require('selenium-webdriver')
|
|
const browser = (new Builder).forBrowser('safari').build()
|
|
const cds = require ('@sap/cds/lib')
|
|
|
|
process.env.cds_requires_auth_strategy = 'dummy'
|
|
|
|
let axios = require('axios').default
|
|
let {display} = browser
|
|
|
|
When('we run the {string} server', project => cds.exec('watch', project))
|
|
Then('it should listen at {string}', baseURL => {
|
|
axios = axios.create({ baseURL })
|
|
display = url => browser.get (baseURL+url)
|
|
return axios.head()
|
|
})
|
|
Then('terminate the server', ()=> process.exit())
|
|
|
|
|
|
|
|
When(/wait for (\d+)\s*(\w+)/, {timeout:60*1000}, (delay, unit, done) => {
|
|
const factor = {
|
|
ms: 1,
|
|
s: 1000, sec: 1000, second: 1000, seconds: 1000,
|
|
m: 60*1000, min: 60*1000, minute: 60*1000, minutes: 60*1000,
|
|
h: 60*60*1000, hr: 60*60*1000, hour: 60*60*1000, hours: 60*60*1000,
|
|
}[unit]
|
|
if (!factor) throw `Unknown duration unit: ${unit}`
|
|
setTimeout (done, delay * factor)
|
|
})
|
|
|
|
AfterAll(()=> setTimeout (process.exit, 111))
|
|
|
|
|
|
|
|
|
|
|
|
When('we open page {string}', page => display(page))
|
|
|
|
Then('it should list these rows in table {string}:', async (id,data) => {
|
|
let rows = await browser.findElements(By.css(`#${id} tr`)); rows.shift()
|
|
await Promise.all (data.rawTable.map (async (row,i)=>{
|
|
const tr = await rows[i].getText()
|
|
for (let each of row) if (!tr.match(each)) throw `Didn't find '${each}' in web page as expected`
|
|
}))
|
|
})
|
|
|
|
When(/we click on the (\d+)(?:st|nd|rd|th) row in table '(\w+)'/, async (row, id) => {
|
|
let rows = await browser.findElements(By.css(`#${id} tr`))
|
|
let td = await rows[row].findElement(By.css('td'))
|
|
return td.click()
|
|
})
|
|
|
|
When('we enter {string} into {string}', async (value,id) => {
|
|
const field = await browser.findElement(By.css(`input#${id}`))
|
|
return field.sendKeys('\b\b\b\b\b\b',value)
|
|
})
|
|
|
|
When('we click on button {string}', async (text) => {
|
|
const button = await browser.findElement(By.css(`input[value='${text}']`))
|
|
return button.click()
|
|
})
|
|
|
|
Then('it succeeds with {string}', async message => {
|
|
const element = await browser.wait (browser.findElement(By.css(`span.succeeded`)))
|
|
return (await element.getText()).includes(message)
|
|
})
|
|
|
|
Then('it fails with {string}', async message => {
|
|
const element = await browser.wait (browser.findElement(By.css(`span.failed`)))
|
|
return (await element.getText()).includes(message)
|
|
})
|
|
|
|
Then('it shows {string} in {string}', async (message,id) => {
|
|
const element = await browser.wait (browser.findElement(By.id(id)))
|
|
return (await element.getText()).includes(message)
|
|
})
|
|
|
|
Given('we login as {string}, {string}', async (username, password) => {
|
|
const alert = await browser.switchTo().alert()
|
|
return alert.authenticateAs(username, password)
|
|
})
|