gurock / testrail-api

TestRail API: Examples on how to use TestRail's API from various languages
Other
116 stars 86 forks source link

com.qa.utils.APIException: TestRail API returned HTTP 400("Field :suite_id is a required field.") #30

Closed wrathmelior closed 2 years ago

wrathmelior commented 2 years ago

I am getting this error, but the suite id is provided in data. I was getting a different error before adding quotes (\") around the labels suite id, include all, and name and it was recommended to me by a coworker to add quotes. I printed the value of data in the console and this is what I get: data: {"include_all"=true, "name"="Test Run 1638908713474", "suite_id"=856}

Here is the code (username, pw and company name have been updated for privacy) public void createSuite(ITestContext ctx) throws IOException, APIException { client = new APIClient("https://companyqa.testrail.com/"); client.setUser("user@company.com"); client.setPassword("password"); Map data = new HashMap(); data.put("\"suite_id\"", 856); data.put("\"include_all\"", true); data.put("\"name\"" ,"\"Test Run " +System.currentTimeMillis()+"\""); JSONObject c = null; System.out.println("data: " + data); c = (JSONObject)client.sendPost("add_run/"+102,data); Long suite_id = (Long)c.get("id"); ctx.setAttribute("suiteId",suite_id); System.out.println("suiteID: "+ suite_id);

jonrgurock commented 2 years ago

Hi @wrathmelior,

Looking at your code, it appears the suite_id field is missing from the URI. The suite_id parameter should be added to this line: c = (JSONObject)client.sendPost("add_run/"+102,data);

For example, if the suite ID is 462, you should have c = (JSONObject)client.sendPost("add_run/"+102 + "&suite_id=462",data);

I hope this resolves your API issue. If you have additional questions, please reach out to our support team at contact@gurock.com.

Regards, Jon

P.S. I noticed an issue in our documentation where the parameters and request fields are displayed in the same table, which can lead to confusion. I've requested our documentation team make some updates to clarify this as well.

wrathmelior commented 2 years ago

I added the suite ID as you recommended to c but I am getting the same error.

Error: com.qa.utils.APIException: TestRail API returned HTTP 400("Field :suite_id is a required field.")

Code: @BeforeSuite public void createSuite(ITestContext ctx) throws IOException, APIException { client = new APIClient("https://companyqa.testrail.com/"); client.setUser("user@company.com"); client.setPassword("password"); Map data = new HashMap(); //JSONObject data = new JSONObject(); data.put("\"suite_id\"", 856); data.put("\"include_all\"", true); data.put("\"name\"" ,"\"Test Run " +System.currentTimeMillis()+"\""); JSONObject c = null; System.out.println("data: " + data); c = (JSONObject)client.sendPost("add_run/"+102+"&suite_id=856",data); Long suite_id = (Long)c.get("id"); ctx.setAttribute("suiteId",suite_id); System.out.println("suiteID: "+ suite_id); }

jonrgurock commented 2 years ago

Hi @wrathmelior,

I'm sorry this is causing problems for you and I made a mistake in my first response. For post requests, the suite_id should be included in the body of the request, as you were doing.

The error message you received indicates TestRail is not receiving the suite_id for some reason, likely due to encoding, type casting, or a similar issue. (If the ID were incorrect, you'd get a different error message)

Looking at a sample script here: https://github.com/gurock/testrail-custom/blob/master/user-submitted/api-scripts/java/rerun_testrun.java#L69, the only differences I'm seeing are how suite_id is enclosed in quotes, and the example script typecasts the suite_id to a Long before putting it inside the data object.

After reviewing the sample script, and you continue to have issues, can you send an email to our support team at contact@gurock.com so they can troubleshoot this further with you? Can you also attempt this via cURL or an API client such as Postman and let the support team know if you receive the same error?

Thank you, Jon

wrathmelior commented 2 years ago

When I remove the quotes I get this error instead:

java.lang.ClassCastException: class org.json.simple.JSONObject cannot be cast to class org.json.JSONObject (org.json.simple.JSONObject and org.json.JSONObject are in unnamed module of loader 'app')

This is what prompted us to add the "", because in postman the values must me enclosed in quotes like this

https://companyqa.testrail.com/index.php?/api/v2/add_run/102 { "suite_id": 856, "name": "MXC + {{currentDate}}", "include_all": true }

As you can see it runs fine in Postman Screenshot: https://i.imgur.com/6jC172V.png Screenshot: https://i.imgur.com/HCjEznh.png

Code without quotes: @BeforeSuite public void createSuite(ITestContext ctx) throws IOException, APIException { client = new APIClient("https://companyqa.testrail.com/"); client.setUser("user@company.com"); client.setPassword("password"); Map data = new HashMap(); data.put("suite_id", 856); data.put("include_all", true); data.put("name" ,"Test Run " +System.currentTimeMillis()); JSONObject c = null; System.out.println("data: " + data); c = (JSONObject)client.sendPost("add_run/"+102+"&suite_id=856",data); Long suite_id = (Long)c.get("id"); ctx.setAttribute("suiteId",suite_id); }

jonrgurock commented 2 years ago

Hi @wrathmelior,

If this works in Postman, there is likely an encoding or typecasting issue with the data object. Please reach out to our support team at contact@gurock.com and mention this thread so our team can assist you further with this issue.

Thank you, Jon

wrathmelior commented 2 years ago

Interestingly! I found that when I remove the quotes, the I get the error from my last comment, however the test run IS created in Testrail. (but none of the tests run, it fails immediately after the test run is created)

Screenshot: https://i.imgur.com/qO010ao.png

jonrgurock commented 2 years ago

Hi @wrathmelior,

The latest error message you provided is an error from JAVA, and not the TestRail API, likely due to how your code is processing the response object.

You may have an incorrect import statement. Your code should show: import org.json.simple.JSONObject

Do you have: import org.json.JSONObject

Regards, Jon

wrathmelior commented 2 years ago

That was it!! My tests are running now and the API was created. Thank you so much for your help!!