Skip to content

Commit

Permalink
Added mock documentdb for when env vars aren't available in tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
jmdobry committed Aug 17, 2016
1 parent 478a24e commit 2e6fe46
Show file tree
Hide file tree
Showing 3 changed files with 141 additions and 13 deletions.
59 changes: 48 additions & 11 deletions mocha.start.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 () {
Expand Down
4 changes: 2 additions & 2 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -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 = {}
Expand Down
91 changes: 91 additions & 0 deletions test/documentdbMock.js
Original file line number Diff line number Diff line change
@@ -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)
}
}
}
}

0 comments on commit 2e6fe46

Please sign in to comment.