diff --git a/ui-v2/app/services/settings.js b/ui-v2/app/services/settings.js index bc7c6456d5..cc3d8021e4 100644 --- a/ui-v2/app/services/settings.js +++ b/ui-v2/app/services/settings.js @@ -7,8 +7,12 @@ export default Service.extend({ storage: window.localStorage, findHeaders: function() { // TODO: if possible this should be a promise + const token = get(this, 'storage').getItem('token'); + // TODO: The old UI always sent ?token= + // replicate the old functionality here + // but remove this to be cleaner if its not necessary return { - 'X-Consul-Token': get(this, 'storage').getItem('token'), + 'X-Consul-Token': token === null ? '' : token, }; }, findAll: function(key) { diff --git a/ui-v2/app/templates/settings.hbs b/ui-v2/app/templates/settings.hbs index 8b84f3e86c..8406d57a0b 100644 --- a/ui-v2/app/templates/settings.hbs +++ b/ui-v2/app/templates/settings.hbs @@ -13,7 +13,7 @@
diff --git a/ui-v2/tests/acceptance/steps/token-header-steps.js b/ui-v2/tests/acceptance/steps/token-header-steps.js new file mode 100644 index 0000000000..c5f07c8043 --- /dev/null +++ b/ui-v2/tests/acceptance/steps/token-header-steps.js @@ -0,0 +1,10 @@ +import steps from './steps'; + +// step definitions that are shared between features should be moved to the +// tests/acceptance/steps/steps.js file + +export default function(assert) { + return steps(assert).then('I should find a file', function() { + assert.ok(true, this.step); + }); +} diff --git a/ui-v2/tests/acceptance/token-header.feature b/ui-v2/tests/acceptance/token-header.feature new file mode 100644 index 0000000000..a1c35b80ad --- /dev/null +++ b/ui-v2/tests/acceptance/token-header.feature @@ -0,0 +1,36 @@ +@setupApplicationTest +Feature: token headers + In order to authenticate with tokens + As a user + I need to be able to specify a ACL token AND/OR leave it blank to authenticate with the API + Scenario: Arriving at the index page having not set a token previously + Given 1 datacenter model with the value "datacenter" + When I visit the index page + Then the url should be /datacenter/services + And a GET request is made to "/v1/catalog/datacenters" from yaml + --- + headers: + X-Consul-Token: '' + --- + Scenario: Set a token and then navigate to the index page + Given 1 datacenter model with the value "datacenter" + When I visit the settings page + Then the url should be /settings + Then I type with yaml + --- + token: [Token] + --- + And I submit + When I visit the index page + Then the url should be /datacenter/services + And a GET request is made to "/v1/catalog/datacenters" from yaml + --- + headers: + X-Consul-Token: [Token] + --- + Where: + --------- + | Token | + | token | + | '' | + --------- diff --git a/ui-v2/tests/helpers/yadda-annotations.js b/ui-v2/tests/helpers/yadda-annotations.js index bb7b427c16..7c972601e4 100644 --- a/ui-v2/tests/helpers/yadda-annotations.js +++ b/ui-v2/tests/helpers/yadda-annotations.js @@ -64,6 +64,7 @@ function setupScenario(featureAnnotations, scenarioAnnotations) { } return function(model) { model.afterEach(function() { + window.localStorage.clear(); api.server.reset(); }); }; diff --git a/ui-v2/tests/pages.js b/ui-v2/tests/pages.js index 1c96d8b948..e89056fa13 100644 --- a/ui-v2/tests/pages.js +++ b/ui-v2/tests/pages.js @@ -1,5 +1,6 @@ import index from 'consul-ui/tests/pages/index'; import dcs from 'consul-ui/tests/pages/dc'; +import settings from 'consul-ui/tests/pages/settings'; import services from 'consul-ui/tests/pages/dc/services/index'; import service from 'consul-ui/tests/pages/dc/services/show'; import nodes from 'consul-ui/tests/pages/dc/nodes/index'; @@ -12,6 +13,7 @@ import acl from 'consul-ui/tests/pages/dc/acls/edit'; export default { index, dcs, + settings, services, service, nodes, diff --git a/ui-v2/tests/pages/settings.js b/ui-v2/tests/pages/settings.js new file mode 100644 index 0000000000..0418b03853 --- /dev/null +++ b/ui-v2/tests/pages/settings.js @@ -0,0 +1,6 @@ +import { create, visitable, clickable } from 'ember-cli-page-object'; + +export default create({ + visit: visitable('/settings'), + submit: clickable('[type=submit]'), +}); diff --git a/ui-v2/tests/steps.js b/ui-v2/tests/steps.js index a75d11499f..4f8b3db00a 100644 --- a/ui-v2/tests/steps.js +++ b/ui-v2/tests/steps.js @@ -150,6 +150,37 @@ export default function(assert) { ); }); }) + // TODO: This one can replace the above one, it covers more use cases + // also DRY it out a bit + .then('a $method request is made to "$url" from yaml\n$yaml', function(method, url, yaml) { + const request = api.server.history[api.server.history.length - 2]; + assert.equal( + request.method, + method, + `Expected the request method to be ${method}, was ${request.method}` + ); + assert.equal(request.url, url, `Expected the request url to be ${url}, was ${request.url}`); + let data = yaml.body || {}; + const body = JSON.parse(request.requestBody); + Object.keys(data).forEach(function(key, i, arr) { + assert.equal( + body[key], + data[key], + `Expected the payload to contain ${key} to equal ${body[key]}, ${key} was ${data[key]}` + ); + }); + data = yaml.headers || {}; + const headers = request.requestHeaders; + Object.keys(data).forEach(function(key, i, arr) { + assert.equal( + headers[key], + data[key], + `Expected the payload to contain ${key} to equal ${headers[key]}, ${key} was ${ + data[key] + }` + ); + }); + }) .then('a $method request is made to "$url" with the body "$body"', function( method, url,