0

I am designing automation scripts using the Cucumber BDD framework for REST APIs using RestAssured. I have one API which generates the "Token" and then there is another API for order creation which requires this "Token" in the authorization parameter. Here is my feature file:

Feature: Create Order API

  @Background:
  Scenario Outline: Generate Access token With Valid Details
    Given Query param for request
      | grant_type         |
      | client_credentials |
    Given Basic Auth keys for request "<userName>" and "<key>"
    When Build request for baseurl "PAYPAL_BASE_URI" and endpoint "ENDPOINT_GET_AUTH_KEY"
#    And Set global "access_token" in "token"
    And Perform "POST" request using
    Then status code is 200
    And  response contains "scope"
    Examples:
      | userName    | key |                                                                  
   | AWnCbuv9Bee0_6 | EMWowD696LqfznidhQ2RT_jZL2ys |

Now the response of the above API is as follows:

{
    "scope": "https://uri.pppaypal.com/services/invoicing https://uri.pppaypal.com/services/applications/webhooks",
    "access_token": "ALs1szFnv2TJ19Zf3vq",
    "token_type": "Bearer",
    "app_id": "APP-284543T",
    "expires_in": 311286,
    "nonce": "2022-05-31T03:41:41ZWs9dpOQ"
}

Now I need this "access_token" as in the "Create Order API" Authorization parameter with Bearer. The "Create Order API" feature file is below:

 Scenario: Verify create order api using valid auth
    Given Generate request
    And Build request for baseurl "PAYPAL_BASE_URI" and endpoint "ENDPOINT_CREATE_ORDER_API"
    And Set header values as
      | Content-Type     | Authorization                                                                                            |
      | application/json | Bearer <token> |
    When Perform "POST" request using "FILE_PATH_ORDER_JSON"
    Then status code is 201

How can I set "access_token" in "token" as a global variable from the feature file so that I can use it anywhere in this feature file using the following step?

And Set global "access_token" in "token"

1 Answer 1

0

The feature files are meant to be used for describing your domain, no low-level details of how your automation code works. See this video from Dave Farley to see the separation from Domain and Implementation Details.

Now, back to the question, if you want to have a global state, you can simply have a Singleton that will hold this state.

public final class TokenState {

    private static TokenState INSTANCE;
    private String token;
    
    private TokenState() { }
    
    public static ClassSingleton getInstance() {
        if(INSTANCE == null) {
            INSTANCE = new TokenState();
        }
        
        return INSTANCE;
    }

    public void setToken(String token) {
       this.token = token;
    }

    public void getToken() {
       return this.token;
    }
}

This way, whenever you want to mutate the global token, you can simply do TokenState.getInstance.setToken("blabla") or to retrieve the token you do TokenState.getInstance.getToken().

Note: If you prefer, you can use lombok-pg to simplify the implementation of the Singleton.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.