diff --git a/package.json b/package.json
index 81875ac..9a6c035 100644
--- a/package.json
+++ b/package.json
@@ -9,5 +9,13 @@
     "once": "^1.4.0",
     "pump": "^1.0.2",
     "qs": "^6.5.1"
-  }
+  },
+  "devDependencies": {
+    "chai": "^4.2.0",
+    "mocha": "^6.1.4"
+  },
+  "contributors": [
+    "Tom O'Donnell <todonnel91@gmail.com>",
+    "Vaibhav Saini <vasa@towardsblockchain.com>"
+  ]
 }
diff --git a/test/helpers/index.js b/test/helpers/index.js
new file mode 100644
index 0000000..7e6030f
--- /dev/null
+++ b/test/helpers/index.js
@@ -0,0 +1,6 @@
+const ipfsCluster = require('../../')
+
+// IPFS Cluster node (ipfs-cluster-service) must be running at port 9094 on the same machine
+const cluster = ipfsCluster('127.0.0.1', '9094', {protocol: 'http'})
+
+module.exports = cluster
\ No newline at end of file
diff --git a/test/test.id.js b/test/test.id.js
new file mode 100644
index 0000000..b3a6f03
--- /dev/null
+++ b/test/test.id.js
@@ -0,0 +1,11 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+describe('id', () => {
+    it('shows cluster peer and ipfs daemon information', (done) => {
+        cluster.id({ protocol: 'http' }, (err, details) => {
+            assert.notExists(err, 'throws error while fetching cluster peer and ipfs daemon information')
+            done()
+        })
+    })
+})
diff --git a/test/test.peers.add.js b/test/test.peers.add.js
new file mode 100644
index 0000000..f51dfa4
--- /dev/null
+++ b/test/test.peers.add.js
@@ -0,0 +1,19 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+describe('peers.add', () => {
+
+    it('throws error while adding a peer with invalid address', (done) => {
+        cluster.peers.add("invalid address", {}, (err) => {
+            assert.notDeepEqual(err, null, "adds a peer with invlaid address")
+            done()
+        })
+    })
+
+    /* it('adds a cluster peer', (done) => {
+        cluster.peers.add("/ip4/1.2.3.4/tcp/1234/<peerid>", {}, (err) => {
+            assert.notExists(err, 'throws error while fetching the list of cluster peers')
+            done()
+        })
+    }) */
+})
diff --git a/test/test.peers.ls.js b/test/test.peers.ls.js
new file mode 100644
index 0000000..434863c
--- /dev/null
+++ b/test/test.peers.ls.js
@@ -0,0 +1,11 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+describe('peers.ls', () => {
+    it('lists cluster peers', (done) => {
+        cluster.peers.ls({ protocol: 'http' }, (err, peers) => {
+            assert.notExists(err, 'throws error while fetching the list of cluster peers')
+            done()
+        })
+    })
+})
diff --git a/test/test.peers.rm.js b/test/test.peers.rm.js
new file mode 100644
index 0000000..2c37660
--- /dev/null
+++ b/test/test.peers.rm.js
@@ -0,0 +1,24 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+describe('peers.rm', () => {
+    
+    it('throws error while removing peer with invalid id', (done) => {
+        cluster.peers.rm("invalidID", {}, (err) => {
+            assert.notDeepEqual(err, null, "removes peer with invalid id")
+            done()
+        })
+    })
+
+    cluster.peers.ls({protocol: 'http'}, (err, peers) => {
+        assert.equal(err, null, 'throws error while fetching the list of cluster peers')
+        if (peers.length>=2){
+            it('removes a cluster peer by id', (done) => {
+                cluster.peers.rm(peers[1].id, {}, (err) => {
+                    assert.equal(err, null, 'throws error while removing a cluster peer by id')
+                    done()
+                })
+            })    
+        }
+    })
+})
diff --git a/test/test.pin.add.js b/test/test.pin.add.js
new file mode 100644
index 0000000..d7a9b31
--- /dev/null
+++ b/test/test.pin.add.js
@@ -0,0 +1,13 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+const CID = "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"
+
+describe('pin.add', () => {
+    it('pins a CID in the cluster', (done) => {
+        cluster.pin.add(CID, {}, (err) => {
+            assert.notExists(err, 'throws error while pinning a CID in the cluster')
+            done()
+        })
+    })
+})
diff --git a/test/test.pin.ls.js b/test/test.pin.ls.js
new file mode 100644
index 0000000..cb45168
--- /dev/null
+++ b/test/test.pin.ls.js
@@ -0,0 +1,14 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+const CID = "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"
+
+describe('pin.ls', () => {
+
+    it('list details for a pinned CID', (done) => {
+        cluster.pin.ls(CID, (err, details) => {
+            assert.notExists(err, 'throws error while listing details for a pinned CID')
+            done()
+        })
+    })
+})
diff --git a/test/test.pin.rm.js b/test/test.pin.rm.js
new file mode 100644
index 0000000..a8cd082
--- /dev/null
+++ b/test/test.pin.rm.js
@@ -0,0 +1,13 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+const CID = "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"
+
+describe('pin.rm', () => {
+    it('unpins a CID from the cluster', (done) => {
+        cluster.pin.rm(CID, {}, (err) => {
+            assert.notExists(err, 'throws error while unpinning a CID from the cluster')
+            done()
+        })
+    })
+})
diff --git a/test/test.recover.js b/test/test.recover.js
new file mode 100644
index 0000000..2def2ab
--- /dev/null
+++ b/test/test.recover.js
@@ -0,0 +1,13 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+const CID = "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"
+
+describe('recover', () => {
+    it('attempts to re-pin/unpin CIDs in error state', (done) => {
+        cluster.recover(CID, {}, (err) => {
+            assert.notExists(err, 'throws error while attempting to re-pin/unpin CIDs in error state')
+            done()
+        })
+    })
+})
diff --git a/test/test.status.js b/test/test.status.js
new file mode 100644
index 0000000..4955f70
--- /dev/null
+++ b/test/test.status.js
@@ -0,0 +1,13 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+const CID = "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"
+
+describe('status', () => {
+    it('lists current status of tracked CIDs (local state)', (done) => {
+        cluster.status(CID, (err, status) => {
+            assert.notExists(err, 'throws error while listing current status of tracked CIDs')
+            done()
+        })
+    })
+})
diff --git a/test/test.sync.js b/test/test.sync.js
new file mode 100644
index 0000000..8155546
--- /dev/null
+++ b/test/test.sync.js
@@ -0,0 +1,13 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+const CID = "QmRAQB6YaCyidP37UdDnjFY5vQuiBrcqdyoW1CuDgwxkD4"
+
+describe('sync', () => {
+    it('re-syncs seen status against status reported by the IPFS daemon', (done) => {
+        cluster.id(CID, (err) => {
+            assert.notExists(err, 'throws error while re-syncing seen status against status reported by the IPFS daemon')
+            done()
+        })
+    })
+})
diff --git a/test/test.version.js b/test/test.version.js
new file mode 100644
index 0000000..4e226cf
--- /dev/null
+++ b/test/test.version.js
@@ -0,0 +1,12 @@
+const cluster = require('./helpers')
+const assert = require('chai').assert
+
+describe('version', () => {
+    it('shows version', (done) => {
+        cluster.version({}, (err, version) => {
+            assert.equal(JSON.stringify(version), JSON.stringify({ version: '0.10.1' }), "outputs invalid version")
+            assert.notExists(err, 'throws error while fetching cluster peer and ipfs daemon information')
+            done()
+        })
+    })
+})