index.test.ts 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. // 校验各种设置config ,入参是否正确
  2. import tcb from '../../src/index'
  3. import assert from 'assert'
  4. import config from '../config.local'
  5. import url from 'url'
  6. beforeEach(async () => {
  7. jest.resetModules()
  8. jest.resetAllMocks()
  9. })
  10. afterEach(async () => {
  11. jest.resetModules()
  12. jest.resetAllMocks()
  13. })
  14. // TODO 删除前先创建
  15. describe('校验config设置 请求入参', () => {
  16. const app = tcb.init(config)
  17. it('config retries', async () => {
  18. const tcb = require('../../src/index')
  19. const app = tcb.init({
  20. ...config,
  21. retries: 3
  22. })
  23. const res = await app.callFunction({
  24. name: 'test',
  25. data: {}
  26. })
  27. assert.ok(res.result === 'hello')
  28. })
  29. it('config forever', async () => {
  30. const tcb = require('../../src/index')
  31. const app = tcb.init({
  32. ...config,
  33. forever: true
  34. })
  35. const res = await app.callFunction({
  36. name: 'test',
  37. data: {}
  38. })
  39. assert.ok(res.result === 'hello')
  40. })
  41. it('request retryOptions', async () => {
  42. const tcb = require('../../src/index')
  43. const app = tcb.init({
  44. ...config
  45. })
  46. const res = await app.callFunction(
  47. {
  48. name: 'test',
  49. data: {}
  50. },
  51. {
  52. retryOptions: {
  53. retries: 3
  54. }
  55. }
  56. )
  57. assert.ok(res.result === 'hello')
  58. })
  59. it('微信openapi', async () => {
  60. try {
  61. let result = await app.callWxOpenApi({
  62. apiName: '/inner/svrkitclientcall',
  63. requestData: { name: 'jamespeng' }
  64. })
  65. } catch (e) {
  66. assert(e.code === 'INVALID_PARAM')
  67. }
  68. }, 30000)
  69. it('微信new openapi', async () => {
  70. try {
  71. let result = await app.callCompatibleWxOpenApi({
  72. apiName: '/AAA/BBB/sample',
  73. requestData: Buffer.from(JSON.stringify({ name: 'jamespeng' }))
  74. })
  75. } catch (e) {
  76. assert(e.code === 'INVALID_PARAM')
  77. }
  78. // assert(result.result, '微信openapi失败');
  79. }, 30000)
  80. it('校验config.isHttp => protocol', async () => {
  81. jest.mock('../../src/utils/request', () => {
  82. return {
  83. extraRequest: jest.fn().mockImplementation(opts => {
  84. return Promise.resolve({
  85. statusCode: 200,
  86. body: {
  87. data: { response_data: opts },
  88. requestId: 'testRequestId'
  89. }
  90. })
  91. })
  92. }
  93. })
  94. const tcb = require('../../src/index')
  95. let app = null
  96. let mockReqRes = null
  97. app = tcb.init({
  98. ...config,
  99. isHttp: true
  100. })
  101. // mock一次http请求
  102. mockReqRes = await app.callFunction({
  103. name: 'unexistFunction',
  104. data: { a: 1 }
  105. })
  106. assert(mockReqRes.result.url.indexOf('https') < 0)
  107. app = tcb.init({
  108. ...config,
  109. isHttp: false
  110. })
  111. // mock一次https请求
  112. mockReqRes = await app.callFunction({
  113. name: 'unexistFunction',
  114. data: { a: 1 }
  115. })
  116. assert(mockReqRes.result.url.indexOf('https') >= 0)
  117. })
  118. it('校验 parseContext 后 url', async () => {
  119. jest.mock('../../src/utils/request', () => {
  120. return {
  121. extraRequest: jest.fn().mockImplementation(opts => {
  122. return Promise.resolve({
  123. statusCode: 200,
  124. body: {
  125. data: { response_data: opts },
  126. requestId: 'testRequestId'
  127. }
  128. })
  129. })
  130. }
  131. })
  132. const mockContext = {
  133. memory_limit_in_mb: 256,
  134. time_limit_in_ms: 3000,
  135. request_id: '3169444b-25f4-11ea-81e5-525400235f2a',
  136. environ:
  137. 'WX_CLIENTIP=10.12.23.71;WX_CLIENTIPV6=::ffff:10.12.23.71;WX_APPID=wx5ceb4e4809aa1d28;WX_OPENID=oaEk445grItIBpFcJ3eRBCb6yx8g;WX_API_TOKEN=eyJWZXJzaW9uIjoxLCJLZXlWZXJzaW9uIjo4MSwiZXZlbnRJZCI6IkhFeXJYb0hrQjVDLW1OWk1JWkx3N29hNHNoZU9uMEtfNlhuM1FEb2Y0NFV6LVRJRWtyNkZSbUZ3SDhQLWNiS1dETWtyTTZ2Qm1MNXRodjR4SGgycDhXLU1sUzY1Q19uc2FiWmVaTUFpN3c4SktRIiwidGlja2V0IjoiQ0VVU2dBUSsxUzlqWnRHa0ZGenQwTmp4VENCWkM3dHp5M3Vxa252b1pqanFleUY0WEJ1WG1VMElQUGFQZElDYUlkOWxYZGZ5YUxSN3MxR3F3a3NKSEdLb3c2K1FRVGF4cWhZYlJYT3doRWVWYXEya3VGVUxmQWt4TlpKUlFvd2lBNUJsbm8zRDlaOFNZandtRUFtRG1ITitBN3lFRG40Y2NhcHh1OFdjV3N6Tjc3Rkt0WmE2czhadmNTNW9zTmlXcXU5dWRDeEszb05jM3ZuNFdtS2VOcVRqN1BWcWZJUWhMWmhKNmFxbDIvSGdONXhCRkdFaUI1RmtYVEdJUnc0TmxzYTlMUmZ5enp1dDZSazRrVTBUZ3RrOFV3S1dyS1ZKbktoSFg3WEJTSXN1SlF1VDdUL0tzL0JuS1BsM3FNZVdmeGlrKzY1K3VpSTZZb1VyMm9NUlExek11NzVKWVNDaGFGRmxYZWZFeDVBelY1TWF4QUczVHRSL2JhNGhocDZUUjE5ZlNlcVRGTUJjNUh4NXBlUzVWbkVGYWRDdTRZZS9rT0RxZW5xZCtxbnlvYjZNbXFLa0F3VkdXVzRYZ2VVNkZXSnM5Mzl5OFpGRTU1dWpVT0lNWmVDZ1VvNi9Bb201VHFxSXJvK25rK2hCUGh0L1lJVTZMU25INkVVWWtZVXhHZzJKOTBaTDFKZThFN0ZYZzFSQjFyenJGS2NsZEJndVVLWDFxVlBtWExRNndhdWpOcHpneDBNaGZvVENrenhVaWJEdWRqMlAyeG9tNlQ5L3VaM0FON1ZNeEJwckVKTzVQMDZndDV0SElCOXRxK1NPM01pVjluQk03UCtRendhVEJ6eUx6OThGUzBwSVhTdHYyYU9YMzhiZE1FVkpkQkkrUTJ1NW0xWmNENW9kODQ3UnlBPT0ifQ==;WX_CONTEXT_KEYS=WX_CLIENTIP,WX_CLIENTIPV6,WX_APPID,WX_OPENID,WX_API_TOKEN;TCB_ENV=luke-87pns;TCB_SEQID=1577153917182_0.13161529658114857_33555268;TRIGGER_SRC=tcb;TCB_SESSIONTOKEN=pNNA4UPZHja3ngOjkBJbPFCyNvL9twqf0931632f99099b88fdc6ae3e119dc84dsO99eZ7w6rzsbeh4Zf7bDQDns1glEZ761vFBDajV1ijUp-Sj-l59rfLi_s1TdYiA82HjIJzbVKnKEHzuFLJlonOIYd_NFnkQJw4MB0L6vYLcmDYYMzEhrByAddagrSdoxux6vwHfJ4B0tzzajmcXqFKkowDZJn5ZZBX1I-Sta1nfoX73qTCqlUWPAAhkhECa81LSvZrFTfsvZyLOOAvevK_kP5qy2zeYKgQtb9IvHI1xmOSj0AaTIiuqOce5i4_kLu5_Z9Gqqxc1PS2oimkhWRqL79E-sW-fF3HpuGD01W832B2wn9W3vpaKi50lyN2gAyKW3Wf0ASA_vPVyZziR20fkmfmThrrBnLgGYd-FPAk;TCB_SOURCE=wx_devtools;TCB_CONTEXT_KEYS=TCB_ENV,TCB_SEQID,TRIGGER_SRC,TCB_SESSIONTOKEN,TCB_SOURCE;TENCENTCLOUD_SECRETID=AKIDDtm4yzucNcl_lE7IixiQO5aTdd4eBnut0eOk6Br82dnMsx5hg2ZEzBWtxUcUWcjO;TENCENTCLOUD_SECRETKEY=cEh6rsAFJTIeue3REKZQUHdQTTVJKhZmOb1EPLLPhSA=;TENCENTCLOUD_SESSIONTOKEN=DnAZAXuXDmPY87R0UWZMQ4JTIr6SeqpU1eb1faab03564a897dd3fc31dcc3d348GxhExs-XtxXU-g6pm7sXBpGwkJzRcEyYQHnnB6AONAbRfbphlIm-BfGhdXY2RQeEj7UiOWKTw1_VliMk8HIhgNYRZx0Ue6KXiNUneMvX5SgOOOToOCM2-YJTh6oYj1NhoLaefxPRf8TQ72yLWTagRh0x9IaTtpp6jrJFR7lBA26JLgATRnGJRw-iO2HNMCDSSVVT_VnhO46JGGUdEjfBCzs-6uU0jTSlE_Q7EKOt9_4N3a6JfzCxsJQV8IebfZXcTcVqjefiIHZyNGv71-GUbpfHhhfy_EhPlRJsDnvCByiqsM3celEvf86LtIBI-m2Tbae-K069lu5wC3_PFxC_5hjvIiTpfiQW2wEKwlSuklQ;SCF_NAMESPACE=luke-87pns',
  138. function_version: '$LATEST',
  139. function_name: 'login',
  140. namespace: 'luke-87pns'
  141. }
  142. const tcb = require('../../src/index')
  143. tcb.parseContext(mockContext)
  144. const app = tcb.init(config)
  145. // mock一次http请求
  146. let mockReqRes = await app.callFunction({
  147. name: 'unexistFunction',
  148. data: { a: 1 }
  149. })
  150. let reqOpts = mockReqRes.result
  151. console.log('reqOpts.url:', reqOpts.url)
  152. // assert(reqOpts.url.indexOf('https') < 0)
  153. const myURL = url.parse(reqOpts.url, true)
  154. assert.ok(myURL.query.scfRequestId === '3169444b-25f4-11ea-81e5-525400235f2a')
  155. })
  156. it('校验传入url 带?', async () => {
  157. jest.mock('../../src/utils/request', () => {
  158. return {
  159. extraRequest: jest.fn().mockImplementation(opts => {
  160. return Promise.resolve({
  161. statusCode: 200,
  162. body: {
  163. data: { response_data: opts },
  164. requestId: 'testRequestId'
  165. }
  166. })
  167. })
  168. }
  169. })
  170. const tcb = require('../../src/index')
  171. let app = tcb.init({
  172. ...config,
  173. serviceUrl: 'http://testUrl.test.com?'
  174. })
  175. // mock一次http请求
  176. let mockReqRes = await app.callFunction({
  177. name: 'unexistFunction',
  178. data: { a: 1 }
  179. })
  180. let reqOpts = mockReqRes.result
  181. // console.log(reqOpts.url)
  182. const matchNum = reqOpts.url.match(/\?/g)
  183. // console.log(matchNum)
  184. assert(matchNum.length === 1)
  185. })
  186. it('校验config.version => x-sdk-version config.serviceUrl => url', async () => {
  187. config.version = 'test-version'
  188. config.serviceUrl = 'http://testUrl.test.com'
  189. jest.mock('../../src/utils/request', () => {
  190. return {
  191. extraRequest: jest.fn().mockImplementation(opts => {
  192. return Promise.resolve({
  193. statusCode: 200,
  194. body: {
  195. data: { response_data: opts },
  196. requestId: 'testRequestId'
  197. }
  198. })
  199. })
  200. }
  201. })
  202. const tcb = require('../../src/index')
  203. let app = tcb.init(config)
  204. // mock一次http请求
  205. let mockReqRes = await app.callFunction({
  206. name: 'unexistFunction',
  207. data: { a: 1 }
  208. })
  209. let reqOpts = mockReqRes.result
  210. assert(reqOpts.headers['X-SDK-Version'] === config.version)
  211. assert(reqOpts.url.indexOf('http://testUrl.test.com') === 0)
  212. })
  213. it('校验云函数or容器环境 请求url', async () => {
  214. process.env.TENCENTCLOUD_RUNENV = 'SCF'
  215. process.env.TENCENTCLOUD_REGION = 'ap-shanghai'
  216. process.env.KUBERNETES_SERVICE_HOST = 'KUBERNETES_SERVICE_HOST'
  217. jest.mock('../../src/utils/request', () => {
  218. return {
  219. extraRequest: jest.fn().mockImplementation(opts => {
  220. return Promise.resolve({
  221. statusCode: 200,
  222. body: {
  223. data: { response_data: opts },
  224. requestId: 'testRequestId'
  225. }
  226. })
  227. })
  228. }
  229. })
  230. const tcb = require('../../src/index')
  231. const config = require('../../test/config.local')
  232. let app = tcb.init(config)
  233. // mock一次http请求
  234. let mockReqRes = await app.callFunction({
  235. name: 'unexistFunction',
  236. data: { a: 1 }
  237. })
  238. let reqOpts = mockReqRes.result
  239. assert(reqOpts.url.indexOf('internal') >= 0)
  240. process.env.TENCENTCLOUD_RUNENV = ''
  241. process.env.TENCENTCLOUD_REGION = ''
  242. process.env.KUBERNETES_SERVICE_HOST = ''
  243. })
  244. it('校验config.serviceUrl => url', async () => {
  245. config.serviceUrl = 'http://testUrl.com'
  246. jest.mock('../../src/utils/request', () => {
  247. return {
  248. extraRequest: jest.fn().mockImplementation(opts => {
  249. return Promise.resolve({
  250. statusCode: 200,
  251. body: {
  252. data: { response_data: opts },
  253. requestId: 'testRequestId'
  254. }
  255. })
  256. })
  257. }
  258. })
  259. const tcb = require('../../src/index')
  260. let app = tcb.init(config)
  261. // mock一次http请求
  262. let mockReqRes = await app.callFunction({
  263. name: 'unexistFunction',
  264. data: { a: 1 }
  265. })
  266. let reqOpts = mockReqRes.result
  267. assert(reqOpts.url.indexOf('testUrl') >= 0)
  268. })
  269. // mock callWxOpenApi 回包为string
  270. it('微信openapi mock回包为string', async () => {
  271. jest.resetModules()
  272. jest.mock('request', () => {
  273. return {
  274. extraRequest: jest.fn().mockImplementation(params => {
  275. return Promise.resolve({
  276. statusCode: 200,
  277. body: {
  278. data: { response_data: 'test' },
  279. requestId: 'testRequestId'
  280. }
  281. })
  282. })
  283. }
  284. })
  285. const tcb1 = require('../../src/index')
  286. const app1 = tcb1.init(config)
  287. try {
  288. let result = await app1.callWxOpenApi({
  289. apiName: '/inner/svrkitclientcall',
  290. requestData: { name: 'jamespeng' }
  291. })
  292. // assert(typeof result.result === 'string')
  293. } catch (err) {
  294. // assert(err.code === 'STORAGE_REQUEST_FAIL')
  295. console.log(err)
  296. }
  297. })
  298. })