Home > OS >  Cypress login to REST endpoint is unauthorized, Postman works - upload of JSON file
Cypress login to REST endpoint is unauthorized, Postman works - upload of JSON file

Time:09-18

We have a REST service with an incoming REST endpoint that accepts data. It has no web interface (Swagger or so), only the API. With Postman I can POST a JSON file (response code is 202) to it and then read the uploaded data from another endpoint.

When I want to log in to the same endpoint with Cypress to upload a JSON file from the fixtures folder (with the same body as in the Postman request), then I get response code 401 instead – Unauthorized. I have the feeling that the cypress request is wrong because the logfile of the service does not write a message when I use the cypress POST but it does when I use the Postman POST.

First question: What could I be doing wrong in the cypress request?

Second question: Once the authentication works, how can I POST/upload/push the content of the JSON file to that endpoint? Because I have no webpage to interact with, I cannot use click button functions. The documentation mainly deals with interpreting a JSON response but not with sending it.

My cypress code:

it('logs in to connector through REST API', () => {

  cy.request({
    method: 'POST',
    url: 'localhost:8095/connector/demands/v1/demandData',
    failOnStatusCode:false,
    form: true,
    body: {
        Username: 'user',
        Password: 'pass',
    }
  })
})

import my-request from '../fixtures/my-request.json'
it('loads the JSON file', () => {
        cy.fixture('my-request.json')

})

The structure of the JSON file to upload is not too simple, here is a shortened version:

{
"@metadata": {
    "context": "{{A}}"
},
"pool": "{{B}}",
"action": "NEW",
"Type": "ANNOUNCEMENT",
"ON": "Order123",
"PON": "PO123",
"SNN": "SN123",
"direction": "OUT",
"mode": 3,
"pack": [
    {
        "out": {
            "outKey": "OUT14",
            "outQuantity": "3",
            "dimension": {
                "length": "303",
                "width": "33",
                "height": "903",
                "unit": "mm"
            },
            "layers": "3",
            "weight": "3000",
            "weightUnit": "grm",
            "in": [
                {
                    "inKey": "IN12",
                    "inQuantity": "3",
                    "article": {
                        "articleKey": "article3",
                        "quantity": "300",
                        "PON": "Art_PO300",
                        "SNN": "Art_SN300"
                    }
                }
            ]
        },
        "p1": "pack3",
        "p2": "pack4",
        "store": true
    },
    {
        "out": {
            "outKey": "OUT23",
            "outQuantity": "5",
            "dimension": {
                "length": "505",
                "width": "55",
                "height": "905",
                "unit": "mm"
            },
            "layers": "5",
            "weight": "5000",
            "weightUnit": "grm",
            "in": [
                {
                    "inKey": "IN19",
                    "inQuantity": "5",
                    "article": {
                        "articleKey": "article5",
                        "quantity": "500",
                        "PON": "Art_PO500",
                        "SNN": "Art_SN500"
                    }
                }
            ]
        },
        "p1": "pack5",
        "p2": "pack5",
        "store": true
    }
]

}

CodePudding user response:

Solution found. "form: true" must not be given because this overrides the content-type.

CodePudding user response:

You can pass the contents of the fixture file(which is json) in the request body like this:

describe('Some Test Suite', function() {

  // we can use these values to log in
  const username = 'jane.lane'
  const password = 'password123'

  it('logs in to connector through REST API', () => {
    cy.fixture('my-request.json').then(myFixture => {
      cy.request({
        method: 'POST',
        url: 'localhost:8095/connector/demands/v1/demandData',
        auth: {
          username,
          password,
        },
        failOnStatusCode: false,
        form: true,
        body: myFixture
      })
    })
  })
})

For HTTP auth you have to use. You can check out this cypress recipe.

auth: {
  username,
  password,
}
  • Related