UNPKG

api-bdd-test

Version:

use the bdd(cucumber) to test the RESTfull API

269 lines (244 loc) 9.39 kB
isObject = require 'util-ex/lib/is/type/object' isString = require 'util-ex/lib/is/type/string' path = require 'path.js/lib/posix' cson = require '../../cson-string' toQuery = require '../../to-query' module.exports = (aDictionary)-> # `this` is the library. #console.log # 新建资源:ResName # a:1,b:2 resNameRegEx = '[::]?[((‘\'“" ]$identifier(?:[)),,.。’”"\' ]|$)' resResultRegEx = '[的其]?(?:内容|结果)[为是]?[::]?$object' res4DataRegEx = resNameRegEx + '[,,.。]?\\s*'+ resResultRegEx this.define new RegExp('列[出举]资源\\s*'+resNameRegEx), (resource)-> testScope = this.ctx resource ?= this.resource this.api.get resource .then (res)=> testScope.result = res return .catch (err)=> testScope.result = err return err this.define new RegExp('[搜查][索询找]资源\\s*'+resNameRegEx+'[,,.。]?\\s*按?(?:指定|如下)?(?:条件|设置)[::]?$object'), (resource, filter)-> testScope = this.ctx resource ?= this.resource result = this.api.get resource result = result.query toQuery filter if filter result.then (res)=> testScope.result = res return .catch (err)=> testScope.result = err return err this.define new RegExp('[新创]建资源\\s*'+res4DataRegEx), (resource, data)-> testScope = this.ctx resource ?= this.resource this.api.post resource, data:data .then (res)=> testScope.result = res .catch (err)=> testScope.result = err return err this.define new RegExp('[新创]建资源\\s*'+resNameRegEx+'成功[,,.。]?\\s*'+ resResultRegEx), (resource, data)-> testScope = this.ctx resource ?= this.resource this.api.post resource, data:data .then (res)=> testScope.result = res return if res.status is 200 or res.status is 201 console.log res expect(res.status).to.be.equal 200 .catch (err)=> testScope.result = err console.log err expect(err).to.be.null return err this.define new RegExp('[编修][辑改](?:id|ID|编号)[为是::]?$string的?资源\\s*'+res4DataRegEx), (id, resource, data)-> testScope = this.ctx resource ?= this.resource id = path.join(resource, encodeURIComponent id) if resource this.api.put id, data:data .then (res)=> testScope.result = res .catch (err)=> testScope.result = err return err this.define new RegExp('删[除掉](?:id|ID|编号)[为是::]?$string的?资源\\s*'+ resNameRegEx), (id, resource)-> testScope = this.ctx resource ?= this.resource id = path.join(resource, encodeURIComponent id) if resource this.api.delete id .then (res)=> testScope.result = res .catch (err)=> testScope.result = err return err this.define new RegExp('检[查测]是否存在资源\\s*'+resNameRegEx + '\\s*[::]?$string'), (resource, id)-> testScope = this.ctx resource ?= this.resource id = path.join(resource, encodeURIComponent id) if resource this.api.head id .then (res)=> testScope.result = res return .catch (err)=> testScope.result = err return err this.define /上次[的]?(?:状态[码]?|status)[为是][::]?\s*$identifier/, (data)-> testScope = this.ctx data = '200' if data is 'ok' console.log(testScope.result) if testScope.result.status+'' isnt data expect(testScope.result.status+'').to.be.equal data return # this.define /上次[的]?(?:状态[码]?|status)匹配[::]?$object/, (data)-> # testScope = this.ctx # result = matchPattern testScope.result.status, data # if result # console.log(testScope.result) # throw result # return # this.define /上次[的]?(?:结果|body)匹配[::]?$match/, (pattern)-> # testScope = this.ctx # result = matchPattern testScope.result.body, pattern # if result # console.log(testScope.result) # console.log pattern, testScope.result.body # throw new Error result # return this.define /上次[的]?(?:结果|body)([为是]|包[括含]?)[::]?\s*$object/, (isInclude, data)-> testScope = this.ctx if isInclude[0] is '包' expect(testScope.result.body).to.be.containSubset data else expect(testScope.result.body).to.be.deep.equal data # 希望获得id为"id"的资源:bottle,其结果(包含)为 this.define new RegExp('[获取拿得][取得到](?:id|ID|编号)[为是::]?$string的?资源\\s*'+resNameRegEx + '[,,.。]?\\s*[的其]?(?:内容|结果)(包[含括]|[为是等]同?于?)[::]?$object'), (id, resource, aInclude, data)-> resource ?= this.resource id = path.join(resource, encodeURIComponent id) if resource aInclude = aInclude[0] is '包' this.api.get id .then (res)=> if aInclude expect(res.body).to.be.containSubset data else expect(res.body).to.be.deep.equal data return # .catch (err)=> # console.log 'err',err # expect(err).to.be.include data # return err # 获得id为"id",过滤条件为"xxx"的资源:bottle this.define new RegExp('[获取拿得][取得到](?:id|ID|编号)[为是::]?$string[,,]?\\s*过?滤?条件[为是::]?$string的?资源\\s*'+resNameRegEx), (id, filter, resource)-> testScope = this.ctx resource ?= this.resource # return filter = JSON.stringify cson filter if isString(filter) and filter.length id = path.join(resource, encodeURIComponent id) if resource result = this.api.get id result.query filter: filter if filter result .then (res)=> testScope.result = res return .catch (err)=> testScope.result = err return err this.define new RegExp('([不]?会?存在|没有?|有)(?:id|ID|编号)[为是::]?$string的?资源\\s*'+resNameRegEx), (isExists, id, resource)-> isExists = isExists[0] isnt '不' and isExists[0] isnt '没' resource ?= this.resource id = path.join(resource, encodeURIComponent id) if resource this.api.head id .then (res)=> if res.status is 204 or res.status is 200 expect(isExists).to.be.true else if res.status is 404 expect(isExists).to.be.false else throw new Error 'Call isExists API Error:' + status return this.define /登[录陆]\s*用户[::]\s*$string\s*[,,]\s*密码[::]\s*$string/, (username, password)-> testScope = this.ctx this.api.login username: username password: password .then (res)=> testScope.result = res return .catch (err)=> testScope.result = err return err this.define /注销用户|退出系统/, -> testScope = this.ctx this.api.logout() .then (res)=> testScope.result = res return .catch (err)=> testScope.result = err return err # 记住`result.body[0].id`到"myvar" this.define /(?:记[住下忆]?|保[存留])$string到[::]?$string/, (aKey, aToVar)-> this.ctx[aToVar] = aKey return # 记住结果的"body.id""myvar" this.define /(?:记[住下忆]?|保[存留])结果的$string(?:属性)?到[::]?$string/, (aKey, aToVar)-> vResult = this.ctx.result if isString(aKey) and aKey.length and vResult? aKey = aKey.split '.' for k in aKey vResult = vResult[k] if vResult? this.ctx[aToVar] = vResult return # 记住结果到"myvar" this.define /(?:记[住下忆]?|保[存留])结果到[::]?$string/, (aToVar)-> this.ctx[aToVar] = this.ctx.result return # 期望保留的"mvar"等于xxx this.define /(?:记[住下忆]?|保[存留])的\s*$string\s*(不)?((?:大于|小于)等于|至[少多]|等于|是|包[含括](?:key)?|[><!]=|[<=>])\s*(.+)$/, (aKey, aNot, aOp, aValue)-> aValue = cson aValue myExpect = expect(aKey).to.be myExpect = myExpect.not if aNot? switch aOp when '大于等于', '>=', '至少' myExpect.least aValue when '小于等于', '<=', '至多' myExpect.most aValue when '大于', '>' myExpect.above aValue when '小于', '<' myExpect.below aValue when '等于', '=', '是' myExpect.equal aValue else if aOp.slice(aOp.length-3) is 'key' myExpect.include.keys aValue else myExpect.containSubset aValue return this.define /(?:记[住下忆]?|保[存留])的\s*$string\s*(不)?((?:大于|小于)等于|至[少多]|等于|是|包[含括](?:key)?|[><!]=|[<=>])[::]$object/, (aKey, aNot, aOp, aValue)-> myExpect = expect(aKey).to.be myExpect = myExpect.not if aNot? switch aOp when '大于等于', '>=', '至少' myExpect.least aValue when '小于等于', '<=', '至多' myExpect.great aValue when '大于', '>' myExpect.above aValue when '小于', '<' myExpect.below aValue when '等于', '=', '是' myExpect.equal aValue else if aOp.slice(aOp.length-3) is 'key' myExpect.include.keys aValue else myExpect.containSubset aValue return this.define /(不?存在)(?:记[住下忆]?|保[存留]的)?\s*$string$/, (aExists, aKey)-> if aExists[0] isnt '不' expect(this.ctx[aKey]).to.be.exist else expect(this.ctx[aKey]).not.to.be.exist