Env variables & data files

Changes as per PR
-Created files for transformer queries - tests updated accordingly
-Updates for Env variables and usage
-Changes surrounding App Rename testing
This commit is contained in:
Mitch-Budibase 2021-11-18 13:47:41 +00:00
parent 348c4ed75b
commit 7ba79a8982
9 changed files with 134 additions and 103 deletions

View File

@ -1,9 +1,11 @@
{
"baseUrl": "http://localhost:10001/builder/",
"baseUrl": "http://localhost:10001",
"video": true,
"projectId": "bmbemn",
"env": {
"PORT": "10001",
"JWT_SECRET": "test"
"JWT_SECRET": "test",
"HOST_IP": "",
"TEST_ENV" : true
}
}

View File

@ -2,7 +2,7 @@ context("Create an Application", () => {
it("should create a new application", () => {
cy.login()
cy.createTestApp()
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.contains("Cypress Tests").should("exist")
})
})

View File

@ -19,7 +19,7 @@ context("Create a User and Assign Roles", () => {
it("should assign role types", () => {
// 3 apps minimum required - to assign an app to each role type
cy.request(`localhost:${Cypress.env("PORT")}/api/applications?status=all`)
cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`)
.its("body")
.then(val => {
if (val.length < 3) {
@ -31,7 +31,7 @@ context("Create a User and Assign Roles", () => {
}
})
// Navigate back to the user
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.wait(1000)
cy.get(".spectrum-SideNav").contains("Users").click()
cy.get(".spectrum-Table").contains("bbuser").click()
@ -54,6 +54,7 @@ context("Create a User and Assign Roles", () => {
})
}
// Confirm roles exist within Configure roles table
cy.wait(500)
cy.get(".spectrum-Table-body").eq(0).within((assginedRoles) => {
expect(assginedRoles).to.contain("Admin")
expect(assginedRoles).to.contain("Power")
@ -83,11 +84,12 @@ context("Create a User and Assign Roles", () => {
it("should enable Developer access", () => {
// Enable Developer access
cy.get(".field").eq(4).within(() => {
cy.get(".spectrum-Form-item").click()
cy.get(".spectrum-Switch-input").click({ force: true })
})
// No Access table should now be empty
cy.get(".container").contains("No Access").parent().within(() => {
cy.get(".spectrum-Table").contains("No rows found")
})
// Each app within Configure roles should have Admin access
cy.get(".spectrum-Table-body").eq(0).find('tr').its('length').then((len) => {
@ -97,12 +99,11 @@ context("Create a User and Assign Roles", () => {
}
})
})
})
it("should disable Developer access", () => {
// Disable Developer access
cy.get(".field").eq(4).within(() => {
cy.get(".spectrum-Form-item").click()
cy.get(".spectrum-Switch-input").click({ force: true })
})
// Configure roles table should now be empty
cy.get(".container").contains("Configure roles").parent().within(() => {

View File

@ -1,32 +1,35 @@
context("Add and Configure External Data Sources", () => {
before(() => {
cy.login()
cy.createTestApp()
cy.login()
cy.createTestApp()
})
it("should add and configure a PostgreSQL data source", () => {
// Select PostgreSQL datasource and add config
const datasource = "PostgreSQL"
cy.selectExternalDatasource(datasource)
cy.addSqlDatasourceConfig(datasource)
// Confirm fetch tables was successful
cy.get(".query-list").then(() => {
cy.get(".query-list-item").should('exist')
// PostgreSQL/MySQL tests currently only run in TEST environment
if (Cypress.env("TEST_ENV")) {
it("should add and configure a PostgreSQL data source", () => {
// Select PostgreSQL datasource and add config
const datasource = "PostgreSQL"
cy.selectExternalDatasource(datasource)
cy.addSqlDatasourceConfig(datasource)
// Confirm fetch tables was successful
cy.get(".query-list").then(() => {
cy.get(".query-list-item").should('exist')
})
})
})
it("should add and configure a MySQL data source", () => {
// Select MySQL datasource and add config
const datasource = "MySQL"
cy.selectExternalDatasource(datasource)
cy.addSqlDatasourceConfig(datasource)
// Confirm fetch tables was successful
cy.get(".query-list").then(() => {
cy.get(".query-list-item").should('exist')
it("should add and configure a MySQL data source", () => {
// Select MySQL datasource and add config
const datasource = "MySQL"
cy.selectExternalDatasource(datasource)
cy.addSqlDatasourceConfig(datasource)
// Confirm fetch tables was successful
cy.get(".query-list").then(() => {
cy.get(".query-list-item").should('exist')
})
})
})
}
it("should add and configure a REST data source", () => {
// Select REST datasource and add config

View File

@ -13,7 +13,15 @@ context("Query Level Transformers", () => {
// Add Query
cy.get(".spectrum-Button").contains("Add Query").click({ force: true })
cy.wait(500)
addTransformerQuery()
// Get Transformer Function from file
cy.readFile("cypress/support/queryLevelTransformerFunction.js").then((transformerFunction) => {
console.log(transformerFunction[1])
cy.get(".CodeMirror textarea")
// Highlight current text and overwrite with file contents
.type(Cypress.platform === 'darwin' ? '{cmd}a' : '{ctrl}a', { force: true })
.type(transformerFunction, { parseSpecialCharSequences: false })
})
// Run Query
cy.get(".spectrum-Button").contains("Run Query").click({ force: true })
cy.wait(500)
@ -30,7 +38,14 @@ context("Query Level Transformers", () => {
// Add Query
cy.get(".spectrum-Button").contains("Add Query").click({ force: true })
cy.wait(500)
addTransformerQuery(true)
// Get Transformer Function with Data from file
cy.readFile("cypress/support/queryLevelTransformerFunctionWithData.js").then((transformerFunction) => {
console.log(transformerFunction[1])
cy.get(".CodeMirror textarea")
// Highlight current text and overwrite with file contents
.type(Cypress.platform === 'darwin' ? '{cmd}a' : '{ctrl}a', { force: true })
.type(transformerFunction, { parseSpecialCharSequences: false })
})
// Run Query
cy.get(".spectrum-Button").contains("Run Query").click({ force: true })
cy.wait(500)
@ -43,7 +58,7 @@ context("Query Level Transformers", () => {
it("should run an invalid query via POST request", () => {
// POST request with transformer as null
cy.request({method: 'POST',
url: 'https://test.budi.live/api/queries/',
url: `${Cypress.config().baseUrl}/api/queries/`,
body: {fields : {"headers":{},"queryString":null,"path":null},
parameters : [],
schema : {},
@ -61,7 +76,7 @@ context("Query Level Transformers", () => {
it("should run an empty query", () => {
// POST request with Transformer as an empty string
cy.request({method: 'POST',
url: 'https://test.budi.live/api/queries/preview',
url: `${Cypress.config().baseUrl}/api/queries/preview`,
body: {fields : {"headers":{},"queryString":null,"path":null},
queryVerb : "read",
transformer : "",
@ -70,55 +85,6 @@ context("Query Level Transformers", () => {
failOnStatusCode: false}).then((response) => {
expect(response.status).to.equal(400)
expect(response.body.message).to.include('Invalid body - "transformer" is not allowed to be empty')
})
})
})
const addTransformerQuery = (addData = false) => {
// Adds query within the Transformer section of Query REST API
cy.get(".CodeMirror textarea")
// Highlight current text within CodeMirror
.type(Cypress.platform === 'darwin' ? '{cmd}a' : '{ctrl}a', { force: true })
// Overwrite current text with function
.type("const breweries = data\n" +
"const totals = {}\n" +
"for (let brewery of breweries) {")
// Delete key in place to remove extra brackets that are added
.type('{del}')
.type("\n const state = brewery.state\n" +
" if (totals[state] == null) {")
.type('{del}')
.type("\n totals[state] = 1\n" +
"} else {")
.type('{del}')
.type("\n totals[state]++\n" +
"}}\n", { parseSpecialCharSequences: false })
if (addData) {
cy.get(".CodeMirror textarea")
.type('const stateCodes = {"texas":"tx",\n' +
'"colorado":"co",\n' +
'"florida":"fl",\n' +
'"iwoa":"ia",\n' +
'"louisiana":"la",\n' +
'"california":"ca",\n' +
'"pennsylvania":"pa",\n' +
'"georgia":"ga",\n' +
'"new hampshire":"nh",\n' +
'"virginia":"va",\n' +
'"michigan":"mi",\n' +
'"maryland":"md",\n' +
'"ohio":"oh"}\n')
.type('const entries = Object.entries(totals)\n' +
"return entries.map(([state, count]) => \n" +
"{ const stateCode = stateCodes[state.toLowerCase()]\n" +
"return {state, count, flag: 'http://flags.ox3.in/svg/us/${stateCode}.svg'",
{ parseSpecialCharSequences: false })
}
else{
cy.get(".CodeMirror textarea")
.type("const entries = Object.entries(totals)\n" +
"return entries.map(([state, count]) => ({state, count}))",
{ parseSpecialCharSequences: false })
}
}
})

View File

@ -5,17 +5,24 @@ context("Rename an App", () => {
})
it("should rename an unpublished application", () => {
const appName = "Cypress Tests"
const appRename = "Cypress Renamed"
// Rename app, Search for app, Confirm name was changed
cy.get(".home-logo").click()
renameApp(appRename)
renameApp(appName, appRename)
cy.reload()
cy.wait(1000)
cy.searchForApplication(appRename)
cy.get(".appGrid").find(".wrapper").should("have.length", 1)
cy.deleteApp(appRename)
// Set app name back to Cypress Tests
cy.reload()
cy.wait(1000)
renameApp(appRename, appName)
})
xit("Should rename a published application", () => {
// It is not possible to rename a published application
const appName = "Cypress Tests"
const appRename = "Cypress Renamed"
// Publish the app
cy.get(".toprightnav")
@ -27,24 +34,28 @@ xit("Should rename a published application", () => {
})
// Rename app, Search for app, Confirm name was changed
cy.get(".home-logo").click()
renameApp(appRename, true)
renameApp(appName, appRename, true)
cy.searchForApplication(appRename)
cy.get(".appGrid").find(".wrapper").should("have.length", 1)
})
it("Should try to rename an application to have no name", () => {
const appName = "Cypress Tests"
cy.get(".home-logo").click()
renameApp(" ", false, true)
renameApp(appName, " ", false, true)
cy.wait(500)
// Close modal and confirm name has not been changed
cy.get(".spectrum-Dialog-grid").contains("Cancel").click()
cy.searchForApplication("Cypress Tests")
cy.reload()
cy.wait(1000)
cy.searchForApplication(appName)
cy.get(".appGrid").find(".wrapper").should("have.length", 1)
})
xit("Should create two applications with the same name", () => {
// It is not possible to have applications with the same name
const appName = "Cypress Tests"
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.wait(500)
cy.get(".spectrum-Button").contains("Create app").click({force: true})
cy.contains(/Start from scratch/).click()
@ -59,18 +70,28 @@ xit("Should create two applications with the same name", () => {
it("should validate application names", () => {
// App name must be letters, numbers and spaces only
// This test checks numbers and special characters specifically
const appName = "Cypress Tests"
const numberName = 12345
const specialCharName = "£$%^"
cy.get(".home-logo").click()
renameApp(numberName)
renameApp(appName, numberName)
cy.reload()
cy.wait(1000)
cy.searchForApplication(numberName)
cy.get(".appGrid").find(".wrapper").should("have.length", 1)
renameApp(specialCharName)
cy.reload()
cy.wait(1000)
renameApp(numberName, specialCharName)
cy.get(".error").should("have.text", "App name must be letters, numbers and spaces only")
// Set app name back to Cypress Tests
cy.reload()
cy.wait(1000)
renameApp(numberName, appName)
})
const renameApp = (appName, published, noName) => {
cy.request(`localhost:${Cypress.env("PORT")}/api/applications?status=all`)
const renameApp = (originalName, changedName, published, noName) => {
cy.searchForApplication(originalName)
cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`)
.its("body")
.then(val => {
if (val.length > 0) {
@ -93,7 +114,7 @@ it("should validate application names", () => {
return cy
}
cy.get("input").clear()
cy.get("input").eq(0).type(appName).should("have.value", appName).blur()
cy.get("input").eq(0).type(changedName).should("have.value", changedName).blur()
cy.get(".spectrum-ButtonGroup").contains("Save").click({force: true})
cy.wait(500)
})

View File

@ -10,7 +10,7 @@ Cypress.on("uncaught:exception", () => {
})
Cypress.Commands.add("login", () => {
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.wait(2000)
cy.url().then(url => {
if (url.includes("builder/admin")) {
@ -33,9 +33,9 @@ Cypress.Commands.add("login", () => {
})
Cypress.Commands.add("createApp", name => {
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.wait(500)
cy.request(`localhost:${Cypress.env("PORT")}/api/applications?status=all`)
cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`)
.its("body")
.then(body => {
if (body.length > 0) {
@ -52,9 +52,9 @@ Cypress.Commands.add("createApp", name => {
})
Cypress.Commands.add("deleteApp", name => {
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.wait(2000)
cy.request(`localhost:${Cypress.env("PORT")}/api/applications?status=all`)
cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`)
.its("body")
.then(val => {
if (val.length > 0) {
@ -80,9 +80,9 @@ Cypress.Commands.add("deleteApp", name => {
})
Cypress.Commands.add("deleteAllApps", () => {
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.visit(`${Cypress.config().baseUrl}/builder`)
cy.wait(500)
cy.request(`localhost:${Cypress.env("PORT")}/api/applications?status=all`)
cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`)
.its("body")
.then(val => {
for (let i = 0; i < val.length; i++) {
@ -324,7 +324,7 @@ Cypress.Commands.add("addSqlDatasourceConfig", (sqlType, noFetch) => {
.children()
.within(() => {
cy.get(".spectrum-Textfield").within(() => {
cy.get("input").clear().type("3.251.63.170")
cy.get("input").clear().type(Cypress.env("HOST_IP"))
})
})
})

View File

@ -0,0 +1,11 @@
const breweries = data
const totals = {}
for (let brewery of breweries)
{const state = brewery.state
if (totals[state] == null)
{totals[state] = 1}
else
{totals[state]++}}
const entries = Object.entries(totals)
return entries.map(([state, count]) => ({state, count}))

View File

@ -0,0 +1,27 @@
const breweries = data
const totals = {}
for (let brewery of breweries)
{const state = brewery.state
if (totals[state] == null)
{totals[state] = 1
} else
{totals[state]++
}}
const stateCodes =
{"texas":"tx",
"colorado":"co",
"florida":"fl",
"iwoa":"ia",
"louisiana":"la",
"california":"ca",
"pennsylvania":"pa",
"georgia":"ga",
"new hampshire":"nh",
"virginia":"va",
"michigan":"mi",
"maryland":"md",
"ohio":"oh"}
const entries = Object.entries(totals)
return entries.map(([state, count]) =>
{const stateCode = stateCodes[state.toLowerCase()]
return {state, count, flag: 'http://flags.ox3.in/svg/us/${stateCode}.svg'}})