UNPKG

mojio-js-sdk

Version:

Mojio javascript REST client.

332 lines (310 loc) 14.8 kB
MojioSDK = require '../../src/nodejs/sdk/MojioSDK' MojioRestSDK = require '../../src/nodejs/sdk/MojioRestSDK' should = require('should') async = require('async') nock = require 'nock' describe 'Node Mojio Fluent Rest SDK POST calls', -> user = null mojio = null vehicle = null client_id = 'cacc0d94-b6b4-4da7-9983-3991de197038' client_secret = '427d5794-5021-4274-a6e8-a38d5d83bf99' call = null timeout = 50 callback_url = "http://localhost:3000/callback" authorization = { client_id: client_id, client_secret: client_secret redirect_uri: 'http://localhost:3000/callback' username: 'testing' password: 'Test123!' scope: 'full' grant_type: 'password' } options = { sdk: MojioRestSDK, environment: 'staging' accountsURL: 'accounts.moj.io' apiURL: 'api.moj.io' pushURL: 'push.moj.io' client_id: authorization.client_id, client_secret: authorization.client_secret, # styles: [MojioPromiseStyle] } if options.environment != '' testAccountsURL = 'https://'+options.environment+'-'+options.accountsURL testApiURL = 'https://'+options.environment+'-'+options.apiURL else testAccountsURL = 'https://'+options.accountsURL testApiURL = 'https://'+options.apiURL beforeEach () -> user = null mojio = null vehicle = null sdk = new MojioSDK(options) it 'can POST and PUT entities and get a resource or secondary resource by ids or lists', (done) -> setupTokenNock = () -> if (process.env.FUNCTIONAL_TESTS=='true') timeout = 3000 return {done: () ->} else call = nock(testAccountsURL) .post("/oauth2/token", authorization) .reply((uri, requestBody, cb) -> cb(null, [200, { id: 4, access_token:"token"}]) return ) return call setupAuthorizeNock = () -> if (process.env.FUNCTIONAL_TESTS=='true') timeout = 3000 return {done: () ->} else call = nock(testAccountsURL) .post("/oauth2/token", authorization) .reply((uri, requestBody, cb) -> cb(null, [200, { id: 2, access_token:"token"}]) return ) return call setupNock = (api, verb, version, primary_, pid_, secondary_, sid_, _tertiary, tid_) -> if (process.env.FUNCTIONAL_TESTS=='true') timeout = 3000 return {done: () ->} else test = { pid: pid_ sid: sid_ tid: tid_ secondary: secondary_ primary: primary_ tertiary: _tertiary } pathFilter = (path) -> parts = path.split('/') idRegex = /\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b/ parts = parts[1...parts.length] versionValid = parts[0] is version parts = parts[1...parts.length] if parts.length == 1 # # /primary valid = parts[0] is test.primary else if parts.length == 2 # /primary/[id] valid = parts[0] is test.primary and (parts[1].match(idRegex) or parts[1] == ""+test.pid) else if parts.length == 3 # /primary/[id]/secondary valid = parts[0] is test.primary and (parts[1].match(idRegex) or parts[1] == ""+test.pid) and parts[2] is test.secondary else if parts.length == 4 and test.sid? # /primary/[pid]/secondary/[sid] valid = (parts[0] is test.primary and (parts[1].match(idRegex) or parts[1] == ""+test.pid) and parts[2] is test.secondary and (parts[3].match(idRegex) or parts[3] is ""+test.sid)) else if parts.length == 4 and !test.sid? # /primary/[pid]/secondary/tertiary valid = (parts[0] is test.primary and (parts[1].match(idRegex) or parts[1] == ""+test.pid) and parts[2] is test.secondary and parts[3] is test.tertiary) else if parts.length == 5 # /primary/[id]/secondary/[id]/tertiary valid = (parts[0] is test.primary and (parts[1].match(idRegex) or parts[1] == ""+test.pid) and parts[2] is test.secondary and (parts[3].match(idRegex) or parts[3] == ""+test.sid) and parts[4] is test.tertiary) else if parts.length == 6 # /primary/[id]/secondary/[id]/tertiary/id valid = (parts[0] is test.primary and (parts[1].match(idRegex) or parts[1] == ""+test.pid) and parts[2] is test.secondary and (parts[3].match(idRegex) or parts[3] == ""+test.sid) and parts[4] is test.tertiary and (parts[5].match(idRegex) or parts[5] == ""+test.tid)) if valid and versionValid return '/true' else return '/false' nock.removeInterceptor({hostname:api}) call = nock(api).filteringPath(pathFilter)[verb]('/true') .reply((uri, requestBody, cb) -> cb(null, [200, { id: 3, message: "hi"}]) return ) return call testErrorResult = (error, result) -> console.log("ERROR: "+error.statusMessage+" content:"+error.content) if error? (error==null).should.be.true (result!=null).should.be.true execute = (test, doneOne) -> async.series([ # todo encrypted password (cb) -> setupAuthorizeNock() sdk .token(authorization.redirect_uri) .credentials(authorization.username, authorization.password) .scope(['full']) .callback((error, result) -> if (error) console.log('Access Token Error'+" url:"+sdk.url()) cb(error, result) else setupTokenNock() sdk.token().parse(result).callback((error, result) -> token = result cb(error, result) ) ) # , # (cb) -> # console.log("mock the user") # sdk.mock().user({}).callback( # (error, result) -> user = result; cb(error, result)) # , # (cb) -> # console.log("mock the mojio") # # sdk.mojio({UserId: user.id, Imei: "9991234567891234"}) # .mock().callback((error, result) -> mojio = result; cb(error, result)) # , # (cb) -> # console.log("mock the vehicle") # sdk.mock().vehicle({MojioId: mojio.id, UserId: user.id, Speed: 80}).callback( # ((error, result) -> vehicle = result; cb(error, result))) , (cb) -> test(cb) # execute a test. ] , # callback when the series is done or in error. (error, results) -> console.log(error) if error? (error==null).should.be.true # todo:: test results for correctness. (results!=null).should.be.true # test results content to be the observed entitiy doneOne() return ) setupPostPutNock = (api, verb, version, primary_, pid_, secondary_, data_) -> if (process.env.FUNCTIONAL_TESTS=='true') timeout = 3000 return {done: () ->} else check = { pid: pid_ data: data_ secondary: secondary_ primary: primary_ } call = nock(api).filteringPath((path) -> parts = path.split('/') idRegex = /\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b/ parts = parts[1...parts.length] versionValid = parts[0] is version parts = parts[1...parts.length] if parts.length == 1 # /primary & [data] valid = parts[0] is check.primary else if parts.length == 3 # /primary/[id]/secondary & [data] valid = parts[0] is check.primary and (parts[1].match(idRegex) or parts[1] == ""+check.pid) and parts[2] is check.secondary if valid and versionValid return '/true' #'/'+check.primary+'/'+check.pid+'/'+check.secondary else return '/false' )[verb]('/true', check.data) #'/'+check.primary+'/'+check.pid+'/'+check.secondary, check.data) .reply((uri, requestBody, cb) -> cb(null, [200, { id: 1, name: "name"}])) return null # @.timeout(5000) docall = (verb, entity, pid=null, secondary=null, data = null) -> if entity == 'Trips' and secondary == 'Permissions' and verb == 'put' finish = done else finish = (() ->) execute( (cb) -> if (secondary?) call = setupPostPutNock(testApiURL, verb, 'v2', entity, pid, secondary, data) sdk[verb]()[entity](pid)[secondary](data).callback((error, result) -> testErrorResult(error, result) cb(null, result) ) else call = setupPostPutNock(testApiURL, verb, 'v2', entity, null, null, data) sdk[verb]()[entity](data).callback((error, result) -> testErrorResult(error, result) cb(null, result) ) , finish ) entities = ['Mojios', 'Vehicles', 'Users', 'Apps', 'Groups', 'Trips'] secondaries = ['Tags', 'Permissions', 'Images', 'Details'] for entity in entities docall('post',entity, null, null, {name: 'name'+entity}) docall('put',entity, null, null, {name: 'name'+entity}) for secondaryEntity in secondaries docall('post',entity,1,secondaryEntity, {name: 'name/'+entity+'/1/'+secondaryEntity}) docall('put',entity,1,secondaryEntity, {name: 'name/'+entity+'/1/'+secondaryEntity}) # it 'can create share and revoke a vehicle', (done) -> # @.timeout(5000) # execute( # (cb) -> # sdk.share().vehicle(vehicle).with(user).access("write").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # sdk.revoke().vehicle(vehicle).from(user).callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # , done # ) # it 'can create share and revoke a list of vehicles', (done) -> # @.timeout(5000) # execute( # (cb) -> # sdk.share().vehicles([vehicle]).with(user).access("read").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # sdk.revoke().vehicles([vehicle]).from(user).access("read").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # , done # ) # it "can create share and revoke a vehicle's fields", (done) -> # @.timeout(5000) # execute( # (cb) -> # sdk.share().vehicle(vehicle).fields(['location', 'speed']).with(user).access("read").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # sdk.revoke().vehicle(vehicle).from(user).access("read").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # , done # ) # it 'can create group add/remove users', (done) -> # @.timeout(5000) # execute( # (cb) -> # sdk.create().group({name: "blah"}).with([user]).callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # (error, result) -> # group = result # ) # # sdk.group("blah").add(user).callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # sdk.add(user).into().group("blah").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # sdk.remove(user).outof().group("blah").callback((error, result) -> # testErrorResult(error, result) # # todo: test validity of vehicle # cb(null, result) # ) # sdk.create().mojio({imei: "123981392131"}) # attach to current user. # , done # )