Valor de inserción de Cypress en matriz json

Me gustaría compilar una lista y colocarlos en una matriz json en Cypress.

Así es como se supone que debe verse la salida json:

[
  {
    "role": "Administrator",
    "scenarios": [
      "clients_a",
      "clients_d",
      "clients_f",
      ....
    ]
  }
]

Este es mi código hasta ahora:

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

Y esta es la salida de mi código:

[
  {
    "role": "Administrator",
    "scenarios": []
  },
  "clients_a" <-- should be inside the list behind "scenarios"
]

Así que está cerca pero no hay cigarro. ¿Cómo puedo insertar el valor "clients_a"en la lista de "scenarios"?

Answer

El enfoque que tomaría es hacer todo en la memoria y solo escribir la lista terminada una vez al final.

Habría una ligera aceleración al hacerlo, pero la principal ventaja es que no necesita preocuparse por agregar.

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

Aquí hay algo más extraño, parece que empujas varios elementos en un bucle, pero aquí no hay bucle. Necesitaría ver más de la aplicación para sugerir cómo solucionarlo.

Puedes hacer algo como esto. Tienes que crear una estructura dentro del archivo JSON. Con el flag: a+puede agregar textos al final del archivo en lugar de sobrescribirlo.

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

Si desea enviar varias identificaciones de clientes, así es como lo hago

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

})