'How would you grab old responses in cypress?

I have been trying to grab an old response to assert it has a certain response.

The issue is that the same call is posted at the same time and I can only grab the second response.

I was just wondering if there was a way to grab both responses so I can read each body to make sure the correct posts are made

I have used the following

public assertMixPanelCall(call: string): void {
        cy.intercept('POST', 'https://api-js.mixpanel.com/track/*', (req) => {
            if (atob(req.body.replace('data=', '')).includes(`"event": "${call}"`)) {
              req.alias = 'correctBody'
            }
          });
        cy.wait('@correctBody');
    }

So the response I get is the last response, But I want to grab the penultimate response



Solution 1:[1]

I'm not seeing the complete picture, but I think you can use this pattern Intercepting a response

let responseCount = 0;
cy.intercept('POST', 'https://api-js.mixpanel.com/track/*', (req) => {
  if (atob(req.body.replace('data=', '')).includes(`"event": "${call}"`)) {

    req.continue((res) => {
      responseCount++;
      if (responseCount === 1) {
        req.alias = 'penultimate'
      }
      if (responseCount === 2) {
        req.alias = 'final'
      }
    })
  }
});
cy.wait('@penultimate')

Not sure if dynamic aliasing works on a per-response basis.

There's also an undocumented alias suffix that lets you access the nth response

cy.wait('@correctBody');   // must wait first
cy.get('@correctBody.1');  // then get to access response history
                           // - not sure if you need @correctBody.0 or @correctBody.1

But I can't see why cy.wait('@correctBody') doesn't catch the first response, generally you need to issue the wait twice to get both responses. Anyway, there's some things to try out here.

Solution 2:[2]

So I found the solution

From wherever I want to start capturing

cy.intercept('POST', 'https://api-js.mixpanel.com/track/*').as('call');

generate array based on the number of calls previously I wish to check

 const genArr = Array.from({length:noOfCalls},(v,k)=>k+1);
    const calls = [];
    cy.wrap(genArr).each(() => {
        calls.push(`@${call}`)
    })

make the call based on the amount of times I wish to post the response

cy.wait(calls).then(differentRequests => {
    differentRequests.forEach(differentRequest => {
        if(atob(differentRequest.request.body.replace('data=','')).includes(call)) {
            pass = true
        }
    });
    expect(pass).to.be.true
  });

}

Got the solution from here https://medium.com/slido-dev-blog/cypress-io-is-pretty-amazing-and-if-you-havent-used-it-yet-and-need-a-jump-start-i-recommend-my-66ee6ac5f8d9

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Fody
Solution 2 Dev Khaira