I’ve talked before about how Selenified supports web services and API testing, and as such, we are constantly working to simplify this experience, and expand out the support. One of the features included in the Selenified 3.0.1 release is the ability to pass in custom headers. Previously, all calls made had the Content-Type set to ‘application/json; charset=UTF-8.’ Below find out how to change that.
Custom Headers
Custom headers can be added to web-services calls, for whatever purpose. They can add user-agents, custom required headers for sites, or even override the default provided headers. By default, all web services calls are made with `Content-Type` set to `application/json; charset=UTF-8`. This can be changed by overridding this header. Headers can be added on a per test basis, or can be added for all tests in a suite. Headers should be set as key-value pairs, in a HashMap.
Map<String, String> headers = new HashMap<>(); headers.put("X-Atlassian-Token", "no-check");
To set this on an individual basis, simply retrieve the `Call` object, and add the headers
Call call = this.calls.get(); call.addHeaders(headers);
To set the headers for an entire class, in the `@BeforeMethod`, just call the static `addHeader` method.
addHeaders(this, test, headers);
Finally, if you want to reset the headers, on a test by test basis (maybe you want to set up headers for all tests instead of one), you can call the `resetHeaders` method.
Call call = this.calls.get(); call.resetHeaders();
Note that any headers set in the test, will override something set in the test suite. A full test suite might look something like this
public class ServicesOverrideIT extends Selenified { @BeforeClass(alwaysRun = true) public void beforeClass(ITestContext test) { // set the base URL for the tests here setTestSite(this, test, "https://jsonplaceholder.typicode.com/"); // set the author of the tests here setAuthor(this, test, "Max Saperstone\n<br/>[email protected]"); // set the version of the tests or of the software, possibly with a // dynamic check setVersion(this, test, "3.0.2"); // for this test, we want to change the default headers for each call Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/xml"); addHeaders(this, test, headers); // for this particular test, we want to set some bogus credentials setCredentials(this, test, "servicesUsername", "servicesPassword"); } @BeforeMethod(alwaysRun = true) protected void startTest(Object[] dataProvider, Method method, ITestContext test, ITestResult result) { super.startTest(dataProvider, method, test, result, DriverSetup.FALSE); } @Test(groups = {"integration", "services", "headers"}, description = "An integration test to verify we can successfully set header values") public void addHeaderTest() { // use this object to verify the app looks as expected Call call = this.calls.get(); //set some custom headers Map<String, String> headers = new HashMap<>(); headers.put("X-Atlassian-Token", "no-check"); call.addHeaders(headers); // perform some actions call.get("posts/").assertEquals(200); // verify no issues finish(); } @Test(groups = {"integration", "services", "headers"}, description = "An integration test to verify we can successfully override standard header values") public void overrideAcceptTest() { // use this object to verify the app looks as expected Call call = this.calls.get(); //set some custom headers Map<String, String> headers = new HashMap<>(); headers.put("Accept", "no-check"); call.resetHeaders(); call.addHeaders(headers); // perform some actions call.get("posts/").assertEquals(200); // verify no issues finish(); } }
Wrap Up
As you can see, this new functionality makes modifying how web services calls are made a snap.
Stay tuned for more posts on recent upgrades/updates made in the Selenified 3.0.1 release!