Adding cucumber tests

This commit is contained in:
Daniel
2021-03-03 22:47:23 +01:00
parent cf10129b68
commit 83537482b8
4 changed files with 117 additions and 3 deletions

View File

@@ -0,0 +1,77 @@
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)
})
Given('we login as {string}, {string}', async (username, password) => {
const alert = await browser.switchTo().alert()
return alert.authenticateAs(username, password)
})