Cypress push value in json array

Viewed 611

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"?

3 Answers

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
  })
})

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.

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)     
    })
  })

})
Related