You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ro...@apache.org on 2016/11/29 14:27:58 UTC

[1/2] fauxton commit: updated refs/heads/master to e53deb5

Repository: couchdb-fauxton
Updated Branches:
  refs/heads/master dd5eb4978 -> e53deb5d9


increase window size and login in wait time

this seems to make the test more stable

PR: #813
PR-URL: https://github.com/apache/couchdb-fauxton/pull/813
Reviewed-By: Robert Kowalski <ro...@kowalski.gd>


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/e53deb5d
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/e53deb5d
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/e53deb5d

Branch: refs/heads/master
Commit: e53deb5d90fa7d6751bb753415dda5274a2b2cb5
Parents: 1aa4ca6
Author: Tim Pinington <ti...@gmail.com>
Authored: Sun Nov 27 21:56:36 2016 +0000
Committer: Robert Kowalski <ro...@apache.org>
Committed: Tue Nov 29 15:27:33 2016 +0100

----------------------------------------------------------------------
 test/nightwatch_tests/custom-commands/auth/loginToGUI.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/e53deb5d/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
----------------------------------------------------------------------
diff --git a/test/nightwatch_tests/custom-commands/auth/loginToGUI.js b/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
index 2eb1594..905b76f 100644
--- a/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
+++ b/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
@@ -22,8 +22,9 @@ function LoginToGui (user, pw) {
   const password = pw || client.globals.test_settings.password;
 
   client
+    .resizeWindow(1200, 1200)
     .url(baseUrl + '/#/login')
-    .waitForElementPresent('a[href="#/login"]', waitTime, false)
+    .waitForElementPresent('a[href="#/login"]', 50000, false)
     .click('a[href="#/login"]')
     .waitForElementVisible('.couch-login-wrapper', waitTime, false)
     .waitForElementVisible('#username', waitTime, false)


[2/2] fauxton commit: updated refs/heads/master to e53deb5

Posted by ro...@apache.org.
encodeding url path for database name with special characters

PR: #813
PR-URL: https://github.com/apache/couchdb-fauxton/pull/813
Reviewed-By: Robert Kowalski <ro...@kowalski.gd>


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/1aa4ca6f
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/1aa4ca6f
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/1aa4ca6f

Branch: refs/heads/master
Commit: 1aa4ca6f34a718c294a06a1301f39fe05f157a1c
Parents: dd5eb49
Author: Tim Pinington <ti...@gmail.com>
Authored: Thu Nov 24 00:16:46 2016 +0000
Committer: Robert Kowalski <ro...@apache.org>
Committed: Tue Nov 29 15:27:33 2016 +0100

----------------------------------------------------------------------
 app/addons/auth/base.js                                  |  8 ++++----
 app/addons/components/components/apibar.js               |  6 +++---
 app/addons/components/header-breadcrumbs.jsx             |  2 +-
 app/addons/config/base.js                                |  2 +-
 .../databases/tests/nightwatch/specialCharListLinks.js   | 11 +++++------
 app/addons/documentation/base.js                         |  2 +-
 .../documentation/tests/nightwatch/checksDocsPage.js     |  2 +-
 app/addons/documents/components/header-docs-left.jsx     |  2 +-
 app/addons/documents/doc-editor/actions.js               |  4 ++--
 app/addons/documents/doc-editor/components.react.jsx     |  4 ++--
 app/addons/documents/helpers.js                          |  4 ++--
 app/addons/documents/mango/mango.components.react.jsx    |  2 +-
 app/addons/documents/routes-doc-editor.js                |  4 ++--
 app/addons/documents/sidebar/sidebar.react.jsx           | 10 +++++-----
 .../documents/tests/nightwatch/navigateFromNewDoc.js     |  8 ++++----
 .../fauxton/tests/nightwatch/notificationCenter.js       |  4 ++--
 .../replication/tests/nightwatch/replicationactivity.js  |  4 ++--
 app/addons/setup/base.js                                 |  2 +-
 app/addons/verifyinstall/base.js                         |  2 +-
 app/core/api.js                                          | 11 +++++++++++
 app/core/utils.js                                        |  6 ++----
 test/nightwatch_tests/custom-commands/auth/loginToGUI.js |  6 +++---
 22 files changed, 57 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/auth/base.js
----------------------------------------------------------------------
diff --git a/app/addons/auth/base.js b/app/addons/auth/base.js
index 5956401..237a450 100644
--- a/app/addons/auth/base.js
+++ b/app/addons/auth/base.js
@@ -24,7 +24,7 @@ Auth.initialize = function () {
   FauxtonAPI.addHeaderLink({
     id: 'auth',
     title: 'Login',
-    href: '#login',
+    href: '#/login',
     icon: 'fonticon-user',
     bottomNav: true
   });
@@ -37,7 +37,7 @@ Auth.initialize = function () {
       link = {
         id: 'auth',
         title: 'Admin Party!',
-        href: '#createAdmin',
+        href: '#/createAdmin',
         icon: 'fonticon-user',
         bottomNav: true
       };
@@ -45,7 +45,7 @@ Auth.initialize = function () {
       link = {
         id: 'auth',
         title: session.user().name,
-        href: '#changePassword',
+        href: '#/changePassword',
         icon: 'fonticon-user',
         bottomNav: true
       };
@@ -64,7 +64,7 @@ Auth.initialize = function () {
       link = {
         id: 'auth',
         title: 'Login',
-        href: '#login',
+        href: '#/login',
         icon: 'fonticon-user',
         bottomNav: true
       };

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/components/components/apibar.js
----------------------------------------------------------------------
diff --git a/app/addons/components/components/apibar.js b/app/addons/components/components/apibar.js
index c853cc8..6967852 100644
--- a/app/addons/components/components/apibar.js
+++ b/app/addons/components/components/apibar.js
@@ -56,7 +56,7 @@ export const APIBar = React.createClass({
     if (!this.props.contentVisible) {
       return null;
     }
-
+    let endpoint = FauxtonAPI.url.decode(this.props.endpoint);
     return (
       <TrayContents className="tray show-tray api-bar-tray">
         <div className="input-prepend input-append">
@@ -68,14 +68,14 @@ export const APIBar = React.createClass({
           <FauxtonComponents.ClipboardWithTextField
             onClipBoardClick={this.showCopiedMessage}
             text="Copy URL"
-            textToCopy={this.props.endpoint}
+            textToCopy={endpoint}
             showCopyIcon={false}
             uniqueKey="clipboard-apiurl" />
 
           <div className="add-on">
             <a
               data-bypass="true"
-              href={this.props.endpoint}
+              href={endpoint}
               target="_blank"
               className="btn"
             >

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/components/header-breadcrumbs.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/header-breadcrumbs.jsx b/app/addons/components/header-breadcrumbs.jsx
index 8c3cdef..40ffaaf 100644
--- a/app/addons/components/header-breadcrumbs.jsx
+++ b/app/addons/components/header-breadcrumbs.jsx
@@ -48,7 +48,7 @@ function getChildren (crumbs) {
     if (c.link) {
       res = [
         <CrumbElement key={i}>
-          <a className="faux-header__breadcrumbs-link" href={c.link}>{c.name}</a>
+          <a className="faux-header__breadcrumbs-link" href={'#/' + c.link}>{c.name}</a>
         </CrumbElement>
       ];
     }

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/config/base.js
----------------------------------------------------------------------
diff --git a/app/addons/config/base.js b/app/addons/config/base.js
index a10cab0..8913ecf 100644
--- a/app/addons/config/base.js
+++ b/app/addons/config/base.js
@@ -17,7 +17,7 @@ import "./assets/less/config.less";
 Config.initialize = function () {
   FauxtonAPI.addHeaderLink({
     title: 'Configuration',
-    href: '#_config',
+    href: '#/_config',
     icon: 'fonticon-cog',
     className: 'config'
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/databases/tests/nightwatch/specialCharListLinks.js
----------------------------------------------------------------------
diff --git a/app/addons/databases/tests/nightwatch/specialCharListLinks.js b/app/addons/databases/tests/nightwatch/specialCharListLinks.js
index 493a4d2..d284df3 100644
--- a/app/addons/databases/tests/nightwatch/specialCharListLinks.js
+++ b/app/addons/databases/tests/nightwatch/specialCharListLinks.js
@@ -18,16 +18,15 @@ const testDatabases = [
   't/t-//t_f'
 ];
 
-const tests = {};
-
-testDatabases.forEach((db) => {
-  return tests[`Db List works with special chars ${db}`] = createTest(db);
-});
+const tests = testDatabases.reduce((tests, db) => {
+  tests[`Db List works with special chars ${db}`] = createTest(db);
+  return tests;
+}, {});
 
 module.exports = tests;
 
 function createTest (db) {
-  return function (client) {
+  return (client) => {
 
     const waitTime = client.globals.maxWaitTime;
     const baseUrl = client.globals.test_settings.launch_url;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documentation/base.js
----------------------------------------------------------------------
diff --git a/app/addons/documentation/base.js b/app/addons/documentation/base.js
index 76a998b..d69f8fe 100644
--- a/app/addons/documentation/base.js
+++ b/app/addons/documentation/base.js
@@ -20,7 +20,7 @@ Documentation.initialize = function () {
     id: 'Documentation',
     title: 'Documentation',
     icon: 'fonticon-bookmark',
-    href: '/documentation',
+    href: '#/documentation',
     bottomNav: true,
     top: true
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documentation/tests/nightwatch/checksDocsPage.js
----------------------------------------------------------------------
diff --git a/app/addons/documentation/tests/nightwatch/checksDocsPage.js b/app/addons/documentation/tests/nightwatch/checksDocsPage.js
index 9aaeaec..7af6f83 100644
--- a/app/addons/documentation/tests/nightwatch/checksDocsPage.js
+++ b/app/addons/documentation/tests/nightwatch/checksDocsPage.js
@@ -19,7 +19,7 @@ module.exports = {
 
     client
       .loginToGUI()
-      .clickWhenVisible('a[href="/documentation"]')
+      .clickWhenVisible('a[href="#/documentation"]')
       .waitForElementVisible('a[href="http://docs.couchdb.org/en/latest/"]', waitTime, false)
       .waitForElementVisible('a[href="/_utils/docs/contents.html"]', waitTime, false)
       .waitForElementVisible('a[href="http://blog.couchdb.org/"]', waitTime, false)

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/components/header-docs-left.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/components/header-docs-left.jsx b/app/addons/documents/components/header-docs-left.jsx
index d715a1e..85b893c 100644
--- a/app/addons/documents/components/header-docs-left.jsx
+++ b/app/addons/documents/components/header-docs-left.jsx
@@ -71,7 +71,7 @@ const HeaderDocsLeft = ({dbName}) => {
 
   return (
     <div className="faux-header__doc-header-left">
-      <button type="button" className="faux-header__doc-header-backlink" onClick={() => { FauxtonAPI.navigate('#_all_dbs'); }}>
+      <button type="button" className="faux-header__doc-header-backlink" onClick={() => { FauxtonAPI.navigate('#/_all_dbs'); }}>
         <i className="faux-header__doc-header-backlink__icon fonticon fonticon-left-open" />
       </button>
       <div className="faux-header__doc-header-title flex-fill" title={dbName}>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/doc-editor/actions.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/doc-editor/actions.js b/app/addons/documents/doc-editor/actions.js
index 9331ddd..ddc9656 100644
--- a/app/addons/documents/doc-editor/actions.js
+++ b/app/addons/documents/doc-editor/actions.js
@@ -13,7 +13,7 @@
 /* global FormData */
 
 import app from "../../../app";
-import FauxtonAPI from "../../../core/api";
+import FauxtonAPI, { url } from "../../../core/api";
 import ActionTypes from "./actiontypes";
 
 var xhr;
@@ -53,7 +53,7 @@ function saveDoc (doc, isValidDoc, onSave) {
 
     doc.save().then(function () {
       onSave(doc.prettyJSON());
-      FauxtonAPI.navigate('#' + FauxtonAPI.urls('allDocs', 'app', doc.database.id), {trigger: true});
+      FauxtonAPI.navigate('#/' + FauxtonAPI.urls('allDocs', 'app', url.encode(doc.database.id)), {trigger: true});
     }).fail(function (xhr) {
       FauxtonAPI.addNotification({
         msg: 'Save failed: ' + JSON.parse(xhr.responseText).reason,

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/doc-editor/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/doc-editor/components.react.jsx b/app/addons/documents/doc-editor/components.react.jsx
index b1956f5..7069f1b 100644
--- a/app/addons/documents/doc-editor/components.react.jsx
+++ b/app/addons/documents/doc-editor/components.react.jsx
@@ -163,7 +163,7 @@ var DocEditorController = React.createClass({
 
   render: function () {
     var saveButtonLabel = (this.props.isNewDoc) ? 'Create Document' : 'Save Changes';
-
+    let endpoint = FauxtonAPI.urls('allDocs', 'app', FauxtonAPI.url.encode(this.props.database.id));
     return (
       <div>
         <div id="doc-editor-actions-panel">
@@ -172,7 +172,7 @@ var DocEditorController = React.createClass({
               <i className="icon fonticon-ok-circled"></i> {saveButtonLabel}
             </button>
             <div>
-              <a href={FauxtonAPI.urls('allDocs', 'app', this.props.database.id)} className="js-back cancel-button">Cancel</a>
+              <a href={`#/${endpoint}`} className="js-back cancel-button">Cancel</a>
             </div>
           </div>
           <div className="alignRight">

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/helpers.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/helpers.js b/app/addons/documents/helpers.js
index 08f7192..1293843 100644
--- a/app/addons/documents/helpers.js
+++ b/app/addons/documents/helpers.js
@@ -23,7 +23,7 @@ function getSeqNum (val) {
 
 function getNewButtonLinks (databaseName) {
   var addLinks = FauxtonAPI.getExtensions('sidebar:links');
-  var newUrlPrefix = '#' + FauxtonAPI.urls('databaseBaseURL', 'app', databaseName);
+  var newUrlPrefix = '#' + FauxtonAPI.urls('databaseBaseURL', 'app', FauxtonAPI.url.encode(databaseName));
 
   var addNewLinks = _.reduce(addLinks, function (menuLinks, link) {
     menuLinks.push({
@@ -50,7 +50,7 @@ function getNewButtonLinks (databaseName) {
 }
 
 function getMangoLink (databaseName) {
-  var newUrlPrefix = '#' + FauxtonAPI.urls('databaseBaseURL', 'app', databaseName);
+  var newUrlPrefix = '#' + FauxtonAPI.urls('databaseBaseURL', 'app', FauxtonAPI.url.encode(databaseName));
 
   return {
     title: app.i18n.en_US['new-mango-index'],

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/mango/mango.components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/mango/mango.components.react.jsx b/app/addons/documents/mango/mango.components.react.jsx
index 113a7f9..abc5ddc 100644
--- a/app/addons/documents/mango/mango.components.react.jsx
+++ b/app/addons/documents/mango/mango.components.react.jsx
@@ -121,7 +121,7 @@ var MangoEditor = React.createClass({
   },
 
   render: function () {
-    var url = '#/' + FauxtonAPI.urls('allDocs', 'app', this.props.dbName, '');
+    var url = '#/' + FauxtonAPI.urls('allDocs', 'app', FauxtonAPI.url.encode(this.props.dbName), '');
 
     return (
       <div className="mango-editor-wrapper">

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/routes-doc-editor.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/routes-doc-editor.js b/app/addons/documents/routes-doc-editor.js
index 196c642..b13fc32 100644
--- a/app/addons/documents/routes-doc-editor.js
+++ b/app/addons/documents/routes-doc-editor.js
@@ -45,7 +45,7 @@ const DocEditorRouteObject = FauxtonAPI.RouteObject.extend({
   crumbs: function () {},
 
   revisionBrowser: function (databaseName, docId) {
-    const backLink = FauxtonAPI.urls('allDocs', 'app', this.database.safeID());
+    const backLink = FauxtonAPI.urls('allDocs', 'app', FauxtonAPI.url.encode(this.database.safeID()));
     const docUrl = FauxtonAPI.urls('document', 'app', this.database.safeID(), this.docId);
 
     this.crumbs = [
@@ -59,7 +59,7 @@ const DocEditorRouteObject = FauxtonAPI.RouteObject.extend({
   },
 
   codeEditor: function (databaseName, docId) {
-    const backLink = FauxtonAPI.urls('allDocs', 'app', databaseName);
+    const backLink = FauxtonAPI.urls('allDocs', 'app', FauxtonAPI.url.encode(databaseName));
 
     this.crumbs =  [
       { name: databaseName, link: backLink },

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/sidebar/sidebar.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/sidebar/sidebar.react.jsx b/app/addons/documents/sidebar/sidebar.react.jsx
index 700f035..b791fa2 100644
--- a/app/addons/documents/sidebar/sidebar.react.jsx
+++ b/app/addons/documents/sidebar/sidebar.react.jsx
@@ -61,10 +61,11 @@ var MainSidebar = React.createClass({
 
   render: function () {
     var docLinks = this.buildDocLinks();
-    var changesUrl     = '#' + FauxtonAPI.urls('changes', 'app', this.props.databaseName, '');
-    var permissionsUrl = '#' + FauxtonAPI.urls('permissions', 'app', this.props.databaseName);
-    var databaseUrl    = FauxtonAPI.urls('allDocs', 'app', this.props.databaseName, '');
-    var mangoQueryUrl  = FauxtonAPI.urls('mango', 'query-app', this.props.databaseName);
+    var dbEncoded = FauxtonAPI.url.encode(this.props.databaseName);
+    var changesUrl     = '#' + FauxtonAPI.urls('changes', 'app', dbEncoded, '');
+    var permissionsUrl = '#' + FauxtonAPI.urls('permissions', 'app', dbEncoded);
+    var databaseUrl    = FauxtonAPI.urls('allDocs', 'app', dbEncoded, '');
+    var mangoQueryUrl  = FauxtonAPI.urls('mango', 'query-app', dbEncoded);
     var runQueryWithMangoText = app.i18n.en_US['run-query-with-mango'];
     var buttonLinks = this.getNewButtonLinks();
 
@@ -442,7 +443,6 @@ var SidebarController = React.createClass({
       availableDesignDocIds: store.getAvailableDesignDocs(),
       toggledSections: store.getToggledSections(),
       isLoading: store.isLoading(),
-      database: store.getDatabase(),
       deleteDbModalProperties: deleteDbModalStore.getShowDeleteDatabaseModal(),
 
       deleteIndexModalVisible: store.isDeleteIndexModalVisible(),

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/documents/tests/nightwatch/navigateFromNewDoc.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/navigateFromNewDoc.js b/app/addons/documents/tests/nightwatch/navigateFromNewDoc.js
index 0f51deb..786f5fa 100644
--- a/app/addons/documents/tests/nightwatch/navigateFromNewDoc.js
+++ b/app/addons/documents/tests/nightwatch/navigateFromNewDoc.js
@@ -21,18 +21,18 @@ module.exports = {
       newDatabaseName = client.globals.testDatabaseName,
       baseUrl = client.globals.test_settings.launch_url;
 
-    var newLink = '#/database/' + newDatabaseName + '/new';
+    var newLink = '/#/database/' + newDatabaseName + '/new';
 
     client
       .loginToGUI()
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
       .clickWhenVisible('#new-all-docs-button a')
-      .clickWhenVisible('#new-all-docs-button a[href="' + newLink + '"]')
+      .clickWhenVisible('#new-all-docs-button a[href="' + newLink.replace("/", "") + '"]')
       .waitForElementPresent('.code-region', waitTime, false)
-      .verify.urlEquals(baseUrl + '/' + newLink)
+      .verify.urlEquals(baseUrl + newLink)
 
       // now redirect back to the all docs page and check it's loaded properly
       .clickWhenVisible('.faux-header__breadcrumbs-link')
-      .verify.urlEquals(baseUrl + '/#database/' + newDatabaseName + '/_all_docs');
+      .verify.urlEquals(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs');
   }
 };

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/fauxton/tests/nightwatch/notificationCenter.js
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/tests/nightwatch/notificationCenter.js b/app/addons/fauxton/tests/nightwatch/notificationCenter.js
index b1bac4c..b81d860 100644
--- a/app/addons/fauxton/tests/nightwatch/notificationCenter.js
+++ b/app/addons/fauxton/tests/nightwatch/notificationCenter.js
@@ -18,10 +18,10 @@ module.exports = {
         baseUrl = client.globals.test_settings.launch_url;
 
     client
-      .url(baseUrl + '/#login')
+      .url(baseUrl + '/#/login')
 
       // confirm the btn doesn't appear on the login screen
-      .waitForElementPresent('a[href="#login"]', waitTime, false)
+      .waitForElementPresent('a[href="#/login"]', waitTime, false)
       .waitForElementNotPresent('#notification-center-btn div.fonticon-bell', waitTime, false)
 
       .loginToGUI()

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/replication/tests/nightwatch/replicationactivity.js
----------------------------------------------------------------------
diff --git a/app/addons/replication/tests/nightwatch/replicationactivity.js b/app/addons/replication/tests/nightwatch/replicationactivity.js
index 292eb0a..b8dc7c3 100644
--- a/app/addons/replication/tests/nightwatch/replicationactivity.js
+++ b/app/addons/replication/tests/nightwatch/replicationactivity.js
@@ -29,7 +29,7 @@ module.exports = {
       .createDocument(replicatorDoc._id, '_replicator', replicatorDoc)
       .loginToGUI()
       .waitForElementNotPresent('.global-notification .fonticon-cancel', waitTime, false)
-      .url(baseUrl + '/#replication')
+      .url(baseUrl + '/#/replication')
       .waitForElementNotPresent('.load-lines', waitTime, true)
       .waitForElementPresent('.replication__filter', waitTime, true)
       .click('a[title="Delete document existing-doc-id-2"]')
@@ -40,7 +40,7 @@ module.exports = {
       .waitForElementNotPresent('.global-notification .fonticon-cancel', waitTime, false)
       .url(baseUrl)
       .waitForElementPresent('.databases.table', waitTime, false)
-      .url(baseUrl + '/#replication')
+      .url(baseUrl + '/#/replication')
       .waitForElementNotPresent('.load-lines', waitTime, true)
       .waitForElementNotPresent('a[title="Delete document existing-doc-id-2"]', waitTime, true)
       .assert.elementNotPresent('a[title="Delete document existing-doc-id-2"]')

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/setup/base.js
----------------------------------------------------------------------
diff --git a/app/addons/setup/base.js b/app/addons/setup/base.js
index 1750885..918532a 100644
--- a/app/addons/setup/base.js
+++ b/app/addons/setup/base.js
@@ -17,7 +17,7 @@ import "./assets/less/setup.less";
 Setup.initialize = function () {
   FauxtonAPI.addHeaderLink({
     title: 'Setup',
-    href: "#setup",
+    href: "#/setup",
     icon: 'fonticon-wrench'
   });
 };

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/addons/verifyinstall/base.js
----------------------------------------------------------------------
diff --git a/app/addons/verifyinstall/base.js b/app/addons/verifyinstall/base.js
index 23a6ce7..b9d9aac 100644
--- a/app/addons/verifyinstall/base.js
+++ b/app/addons/verifyinstall/base.js
@@ -17,7 +17,7 @@ import "./assets/less/verifyinstall.less";
 VerifyInstall.initialize = function () {
   FauxtonAPI.addHeaderLink({
     title: 'Verify',
-    href: '#verifyinstall',
+    href: '#/verifyinstall',
     icon: 'fonticon-ok-circled',
     bottomNav: true
   });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/core/api.js
----------------------------------------------------------------------
diff --git a/app/core/api.js b/app/core/api.js
index 6240337..81a2725 100644
--- a/app/core/api.js
+++ b/app/core/api.js
@@ -67,6 +67,17 @@ FauxtonAPI.registerUrls = function (namespace, urls) {
   urlPaths[namespace] = urls;
 };
 
+FauxtonAPI.url = {
+  encode(name = "") {
+    // These special caracters are allowed by couch: _, $, (, ), +, -, and /
+    // From them only $ + and / are to be escaped in a URI component.
+    return (/[$+/]/g.test(name)) ? encodeURIComponent(name) : name;
+  },
+  decode(name = "") {
+    return (/[$+/]/g.test(name)) ? decodeURIComponent(name) : name;
+  }
+};
+
 //This is a little rough and needs some improvement. But the basic concept is there
 FauxtonAPI.urls = function (name, context) {
   var interceptors = FauxtonAPI.getExtensions('urls:interceptors');

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/app/core/utils.js
----------------------------------------------------------------------
diff --git a/app/core/utils.js b/app/core/utils.js
index c159eb1..014e233 100644
--- a/app/core/utils.js
+++ b/app/core/utils.js
@@ -66,12 +66,10 @@ var utils = {
     return name.replace(/[^\w\s]/gi, "");
   },
 
-  safeURLName: function (name) {
-    var testName = name || "";
+  safeURLName: function (name = "") {
     // These special caracters are allowed by couch: _, $, (, ), +, -, and /
     // From them only $ + and / are to be escaped in a URI component.
-    var checkforBad = testName.match(/[$+/]/g);
-    return (checkforBad !== null) ? encodeURIComponent(name) : name;
+    return (/[$+/]/g.test(name)) ? encodeURIComponent(name) : name;
   },
 
   getDocTypeFromId: function (id) {

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/1aa4ca6f/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
----------------------------------------------------------------------
diff --git a/test/nightwatch_tests/custom-commands/auth/loginToGUI.js b/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
index 4f8eda2..2eb1594 100644
--- a/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
+++ b/test/nightwatch_tests/custom-commands/auth/loginToGUI.js
@@ -22,9 +22,9 @@ function LoginToGui (user, pw) {
   const password = pw || client.globals.test_settings.password;
 
   client
-    .url(baseUrl + '/#login')
-    .waitForElementPresent('a[href="#login"]', waitTime, false)
-    .click('a[href="#login"]')
+    .url(baseUrl + '/#/login')
+    .waitForElementPresent('a[href="#/login"]', waitTime, false)
+    .click('a[href="#/login"]')
     .waitForElementVisible('.couch-login-wrapper', waitTime, false)
     .waitForElementVisible('#username', waitTime, false)
     .setValue('.couch-login-wrapper #username', [username])