Tricote
Tricote

Reputation: 1508

Testing authenticated / unauthenticated download links with Nightwatch.js

I know there is a very similar question here: Testing download links with Nightwatch.js, but this case is slighly different.

I'm trying to test a download using nightwatch too, but it's not that simple due to the browser behavious which present a popup window to the user.

What i'm trying to do is to just download the file with node, and not using selenium (as in this python version: https://stackoverflow.com/a/24998532/447074)

So I made this custom assertion :

downloadFile.js :

var util = require('util');
var http = require('http');
var url = require('url');

exports.assertion = function(options, expected_status, msg) {
  this.message = msg || util.format('Testing if authenticated file download works');
  this.file_url = options.file_url;
  this.cookie_content = options.cookie_content;
  this.expected = expected_status;
  this.pass = function(value) {
    return this.expected == value
  };

  this.value = function(response) {
    return response.statusCode;
  };

  this.command = function(callback) {
    var options = url.parse(this.file_url);
    options.headers = {
      'Cookie': this.cookie_content
    };
    http.get(options, callback);
    return true;
  };

};

And using it in a test case like this:

// I would not use this here, but I added this for this post...
"Get cookie": function(browser) {
  var settings = browser.globals;
  var state = browser.globals.state;

  browser
    .getCookies(function(response) {
      state.sessionid = "sessionid=" + response['value'].filter(function(cookie_value){
        return cookie_value['name'] == 'sessionid';
      })[0]['value'];
    })
},


"An authenticated user can download the file": function(browser) {
  var settings = browser.globals;
  var state = browser.globals.state;

  browser
    .assert.downloadFile({file_url: "http://example.com/somefile.pdf", cookie_content: state.sessionid}, 200, "Testing Authenticated download");
},

"An unauthenticated user can not download the file": function(browser) {
  var settings = browser.globals;
  var state = browser.globals.state;

  browser
    .assert.downloadFile({file_url: "http://example.com/somefile.pdf", cookie_content: "sessionid= wrong-session;"}, 302, "Testing Unauthenticated dowload");

},

It's "almost" working, but somehow the test "stops" after the first test, just after the first downloadFile assertion.

Here is the result from the console

nightwatch -c ./nightwatch.json --test tests/documents/upload_test.js

[Upload Test] Test Suite
========================
Setting up...

Running:  Get cookie 


No assertions ran.

Running:  An authenticated user can download the file 

✔  Testing Authenticated dowload

Is it ok to make this kind of assertion in nightwatch? Why does it stops the tests?

Thanks!

Upvotes: 0

Views: 2039

Answers (1)

Tricote
Tricote

Reputation: 1508

Ok I found the solution by reading the custom assertion doc again: http://nightwatchjs.org/guide#custom-assertions

The command function of the assertion needs to return this http://nightwatchjs.org/guide#custom-assertions.

Here is the downloadFile.js assertion :

var util = require('util');
var http = require('http');
var url = require('url');

exports.assertion = function(options, expected_status, msg) {
  this.message = msg || util.format('Testing if authenticated file download works');
  this.file_url = options.file_url;
  this.cookie_content = options.cookie_content;
  this.expected = expected_status;
  this.pass = function(value) {
    return this.expected == value
  };

  this.value = function(response) {
    return response.statusCode;
  };

  this.command = function(callback) {
    var options = url.parse(this.file_url);
    options.headers = {
      'Cookie': this.cookie_content
    };
    http.get(options, callback);
    return this;
  };

};

Upvotes: 1

Related Questions