From 2e6fe467d2366b5826db1f251d7e4e2126f0ee3a Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Tue, 16 Aug 2016 21:24:38 -0700 Subject: [PATCH] Added mock documentdb for when env vars aren't available in tests. --- mocha.start.js | 59 ++++++++++++++++++++++----- src/index.js | 4 +- test/documentdbMock.js | 91 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 13 deletions(-) create mode 100644 test/documentdbMock.js diff --git a/mocha.start.js b/mocha.start.js index 77f1bc7..d957cc1 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -11,25 +11,62 @@ import * as JSDataDocumentDB from './src/index' const assert = global.assert = JSDataAdapterTests.assert global.sinon = JSDataAdapterTests.sinon -JSDataAdapterTests.init({ +import { mockClient } from './test/documentdbMock' + +const adapterConfig = { + documentOpts: { + db: 'test', + urlConnection: process.env.DOCUMENT_DB_ENDPOINT, + auth: { + masterKey: process.env.DOCUMENT_DB_KEY + } + } +} + +let usingMock = false + +if (!process.env.DOCUMENT_DB_ENDPOINT && !process.env.DOCUMENT_DB_KEY) { + console.log('DOCUMENT_DB_ENDPOINT and DOCUMENT_DB_KEY environment variables are missing, falling back to mock documentdb.') + console.log('Not all methods can be tested') + adapterConfig.client = mockClient + usingMock = true +} + +beforeEach(function () { + if (usingMock) { + mockClient.reset() + } +}) + +const config = { debug: false, JSData: JSData, Adapter: JSDataDocumentDB.DocumentDBAdapter, - adapterConfig: { - documentOpts: { - db: 'test', - urlConnection: process.env.DOCUMENT_DB_ENDPOINT, - auth: { - masterKey: process.env.DOCUMENT_DB_KEY - } - } - }, + adapterConfig: adapterConfig, // js-data-documentdb does NOT support these features xfeatures: [ 'findAllLikeOp', 'filterOnRelations' ] -}) +} + +if (usingMock) { + config.features = [] + delete config.xfeatures + + config.xmethods = [ + 'count', + 'createMany', + 'destroy', + 'destroyAll', + 'find', + 'sum', + 'updateAll', + 'updateMany' + ] +} + +JSDataAdapterTests.init(config) describe('exports', function () { it('should have correct exports', function () { diff --git a/src/index.js b/src/index.js index e9bef98..a5a5f5a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,9 +1,9 @@ -import {utils} from 'js-data' +import { utils } from 'js-data' import { Adapter, reserved } from 'js-data-adapter' -import {DocumentClient} from 'documentdb' +import { DocumentClient } from 'documentdb' import underscore from 'mout/string/underscore' const REQUEST_OPTS_DEFAULTS = {} diff --git a/test/documentdbMock.js b/test/documentdbMock.js new file mode 100644 index 0000000..71bca4b --- /dev/null +++ b/test/documentdbMock.js @@ -0,0 +1,91 @@ +import { utils } from 'js-data' +const guid = require('mout/random/guid') + +function parseLink (link) { + const parts = link.split('/') + return { + dbId: parts[1], + collectionId: parts[3], + documentId: parts[5] + } +} + +let dbs = {} +let collections = {} +let documents = {} + +export const mockClient = { + reset: function () { + dbs = {} + collections = {} + documents = {} + }, + readDatabases: function () { + const dbsArray = Object.keys(dbs).map(function (dbLink) { + return dbs[dbLink] + }) + return { + toArray: function (callback) { + callback(null, dbsArray) + } + } + }, + createDatabase: function (options, callback) { + const dbLink = `dbs/${options.id}` + const db = dbs[dbLink] = utils.plainCopy(options) + collections[dbLink] = {} + callback(null, db) + }, + readCollections: function (dbLink) { + const collectionsArray = Object.keys(collections[dbLink]).map(function (collLink) { + return collections[collLink] + }) + return { + toArray: function (callback) { + callback(null, collectionsArray) + } + } + }, + createCollection: function (dbLink, options, callback) { + const collLink = `${dbLink}/colls/${options.id}` + const collection = collections[dbLink][collLink] = utils.plainCopy(options) + collections[collLink] = {} + callback(null, collection) + }, + createDocument: function (collLink, document, options, callback) { + const id = guid() + const docLink = `${collLink}/docs/${id}` + const created = utils.plainCopy(document) + created.id = id + collections[collLink][docLink] = created + documents[docLink] = created + callback(null, created) + }, + readDocument: function (docLink, options, callback) { + callback(null, documents[docLink]) + }, + replaceDocument: function (docLink, document, options, callback) { + const ids = parseLink(docLink) + collections[`dbs/${ids.dbId}/colls/${ids.collectionId}`][docLink] = document + documents[docLink] = document + callback(null, document) + }, + deleteDocument: function (docLink, options, callback) { + const ids = parseLink(docLink) + delete collections[`dbs/${ids.dbId}/colls/${ids.collectionId}`][docLink] + delete documents[docLink] + callback(null) + }, + queryDocuments: function (collLink, querySpec, options) { + const docLinks = Object.keys(collections[collLink]) + const documentsArray = docLinks.map(function (docLink) { + return documents[docLink] + }) + + return { + toArray: function (callback) { + callback(null, documentsArray) + } + } + } +}