Hey guys, today I will post about how to use a token when sending your requests in node.js. As I am using these requests for my automated tests with cucumber.js, I am going to post the step definition, too.
The class with the API requests:
'use strict';
var request = require('sync-request');
var protractor = require('protractor');
var browser = protractor.browser;
var sprintf = require('sprintf-js').sprintf;
function API() {
//Initialise the variables
var token = null;
var total = null;
var id = null;
return {
//Authenticate request where it gets the token to be used after
authenticate: function() {
var response = request('POST', getAuthURL(), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: getAuthBody()
});
var json = parseResponse(response);
if (response.statusCode !== 200) {
throw Error('Unable to authenticate: ' + response.statusCode);
}
token = json.token_auth;
console.log('Authenticated with token:[' + token + ']');
return token;
},
//Get the token from the authenticate request
create: function() {
var response = request('GET', getCreateURL(), {
headers: {
'Content-Type': 'application/json',
'Auth-Token': token
},
body: getCreateBody()
});
var json = parseResponse(response);
if (response.statusCode !== 200) {
throw Error('Unable to create:' + response.statusCode);
}
//Get the nodes from the response, data is an array
total = json.total;
id = json.data[0].id;
console.log(id);
console.log('Created:[' + total + ']');
return json;
},
//Parsing the response
function parseResponse(response) {
return JSON.parse(response.getBody('utf8'));
},
//Returning the body with the credentials from protractor.js config
function getAuthBody(response) {
return 'user=' + browser.params.credentials.username +
'&pass=' + browser.params.credentials.password;
},
//Write the body to create the user and convert it
function getCreateBody(response) {
return JSON.stringify({
deviceId: '123456789',
name: 'Rafaela',
description: 'Description',
cities: [{
'label': 'London'
}, {
'label': 'Oxford'
}]
});
},
//Get address and then endpoint from the protractos.js
function getAuthURL() {
return getPath() + '/' + browser.params.endpoints.authenticate;
},
//Get the host and path, easier to maintain
function getPath() {
return browser.params.host + '/' + browser.params.path;
},
function getCreateURL() {
return getPath() + '/' + browser.params.endpoints.create;
}
}
module.exports = API;
- Authenticate request where it’s getting the token to be used in the Create request.
Your protractor.js with protractor and cucumber configs:
'use strict';
var os = require('os');
var platform = os.platform();
//Browsers that you will run the automation
var chrome = {
browserName: 'chrome'
};
var safari = {
browserName: 'safari'
};
var firefox = {
browserName: 'firefox'
};
var capabilities = [chrome];
// Enable Safari only on macos
if (platform === 'darwin') {
capabilities.push(safari);
}
exports.config = {
seleniumAddress: 'http://127.0.0.1:4444/wd/hub',
//Point to the features path
specs: [
'src/features/*.feature'
],
multiCapabilities: capabilities,
noGlobals: true,
baseUrl: 'http://localhost:5000/',
framework: 'custom',
frameworkPath: require.resolve('protractor-cucumber-framework'),
cucumberOpts: {
//Point to the step definitions and support classes
require: 'test/steps/**/*.js',
//Format for the cucumber report
format: [
'json:test-reports/cucumber-json/cucumber.json',
'pretty'
],
strict: true,
//Tags filtering the scenarios
tags: [
'@regressionTests',
'~@pending'
]
},
//Params to pass to your tests, username, passwords, etc.
params: {
credentials: {
username: 'user',
password: 'Password123'
}
},
//Your site address
host: 'http://www.testSite.com',
//Path to use in the requests
path: 'rest',
//Endpoints for the requests
endpoints: {
authenticate: 'auth',
create: 'create/user'
}
}
}
};
Your step definition with the step and calling the api functions:
'use strict';
var API = require('../api');
var SupportSteps = function() {
var api = new API();
this.Given(/^I have created the user$/, function() {
//Calling the authenticate first, you will get the token to use it
api.authenticate();
api.create();
});
};
module.exports = SupportSteps;
- So here, you have the step definition that calls the functions to authenticate first and then to create the user after using the token.
Thank you guys ! See you next weekend 🙂