Cypress push value in json array
I would like to compile a list and push them into a json array in Cypress.
This is what the json out put is supposed to look like:
[
{
"role": "Administrator",
"scenarios": [
"clients_a",
"clients_d",
"clients_f",
....
]
}
]
This is my code so far:
const permission_list = require('../../fixtures/permissions/permissions_admin.json')
const test_plan = 'cypress/fixtures/permissions/test_plan_admin.json'
const role = 'Administrator'
describe('Test plan creator for Administrator', () => {
it('create a test plan', () => {
//prepare the json array
cy.writeFile(test_plan, [{role: role,scenarios: []}])
cy.get(permission_list[0].granted_permissions).then((list) => {
if (Cypress.$.inArray('clients', list) != -1) {
cy.readFile(test_plan).then((scenarios) => {
scenarios.push('clients_a') // this is where I make a mistake I suppose
// write the merged list
cy.writeFile(test_plan, scenarios)
})
}
///added to handle case "clients" was not found in Array
else {
}
})
})
})
And this is the output of my code:
[
{
"role": "Administrator",
"scenarios": []
},
"clients_a" <-- should be inside the list behind "scenarios"
]
So it's close but no cigar. How can I push the value "clients_a"
into the list of "scenarios"
?
The approach I would take is do everything in memory and only write the finished list once at the end.
There would be a slight speed up doing that, but main advantage is you don't need to worry about appending.
const permission_list = require('../../fixtures/permissions/permissions_admin.json')
const test-plan-file-path = 'cypress/fixtures/permissions/test_plan_admin.json'
const role = 'Administrator'
describe('Test plan creator for Administrator', () => {
it('create a test plan', () => {
//prepare the json array
const scenarios = []
cy.get(permission_list[0].granted_permissions).then((list) => {
if (Cypress.$.inArray('clients', list) != -1) {
scenarios.push('clients_a')
}
})
// write the result
const plan = [{ role, scenarios}]
cy.writeFile(test-plan-file-path, plan)
})
})
There's something else strange here, it looks like you push multiple items in a loop, but there is no loop here. Would need to see more of the app to suggest how to fix that.
You can do something like this. You have to create a structure inside the JSON file. Using the flag: a+
you can append texts at the end of file instead of overwriting it.
describe('Test plan creator for Administrator', () => {
it('create a test plan', () => {
//prepare the json array
cy.writeFile(test_plan, '[{role: role,scenarios: [')
cy.get(permission_list[0].granted_permissions).then((list) => {
if (Cypress.$.inArray('clients', list) != -1) {
cy.writeFile(test_plan, 'clients_a', {flag: 'a+'})
}
})
cy.writeFile(test_plan, ']}]', {flag: 'a+'}) //complete the structure with closing brackets
})
})
If you want to push multiple client ids, this is how I do it
const permission_list = require('../../fixtures/permissions/permissions_admin.json')
const test_plan = 'cypress/fixtures/permissions/test_plan_admin.json'
const role = 'Administrator'
describe('Test plan creator for Administrator', () => {
before(() => {
cy.writeFile(test_plan, [{role: role, scenarios: []}])
})
it('create a test plan', () => {
cy.fixture('test_plan_admin.json').then(plan => {
const list = permission_list[0].granted_permissions
if (list.includes('clients')) {
plan.scenarios.push('clients_a')
}
cy.writeFile(test_plan, plan)
})
})
it('another client', () => {
cy.fixture('test_plan_admin.json').then(plan => {
const list = permission_list[0].granted_permissions
if (list.includes('clients')) {
plan.scenarios.push('clients_a')
}
cy.writeFile(test_plan, plan)
})
})
})