Fixing URL path resolution handling forward-slashes.
diff --git a/lib/base_operation.js b/lib/base_operation.js
index 3a54450..900c840 100644
--- a/lib/base_operation.js
+++ b/lib/base_operation.js
@@ -2,6 +2,8 @@
 
 const messages = require('./messages')
 const rp = require('request-promise')
+const url = require('url')
+const path = require('path')
 
 class BaseOperation {
   constructor (options) {
@@ -16,13 +18,19 @@
     return {
       json: true,
       method: method,
-      url: `${this.options.api}${path}`,
+      url: this.path_url(path),
       headers: {
         Authorization: this.auth_header()
       }
     }
   }
 
+  path_url (url_path) {
+    const endpoint = url.parse(this.options.api)
+    endpoint.pathname = path.resolve(endpoint.pathname, url_path)
+    return url.format(endpoint)
+  }
+
   namespace (options) {
     if (options && options.hasOwnProperty('namespace')) {
       return options.namespace
diff --git a/package.json b/package.json
index 611010b..ce3caf0 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
   },
   "homepage": "https://github.com/openwhisk/openwhisk-client-js#readme",
   "devDependencies": {
-    "ava": "^0.13.0",
+    "ava": "^0.15.2",
     "proxyquire": "1.7.4"
   },
   "dependencies": {
diff --git a/test/integration/actions.test.js b/test/integration/actions.test.js
index 612bb55..47e5bdd 100644
--- a/test/integration/actions.test.js
+++ b/test/integration/actions.test.js
@@ -107,7 +107,7 @@
   const actions = new Actions(params)
   return actions.create({actionName: 'random_invoke_test', action: 'function main(params) {return params}'}).then(result => {
     return actions.invoke({actionName: 'random_invoke_test', params: {hello: 'world'}, blocking: true}).then(invoke_result => {
-      t.same(invoke_result.response.result, {hello: 'world'})
+      t.deepEqual(invoke_result.response.result, {hello: 'world'})
       t.true(invoke_result.response.success)
       t.pass()
       return actions.delete({actionName: 'random_invoke_test'}).catch(errors)
diff --git a/test/integration/packages.test.js b/test/integration/packages.test.js
index 9258bac..fe1f30c 100644
--- a/test/integration/packages.test.js
+++ b/test/integration/packages.test.js
@@ -63,7 +63,7 @@
   return packages.create({packageName: 'random_package_test'}).then(result => {
     t.is(result.name, 'random_package_test')
     t.is(result.namespace, NAMESPACE)
-    t.same(result.annotations, [])
+    t.deepEqual(result.annotations, [])
     t.is(result.version, '0.0.1')
     return packages.get({packageName: 'random_package_test'}).then(package_result => {
       t.is(package_result.name, 'random_package_test')
@@ -86,7 +86,7 @@
   return packages.create({packageName: 'random_package_update_test'}).then(result => {
     t.is(result.name, 'random_package_update_test')
     t.is(result.namespace, NAMESPACE)
-    t.same(result.annotations, [])
+    t.deepEqual(result.annotations, [])
     t.is(result.version, '0.0.1')
     return packages.update({packageName: 'random_package_update_test'}).then(update_result => {
       t.is(update_result.version, '0.0.2')
diff --git a/test/integration/triggers.test.js b/test/integration/triggers.test.js
index bcf77c5..9ed4e1e 100644
--- a/test/integration/triggers.test.js
+++ b/test/integration/triggers.test.js
@@ -63,9 +63,9 @@
   return triggers.create({triggerName: 'random_trigger_test'}).then(result => {
     t.is(result.name, 'random_trigger_test')
     t.is(result.namespace, NAMESPACE)
-    t.same(result.annotations, [])
+    t.deepEqual(result.annotations, [])
     t.is(result.version, '0.0.1')
-    t.same(result.limits, {})
+    t.deepEqual(result.limits, {})
     t.pass()
     return triggers.get({triggerName: result.name}).then(trigger_result => {
       t.is(trigger_result.name, result.name)
@@ -88,9 +88,9 @@
   return triggers.create({triggerName: 'random_create_update_test'}).then(result => {
     t.is(result.name, 'random_create_update_test')
     t.is(result.namespace, NAMESPACE)
-    t.same(result.annotations, [])
+    t.deepEqual(result.annotations, [])
     t.is(result.version, '0.0.1')
-    t.same(result.limits, {})
+    t.deepEqual(result.limits, {})
     return triggers.update({triggerName: 'random_create_update_test'}).then(update_result => {
       t.is(update_result.version, '0.0.2')
       t.pass()
diff --git a/test/unit/actions.test.js b/test/unit/actions.test.js
index 125319a..2ae0f87 100644
--- a/test/unit/actions.test.js
+++ b/test/unit/actions.test.js
@@ -31,7 +31,7 @@
   stub.request = req => {
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
-    t.same(req.qs, options)
+    t.deepEqual(req.qs, options)
     t.is(req.method, 'GET')
     return Promise.resolve()
   }
@@ -193,8 +193,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {exec: {kind: 'nodejs', code: action}})
-    t.same(req.qs, {})
+    t.deepEqual(req.body, {exec: {kind: 'nodejs', code: action}})
+    t.deepEqual(req.qs, {})
     return Promise.resolve()
   }
 
@@ -214,8 +214,8 @@
     t.is(req.url, `${params.api}namespaces/${namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {exec: {kind: 'nodejs', code: action}})
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, {exec: {kind: 'nodejs', code: action}})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -236,8 +236,8 @@
     t.is(req.url, `${params.api}namespaces/${namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {exec: {kind: 'swift', code: code}})
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, {exec: {kind: 'swift', code: code}})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -289,8 +289,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {exec: {kind: 'nodejs', code: action}})
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, {exec: {kind: 'nodejs', code: action}})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -308,7 +308,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {})
+    t.deepEqual(req.body, {})
     return Promise.resolve()
   }
 
@@ -326,7 +326,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {})
+    t.deepEqual(req.body, {})
     return Promise.resolve()
   }
 
@@ -344,7 +344,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {a: 1, b: 2})
+    t.deepEqual(req.body, {a: 1, b: 2})
     return Promise.resolve()
   }
 
@@ -362,8 +362,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/actions/${action_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {})
-    t.same(req.qs, {blocking: true})
+    t.deepEqual(req.body, {})
+    t.deepEqual(req.qs, {blocking: true})
     return Promise.resolve()
   }
 
diff --git a/test/unit/activations.test.js b/test/unit/activations.test.js
index 637fc96..c40ab0a 100644
--- a/test/unit/activations.test.js
+++ b/test/unit/activations.test.js
@@ -33,7 +33,7 @@
     t.is(req.url, `${params.api}namespaces/options_namespace/activations`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'GET')
-    t.same(req.qs, {name: 'Hello', limit: 100, skip: 100, upto: 100, docs: true})
+    t.deepEqual(req.qs, {name: 'Hello', limit: 100, skip: 100, upto: 100, docs: true})
     return Promise.resolve()
   }
 
@@ -49,7 +49,7 @@
   const params = {api: 'https://openwhisk.ng.bluemix.net/api/v1/', api_key: 'user_authorisation_key', namespace: namespace}
 
   stub.request = req => {
-    t.is(req.url, `${params.api}namespaces/${namespace}/activations/${activation_id}/`)
+    t.is(req.url, `${params.api}namespaces/${namespace}/activations/${activation_id}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'GET')
     return Promise.resolve()
diff --git a/test/unit/base_operation.test.js b/test/unit/base_operation.test.js
index 4a01a82..cc98e2d 100644
--- a/test/unit/base_operation.test.js
+++ b/test/unit/base_operation.test.js
@@ -26,10 +26,10 @@
 
 test('should extract available query string parameters', t => {
   const base_operation = new BaseOperation()
-  t.same(base_operation.qs({}, ['a', 'b', 'c']), {})
-  t.same(base_operation.qs({a: 1}, ['a', 'b', 'c']), {a: 1})
-  t.same(base_operation.qs({a: 1, c: 2}, ['a', 'b', 'c']), {a: 1, c: 2})
-  t.same(base_operation.qs({a: 1, c: 2, d: 3}, ['a', 'b', 'c']), {a: 1, c: 2})
+  t.deepEqual(base_operation.qs({}, ['a', 'b', 'c']), {})
+  t.deepEqual(base_operation.qs({a: 1}, ['a', 'b', 'c']), {a: 1})
+  t.deepEqual(base_operation.qs({a: 1, c: 2}, ['a', 'b', 'c']), {a: 1, c: 2})
+  t.deepEqual(base_operation.qs({a: 1, c: 2, d: 3}, ['a', 'b', 'c']), {a: 1, c: 2})
 })
 
 test('should return provided namespace', t => {
@@ -50,9 +50,18 @@
 })
 
 test('should return request parameters from path', t => {
-  const base_operation = new BaseOperation({api: 'https://api.com/', api_key: 'default'})
+  const base_operation = new BaseOperation({api: 'https://api.com/api/v1/', api_key: 'default'})
   const params = base_operation.params('method', 'some/path')
-  t.is(params.url, 'https://api.com/some/path')
+  t.is(params.url, 'https://api.com/api/v1/some/path')
+  t.is(params.method, 'method')
+  t.true(params.json, true)
+  t.true(params.headers.hasOwnProperty('Authorization'))
+})
+
+test('should return request parameters from path without ending forward slash', t => {
+  const base_operation = new BaseOperation({api: 'https://api.com/api/v1', api_key: 'default'})
+  const params = base_operation.params('method', 'some/path')
+  t.is(params.url, 'https://api.com/api/v1/some/path')
   t.is(params.method, 'method')
   t.true(params.json, true)
   t.true(params.headers.hasOwnProperty('Authorization'))
diff --git a/test/unit/packages.test.js b/test/unit/packages.test.js
index c2fd758..1baa1b5 100644
--- a/test/unit/packages.test.js
+++ b/test/unit/packages.test.js
@@ -31,7 +31,7 @@
   stub.request = req => {
     t.is(req.url, `${params.api}namespaces/${options.namespace}/packages`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
-    t.same(req.qs, {limit: 100, skip: 50, public: true})
+    t.deepEqual(req.qs, {limit: 100, skip: 50, public: true})
     t.is(req.method, 'GET')
     return Promise.resolve()
   }
@@ -176,8 +176,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/packages/${package_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, packageBody)
-    t.same(req.qs, {})
+    t.deepEqual(req.body, packageBody)
+    t.deepEqual(req.qs, {})
     return Promise.resolve()
   }
 
@@ -197,8 +197,8 @@
     t.is(req.url, `${params.api}namespaces/${namespace}/packages/${package_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, packageBody)
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, packageBody)
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -239,8 +239,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/packages/${package_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, packageBody)
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, packageBody)
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
diff --git a/test/unit/rules.test.js b/test/unit/rules.test.js
index 2111256..a71f1e6 100644
--- a/test/unit/rules.test.js
+++ b/test/unit/rules.test.js
@@ -31,7 +31,7 @@
   stub.request = req => {
     t.is(req.url, `${params.api}namespaces/${options.namespace}/rules`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
-    t.same(req.qs, {limit: 100, skip: 50})
+    t.deepEqual(req.qs, {limit: 100, skip: 50})
     t.is(req.method, 'GET')
     return Promise.resolve()
   }
@@ -176,8 +176,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/rules/${rule_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {action: rule.action, trigger: rule.trigger})
-    t.same(req.qs, {})
+    t.deepEqual(req.body, {action: rule.action, trigger: rule.trigger})
+    t.deepEqual(req.qs, {})
     return Promise.resolve()
   }
 
@@ -197,8 +197,8 @@
     t.is(req.url, `${params.api}namespaces/${namespace}/rules/${rule_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {action: rule.action, trigger: rule.trigger})
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, {action: rule.action, trigger: rule.trigger})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -261,8 +261,8 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/rules/${rule_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
-    t.same(req.body, {action: rule.action, trigger: rule.trigger})
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.body, {action: rule.action, trigger: rule.trigger})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -280,7 +280,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/rules/${rule_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {status: 'active'})
+    t.deepEqual(req.body, {status: 'active'})
     return Promise.resolve()
   }
 
@@ -298,7 +298,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/rules/${rule_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {status: 'inactive'})
+    t.deepEqual(req.body, {status: 'inactive'})
     return Promise.resolve()
   }
 
diff --git a/test/unit/triggers.test.js b/test/unit/triggers.test.js
index 1cb7fd0..2b7bab4 100644
--- a/test/unit/triggers.test.js
+++ b/test/unit/triggers.test.js
@@ -31,7 +31,7 @@
   stub.request = req => {
     t.is(req.url, `${params.api}namespaces/${options.namespace}/triggers`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
-    t.same(req.qs, {limit: 100, skip: 50})
+    t.deepEqual(req.qs, {limit: 100, skip: 50})
     t.is(req.method, 'GET')
     return Promise.resolve()
   }
@@ -176,7 +176,7 @@
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
     t.is(Object.keys(req.body).length, 0)
-    t.same(req.qs, {})
+    t.deepEqual(req.qs, {})
     return Promise.resolve()
   }
 
@@ -196,7 +196,7 @@
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
     t.is(Object.keys(req.body).length, 0)
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -237,7 +237,7 @@
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'PUT')
     t.is(Object.keys(req.body).length, 0)
-    t.same(req.qs, {overwrite: true})
+    t.deepEqual(req.qs, {overwrite: true})
     return Promise.resolve()
   }
 
@@ -273,7 +273,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/triggers/${trigger_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {})
+    t.deepEqual(req.body, {})
     return Promise.resolve()
   }
 
@@ -291,7 +291,7 @@
     t.is(req.url, `${params.api}namespaces/${params.namespace}/triggers/${trigger_name}`)
     t.is(req.headers.Authorization, `Basic ${new Buffer(params.api_key).toString('base64')}`)
     t.is(req.method, 'POST')
-    t.same(req.body, {a: 1, b: 2})
+    t.deepEqual(req.body, {a: 1, b: 2})
     return Promise.resolve()
   }