From 7636932bc6af6b509269c6adfd620c5283051b3f Mon Sep 17 00:00:00 2001
From: Ben Burwell <ben@benburwell.com>
Date: Wed, 16 Dec 2015 22:09:50 -0500
Subject: Update unit tests

---
 lib/clients/refresh.js       |   6 +-
 package.json                 |  10 +--
 tests/active911.js           | 145 ++++++++++++++++++++++++++++++++++++-------
 tests/replies/alert.json     |  45 ++++++++++++++
 tests/replies/alerts.json    |  15 +++++
 tests/replies/location.json  |  22 +++++++
 tests/replies/locations.json |  11 ++++
 tests/replies/resource.json  |  22 +++++++
 8 files changed, 247 insertions(+), 29 deletions(-)
 create mode 100644 tests/replies/alert.json
 create mode 100644 tests/replies/alerts.json
 create mode 100644 tests/replies/location.json
 create mode 100644 tests/replies/locations.json
 create mode 100644 tests/replies/resource.json

diff --git a/lib/clients/refresh.js b/lib/clients/refresh.js
index b4a3930..7b9fde7 100644
--- a/lib/clients/refresh.js
+++ b/lib/clients/refresh.js
@@ -1,4 +1,6 @@
 var request = require('request');
+var Timestamp = require('unix-timestamp');
+Timestamp.round = true;
 
 var RefreshClient = function(refreshString) {
   if (typeof refreshString !== 'string') {
@@ -6,7 +8,7 @@ var RefreshClient = function(refreshString) {
   }
   this._refreshToken = refreshString;
   this._accessToken = '';
-  this._accessTokenExpiration = Math.floor( new Date()/1000 );
+  this._accessTokenExpiration = Timestamp.now(-1);
 };
 
 RefreshClient.prototype._doRequest = function(url) {
@@ -47,7 +49,7 @@ RefreshClient.prototype._doRequest = function(url) {
 RefreshClient.prototype._getAccessToken = function() {
   var self = this;
   return new Promise(function(fulfill, reject) {
-    var currentTime = Math.floor( new Date()/1000 );
+    var currentTime = Timestamp.now();
     if (self._accessTokenExpiration - currentTime <= 10) {
       fulfill(self._refreshAccessToken());
     } else {
diff --git a/package.json b/package.json
index 6473beb..17af6b9 100644
--- a/package.json
+++ b/package.json
@@ -25,14 +25,16 @@
   },
   "homepage": "https://github.com/benburwell/active911#readme",
   "dependencies": {
-    "request": "^2.67.0"
+    "request": "^2.67.0",
+    "unix-timestamp": "^0.2.0"
   },
   "engines": {
-    "node": ">=4.0.0"
+    "node": ">=0.12.0"
   },
   "devDependencies": {
+    "chai": "^3.4.1",
+    "chai-as-promised": "^5.1.0",
     "mocha": "^2.3.4",
-    "nock": "^3.4.0",
-    "should": "^8.0.1"
+    "nock": "^3.4.0"
   }
 }
diff --git a/tests/active911.js b/tests/active911.js
index c0a9e1b..0aa9ffa 100644
--- a/tests/active911.js
+++ b/tests/active911.js
@@ -1,39 +1,138 @@
-var should = require('should');
+var chai = require('chai');
+var should = chai.should();
+var chaiAsPromised = require('chai-as-promised');
+chai.use(chaiAsPromised);
 var nock = require('nock');
+var Timestamp = require('unix-timestamp');
 var Active911 = require('../lib/active911.js');
 
-var a911;
-var testDeviceResponse = require('./replies/device.json');
-var testAgencyResponse = require('./replies/agency.json');
-var testErrorResponse = require('./replies/error.json');
+var client;
+var deviceResponse = require('./replies/device.json');
+var agencyResponse = require('./replies/agency.json');
+var alertsResponse = require('./replies/alerts.json');
+var alertResponse = require('./replies/alert.json');
+var locationsResponse = require('./replies/locations.json');
+var locationResponse = require('./replies/location.json');
+var resourceResponse = require('./replies/resource.json');
+var errorResponse = require('./replies/error.json');
+
+var nockPath = function(path, response) {
+  nock('https://access.active911.com')
+    .get('/interface/open_api/api' + path)
+    .reply(200, response);
+};
+
+var nockError = function(path) {
+  nock('https://access.active911.com')
+    .get('/interface/open_api/api' + path)
+    .reply(400, errorResponse);
+};
 
 describe('Active911 API', function() {
   beforeEach(function(done) {
-    a911 = new Active911.RefreshClient('CLIENT');
+    client = new Active911.RefreshClient('CLIENT');
+    nock('https://www.active911.com')
+      .post('/interface/dev/api_access.php')
+      .reply(200, {
+        access_token: 'DUMMY',
+        expiration: Timestamp.now(100)
+      });
     done();
   });
 
   describe('#getAgency', function() {
-    it('Should return correct agency data', function() {
-      nock('https://access.active911.com')
-        .get('/interface/open_api/api/')
-        .replyWithFile(200, __dirname + 'replies/agency.json');
-      a911.getAgency().then(function(agency) {
-        agency.should.equal(testAgencyResponse.message.agency);
-      }).catch(function(err) {
-        should.fail();
-      });
+    it('Should return correct data', function() {
+      nockPath('/', agencyResponse);
+      return client.getAgency().should.eventually.deep.equal(agencyResponse.message.agency);
     });
 
     it('Should give an error if the API gives an error', function() {
-      nock('https://access.active911.com')
-        .get('/interface/open_api/api/')
-        .replyWithFile(400, __dirname + 'replies/error.json');
-      a911.getAgency().then(function(err, agency) {
-        should.fail();
-      }).catch(function(err) {
-        err.should.equal(testErrorResponse.message);
-      });
+      nockError('/');
+      return client.getAgency().should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getDevice', function() {
+    it('Should return correct data', function() {
+      nockPath('/devices/1', deviceResponse);
+      return client.getDevice(1).should.eventually.deep.equal(deviceResponse.message.device);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/devices/1');
+      return client.getDevice(1).should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getAlerts', function() {
+    it('Should return correct data', function() {
+      nockPath('/alerts', alertsResponse);
+      return client.getAlerts().should.eventually.deep.equal(alertsResponse.message.alerts);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/alerts');
+      return client.getAlerts().should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getDeviceAlerts', function() {
+    it('Should return correct data', function() {
+      nockPath('/devices/1/alerts', alertsResponse);
+      return client.getDeviceAlerts(1).should.eventually.deep.equal(alertsResponse.message.alerts);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/devices/1/alerts');
+      return client.getDeviceAlerts(1).should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getAlert', function() {
+    it('Should return correct data', function() {
+      nockPath('/alerts/1', alertResponse);
+      return client.getAlert(1).should.eventually.deep.equal(alertResponse.message.alert);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/alerts/1');
+      return client.getAlert(1).should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getLocations', function() {
+    it('Should return correct data', function() {
+      nockPath('/locations', locationsResponse);
+      return client.getLocations().should.eventually.deep.equal(locationsResponse.message.locations);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/locations');
+      return client.getLocations().should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getLocation', function() {
+    it('Should return correct data', function() {
+      nockPath('/locations/1', locationResponse);
+      return client.getLocation(1).should.eventually.deep.equal(locationResponse.message.location);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/locations/1');
+      return client.getLocation(1).should.be.rejectedWith(errorResponse.message);
+    });
+  });
+
+  describe('#getResource', function() {
+    it('Should return correct data', function() {
+      nockPath('/resources/1', resourceResponse);
+      return client.getResource(1).should.eventually.deep.equal(resourceResponse.message.resource);
+    });
+
+    it('Should give an error if the API gives an error', function() {
+      nockError('/resources/1');
+      return client.getResource(1).should.be.rejectedWith(errorResponse.message);
     });
   });
 });
diff --git a/tests/replies/alert.json b/tests/replies/alert.json
new file mode 100644
index 0000000..f069ae9
--- /dev/null
+++ b/tests/replies/alert.json
@@ -0,0 +1,45 @@
+{
+  "result": "success",
+  "message": {
+    "alert": {
+      "id": "1",
+      "agency": {
+        "id": "1",
+        "uri": "https://access.active911.com/interface/open_api/api/"
+      },
+      "place": "My Place",
+      "address": "123 Main Street",
+      "unit": "",
+      "city": "Allentown",
+      "state": "PA",
+      "latitude": 40,
+      "longitude": -70,
+      "source": "Source",
+      "units": "My Units",
+      "cad_code": "29A1",
+      "priority": "Priority 3",
+      "details": "Medical emergency",
+      "sent": "timestamp",
+      "description": "My description",
+      "pagegroups": [
+        {
+          "title": "Group 1",
+          "prefix": "My Prefix"
+        }
+      ],
+      "map_code": "None",
+      "received": "Received",
+      "cross_street": "Cross Street",
+      "responses": [
+        {
+          "device": {
+            "id": "1",
+            "uri": "https://access.active911.com/interface/open_api/api/devices/1"
+          },
+          "timestamp": "123",
+          "response": "Responding"
+        }
+      ]
+    }
+  }
+}
diff --git a/tests/replies/alerts.json b/tests/replies/alerts.json
new file mode 100644
index 0000000..0fa10e5
--- /dev/null
+++ b/tests/replies/alerts.json
@@ -0,0 +1,15 @@
+{
+  "result": "success",
+  "message": {
+    "alerts": [
+      {
+        "id": 1,
+        "uri": "https://access.active911.com/interface/open_api/api/alerts/1"
+      },
+      {
+        "id": 2,
+        "uri": "https://access.active911.com/interface/open_api/api/alerts/2"
+      }
+    ]
+  }
+}
diff --git a/tests/replies/location.json b/tests/replies/location.json
new file mode 100644
index 0000000..114307e
--- /dev/null
+++ b/tests/replies/location.json
@@ -0,0 +1,22 @@
+{
+  "result": "success",
+  "message": {
+    "location": {
+      "id": "1",
+      "name": "My Resource",
+      "description": "My Description",
+      "icon_id": "1",
+      "icon_color": "blue",
+      "latitude": 40,
+      "longitude": -70,
+      "location_type": "Hydrant",
+      "resources": [
+        {
+          "id": "1",
+          "uri": "https://access.active911.com/interface/open_api/api/resources/1"
+        }
+      ]
+    }
+  }
+}
+
diff --git a/tests/replies/locations.json b/tests/replies/locations.json
new file mode 100644
index 0000000..ec12c28
--- /dev/null
+++ b/tests/replies/locations.json
@@ -0,0 +1,11 @@
+{
+  "result": "success",
+  "message": {
+    "locations": [
+      {
+        "id": "1",
+        "uri": "https://access.active911.com/interface/open_api/api/locations/1"
+      }
+    ]
+  }
+}
diff --git a/tests/replies/resource.json b/tests/replies/resource.json
new file mode 100644
index 0000000..19762db
--- /dev/null
+++ b/tests/replies/resource.json
@@ -0,0 +1,22 @@
+{
+  "result": "success",
+  "message": {
+    "resource": {
+      "id": "1",
+      "title": "My Resource",
+      "filename": "resource.pdf",
+      "extension": "pdf",
+      "size": 0,
+      "details": "My resource details",
+      "agency": {
+        "id": "1",
+        "uri": "https://access.active911.com/interface/open_api/api/"
+      },
+      "location": {
+        "id": "1",
+        "uri": "https://access.active911.com/interface/open_api/api/locations/1"
+      }
+    }
+  }
+}
+
-- 
cgit v1.2.3