Search code examples
arraysnestedcypressassertion

Cypress intercept nested array and object and asserts it value


I am trying to assert value's in a requestbody which I have intercepted with cypress.

The values I need to assert are "name": "NewName", and "title": "STUB1-Draft" you can see in the requestbody example that I have attached.

My testscript in Cypress:

 it.only('Check the requestbody', function () {
cy.intercept('PUT', '**/api/assessmenttest/**', req => {
            req.reply({ statusCode: 200 });
        }).as('NewSectionAndItem');

        cy.wait('@NewSectionAndItem')
            .its('request.body.test')
            .its('testParts')
            .its('testSections')
           .its('name')
            .should('include', 'NewName');
     //cy.wait('@NewSectionAndItem').its('request.body.testParts').expect(arr_obj[1].name).to.equal('NewName')

The request body look like the following:

{
  "structureStatistics": {
    "testPartCount": 1,
    "testSectionCount": 6,
    "itemCount": 23
  },
  "name": "BIMMA",
  "title": "OTAP",
  "correctionInstructionsUrl": "C:Stub/FakePath/For/Cypress",
  "correctionInstructionAppendices": [],
  "testParts": [
    {
      "testSections": [
        {
          "order": 1,
          "name": "Tekst 1 Looking for the one? ",
          "itemReferences": [
            {
              "itemId": "55eb5a28-24d8-4705-b465-8e1454f73ac8",
              "weight": 11,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "55eb5a28-24d8-4705-b465-8e1454f73ac8",
                "title": "H-E-T1-1"
              }
            }
          ],
          "id": "5c3eef2d-1094-4b9e-84c1-f184956f87fa"
        },
        {
          "id": "ffaebc93-0bf6-4f75-944a-f61345a7be90",
          "name": "NewName",
          "itemReferences": [
            {
              "itemId": "58a29037-c92c-48f6-a7c3-a2f94e288992",
              "weight": 0,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "58a29037-c92c-48f6-a7c3-a2f94e288992",
                "title": "STUB1-Draft",
                "state": "Draft"
              }
            }
          ]
        },
        {
          "order": 2,
          "name": "Tekst 2 The fruit Iron Ox bears",
          "itemReferences": [
            {
              "itemId": "abfc0811-26c7-4d9d-b3cc-0c920e5af259",
              "weight": 2,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "abfc0811-26c7-4d9d-b3cc-0c920e5af259",
                "title": "H-E-T2-2"
              }
            },
            {
              "itemId": "3cfda5e0-0d64-44ef-8a4d-21f37484c024",
              "weight": 12,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "3cfda5e0-0d64-44ef-8a4d-21f37484c024",
                "title": "H-E-T2-3"
              }
            },
            {
              "itemId": "19ba8a53-9755-4beb-8f69-edd107b80230",
              "weight": 1,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "19ba8a53-9755-4beb-8f69-edd107b80230",
                "title": "H-E-T2-4"
              }
            },
            {
              "itemId": "3f5b7b81-df1f-4f01-8165-cb2226d9044d",
              "weight": 1,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "3f5b7b81-df1f-4f01-8165-cb2226d9044d",
                "title": "H-E-T2-5"
              }
            }
          ],
          "id": "00f7455e-6d7d-4311-80cd-eff45c83ef2c"
        },
        {
          "order": 3,
          "name": "Tekst 3 How to live like a tramp",
          "itemReferences": [
            {
              "itemId": "7e2d568c-4cde-4500-9c6b-c09f246155e4",
              "weight": 1,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "7e2d568c-4cde-4500-9c6b-c09f246155e4",
                "title": "H-E-T3-6"
              }
            },
            {
              "itemId": "87a5bf1c-451a-40b8-802a-53ee842cafcd",
              "weight": 1,
              "neutralisationType": "NoNeutralisation",
              "itemSummary": {
                "id": "87a5bf1c-451a-40b8-802a-53ee842cafcd",
                "title": "H-E-T3-7"
              }
            }
          ],
          "id": "390ecc2e-6715-4898-aaea-158e790525a2"
        }

      ],
      "navigationMode": "Linear",
      "submissionMode": "Individual",
      "id": "a546a67c-ac39-4e81-bf03-beb482c920a0"
    }
  ],
  "metadataToBePublished": [
    "be63002c-dcf8-449f-a0ae-6ba50d4e2712",
    "4d70239e-7a6e-47c3-b157-462d6c8c5edc"
  ],
  "created": "2022-07-08T09:00:00+00:00",
  "modified": "2022-09-21T23:55:58.6532451+02:00",
  "createdBy": {
    "id": "a45ea6db-bf04-427d-9354-7081b7592a3d",
    "fullName": "Manual Construction"
  },
  "lastModifiedBy": {
    "id": "129a584c-a677-4d9f-b289-019d1815064f",
    "fullName": "OZKAN"
  },
  "id": "300eea01-ee10-4bd9-9356-8aaa933e949c"
}

I could not figure out how I can assert nested arrays and value's, without using deep.equal for the complete request. Thank you indeed!


Solution

  • It basically just looks like a couple of things

    • an extra test property in the test that's not there in the request
    • testParts and testSections are arrays (square bracket instead of curly bracket), so you need an index for them

    Generally I think this would work

    cy.wait('@NewSectionAndItem')
      .its('request.body')
      .its('testParts.0')
      .its('testSections.1')
      .its('name')
      .should('include', 'NewName');
    

    The problem is identifying the correct array indexes. testParts has only one element, so 0 is the only index option there.

    To find the testSection index, create a dummy .json file in VS Code (or other editor) paste in the json from above and use the collapse toggles on the left to easily see which index contains the value you seek.