Search code examples
variablescypressfixturesstubintercept

How to use a part of intercepted endpoint as a variable in my stub with Cypress


I am testing a frontend and I want to make my test more efficient

I have the following custom command:

  cy.intercept('**/api/classification/dd86ac0a-ca23-413b-986c-535b6aad659c/items/**',
    { fixture: 'ItemsInEditor.json' }).as('ItemsInEditorStub')

This works correctly and is intercepts 25 times :). But the Id in the stub file has to be the same as in the requested Endpoint. Otherwise the frontEnd wilt not process it.

At this point I do not want to make 25 stubfiles in the fixture map.

In the printscreen you can see the different calls I need to intercept. The last ID I would like to save as variable and use it in the stub file enter image description here

The Stub is like this:

{
  "item": {
    "version": 3,
    "title": "Cars",
    "rows": [],
    "id": "dynamicIdBasedOnEndPoint"  <- *Can we make it dynamic based on the ID in the endpoint*
  },
  "itemState": "Submitted"
}

UPDATE: What I have for now is just the basic I guess:

cy.intercept('**/api/classification/*/items/**', {
        body:
        {
            item: {
                version: 3,
                title: 'Cars',
                rows: [],
                id: '55eb5a28-24d8-4705-b465-8e1454f73ac8'  //Still need this value to be dynamic and always the same as the intercepted '**'(wildcard)
            },
            itemState: "Submitted"
        }
    })
        .as('ItemsInEditorStub')

Solution

  • cy.fixture('ItemsInEditor.json').then(ModFixture => {
    
        cy.intercept('GET', '**/api/classification/**/items/id/**', (req) => {
            const id = req.url.split('/').pop();        // last part of url path 
            ModFixture.item.id = id;                    // add the id dynamically 
            req.reply(ModFixture);                      // send altered fixture
        })
    }).as('ItemsInEditorStub')
    

    Thanks to @Fody