index.test.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import tcb from '../../src/index'
  2. import assert, { rejects } from 'assert'
  3. import config from '../config.local'
  4. import { SYMBOL_CURRENT_ENV } from '../../src/const/symbol'
  5. import { create } from 'domain'
  6. const app = tcb.init({
  7. ...config,
  8. credentials: {
  9. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  10. private_key:
  11. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n'
  12. }
  13. })
  14. describe('auth 不注入环境变量', () => {
  15. it('校验uid', async () => {
  16. let uid
  17. try {
  18. uid = 1
  19. app.auth().createTicket(uid)
  20. } catch (e) {
  21. assert(e.message === 'uid must be a string')
  22. }
  23. try {
  24. uid = '1'
  25. app.auth().createTicket(uid)
  26. } catch (e) {
  27. assert(e.message === `Invalid uid: "${uid}"`)
  28. }
  29. })
  30. })
  31. describe('auth 注入环境变量', () => {
  32. // it('生成登录ticket', async () => {
  33. // const result = app.auth().createTicket('oyeju0Eoc1ZCEgyxfk2vNeYDMpRs', {
  34. // refresh: 5000
  35. // })
  36. // assert(result)
  37. // }, 30000)
  38. // it('生成登录ticket 不传refresh', async () => {
  39. // const result = app.auth().createTicket('oyeju0Eoc1ZCEgyxfk2vNeYDMpRs')
  40. // assert(result)
  41. // }, 30000)
  42. it('不注入环境变量 默认取空字符串', async () => {
  43. process.env.WX_OPENID = ''
  44. process.env.WX_APPID = ''
  45. process.env.TCB_UUID = ''
  46. process.env.TCB_CUSTOM_USER_ID = ''
  47. process.env.TCB_SOURCE_IP = ''
  48. assert.deepStrictEqual(app.auth().getUserInfo(), {
  49. openId: '',
  50. appId: '',
  51. uid: '',
  52. customUserId: '',
  53. isAnonymous: false
  54. })
  55. assert.deepStrictEqual(app.auth().getClientIP(), '')
  56. assert.deepStrictEqual(app.auth().getEndUserInfo(), {
  57. userInfo: {
  58. openId: '',
  59. appId: '',
  60. uid: '',
  61. customUserId: '',
  62. isAnonymous: false
  63. }
  64. })
  65. })
  66. it('mock getEndUserInfo return code', async () => {
  67. jest.resetModules()
  68. jest.mock('request', () => {
  69. return jest.fn().mockImplementation((params, callback) => {
  70. const body = { code: 'mockCode', message: 'mockMessage' }
  71. process.nextTick(() => {
  72. callback(null, { req: { reusedSocket: false }, statusCode: 200, body })
  73. })
  74. })
  75. })
  76. const tcb1 = require('../../src/index')
  77. const app1 = tcb1.init({
  78. ...config,
  79. credentials: {
  80. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  81. private_key:
  82. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n'
  83. }
  84. })
  85. expect(app1.auth().getEndUserInfo('c7446481324445a0bca211d747281ca3')).rejects.toThrow(
  86. new Error('mockMessage')
  87. )
  88. const app2 = tcb1.init({
  89. ...config,
  90. credentials: {
  91. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  92. private_key:
  93. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n'
  94. },
  95. throwOnCode: false
  96. })
  97. const res = await app2.auth().getEndUserInfo('c7446481324445a0bca211d747281ca3')
  98. assert.ok(res.code === 'mockCode')
  99. })
  100. it.skip('mock auth.getUserInfoForAdmin 接口,不存在的用户按匿名返回', async () => {
  101. const uid = 'luke123invalid'
  102. const userInfo = await app.auth().getEndUserInfo(uid)
  103. expect(userInfo.userInfo.uid === uid)
  104. })
  105. it('获取用户信息getUserInfo 不传入uid', () => {
  106. process.env.WX_OPENID = 'WX_OPENID'
  107. process.env.WX_APPID = 'WX_APPID'
  108. process.env.TCB_UUID = 'TCB_UUID'
  109. process.env.TCB_CUSTOM_USER_ID = 'TCB_CUSTOM_USER_ID'
  110. process.env.TCB_ISANONYMOUS_USER = 'true'
  111. process.env.TCB_CONTEXT_KEYS = 'TCB_UUID,TCB_CUSTOM_USER_ID,TCB_ISANONYMOUS_USER'
  112. process.env.WX_CONTEXT_KEYS = 'WX_OPENID,WX_APPID'
  113. assert.deepStrictEqual(app.auth().getUserInfo(), {
  114. openId: 'WX_OPENID',
  115. appId: 'WX_APPID',
  116. uid: 'TCB_UUID',
  117. customUserId: 'TCB_CUSTOM_USER_ID',
  118. isAnonymous: true
  119. })
  120. })
  121. it('获取云开发用户信息 getEndUserInfo 传入uid', async () => {
  122. try {
  123. const { userInfo } = await app.auth().getEndUserInfo('c7446481324445a0bca211d747281ca3')
  124. const keysAreValid = [
  125. 'openId',
  126. 'appId',
  127. 'uid',
  128. 'customUserId',
  129. 'isAnonymous',
  130. 'envName',
  131. 'nickName',
  132. 'gender',
  133. 'country',
  134. 'province',
  135. 'city',
  136. 'avatarUrl',
  137. 'uuid',
  138. 'wxOpenid',
  139. 'wxOpenId',
  140. 'wxUnionId',
  141. 'wxPublicId',
  142. 'qqMiniOpenId',
  143. 'email',
  144. 'hasPassword',
  145. 'username',
  146. 'createTime',
  147. 'updateTime'
  148. ].every(key => userInfo.hasOwnProperty(key))
  149. assert.ok(keysAreValid)
  150. } catch (error) {
  151. assert.ok(error instanceof Error)
  152. }
  153. })
  154. it.skip('测试 queryUserInfo', async () => {
  155. const userInfo = await app.auth().queryUserInfo({
  156. platform: 'PHONE',
  157. platformId: '+8618202741638'
  158. })
  159. console.log('userInfo', userInfo)
  160. })
  161. it('获取客户端IP', async () => {
  162. process.env.TCB_SOURCE_IP = 'TCB_SOURCE_IP'
  163. process.env.TCB_CONTEXT_KEYS = 'TCB_SOURCE_IP'
  164. assert.deepStrictEqual(app.auth().getClientIP(), 'TCB_SOURCE_IP')
  165. })
  166. it('校验createTicket 时,init config 不含 env', async () => {
  167. const app1 = tcb.init({
  168. ...config,
  169. credentials: {
  170. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  171. private_key:
  172. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n'
  173. },
  174. env: ''
  175. })
  176. expect(() => {
  177. app1.auth().createTicket('luke123')
  178. }).toThrow(new Error('no env in config'))
  179. })
  180. it('校验createTicket时,init config 为 symbol_current_env', async () => {
  181. process.env.SCF_NAMESPACE = config.env
  182. const app1 = tcb.init({
  183. ...config,
  184. credentials: {
  185. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  186. private_key:
  187. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n',
  188. env_id: config.env
  189. },
  190. env: SYMBOL_CURRENT_ENV
  191. })
  192. const createTicketRes = app1.auth().createTicket('luke123')
  193. assert.ok(typeof createTicketRes === 'string')
  194. process.env.TCB_ENV = ''
  195. })
  196. it('校验credentials 不含env', async () => {
  197. let result
  198. try {
  199. result = app.auth().createTicket('oyeju0Eoc1ZCEgyxfk2vNeYDMpRs')
  200. } catch (e) {
  201. assert(e.code === 'INVALID_PARAM')
  202. }
  203. })
  204. it('校验credentials 含 env 且 与 init env不一致', async () => {
  205. const app1 = tcb.init({
  206. ...config,
  207. credentials: {
  208. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  209. private_key:
  210. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n',
  211. env_id: config.env
  212. }
  213. })
  214. let result
  215. try {
  216. result = app1.auth().createTicket('oyeju0Eoc1ZCEgyxfk2vNeYDMpRs')
  217. } catch (e) {
  218. assert(e.code === 'INVALID_PARAM')
  219. }
  220. })
  221. it('校验credentials 含 env 且 与 init env 一致', async () => {
  222. const app1 = tcb.init({
  223. ...config,
  224. credentials: {
  225. private_key_id: 'da86590d-dd17-45bd-84df-433f05612d0a',
  226. private_key:
  227. '-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQDNo9vk/GFDkihEJv5SbN4zQKW9OAjf4C2Z13eGYxLYIYhwNDi5\nl2O5+NLpPzH4Q839ULJIYQ6hfBAVO7mvQ+WP2oYeIqQyRe9NkDlCLmJ10SDwGQRq\nqekVHbz+2fIugxJf3BqIDX3nSHC4TkZZldSgZJIBwIUI5h0t2/IqEjFaHwIDAQAB\nAoGBALdRZrrIPhDVn2258Sgbgy3faKC47jhdiWlGinfTpD3mDtIvy42vJqjn52Uk\n/+/Yyi4THQum8jsE9PVoy8wxU9eDJN4AVjNf8Y98a/z8FCEVyXsvUPp4+Y9pPSmd\nmZe6JKU3mDTXtQDMrtZlkSHVGhSCo/vLMccrAdus8DEnWD0BAkEA2scDuCx9qb4A\nHs8t2j1jL483lsTT8dV8bX5UCwIpOP8jCgQmBbxIyL3/IIwonS7eRSeUDhh2aim+\ng2uhxqSygQJBAPCgo9jOQ/uwy2YjSOE3r6Q1gDCfclvY9z2Xb2IH0AZg529l2rg2\nqh3PPFEB7dBxzNimu9rhDG+dre61ilNwfJ8CQFrCfTSGoIsum3YslOUY2nD8hR8z\nAIou+rOh2NPITbmrfqnFFtECT1+YEqM6Ag9TRjqCNNW0KEvajYKPwElcQgECQHQj\nJFGM5FUDNHh8iT1iUhywUcml+10HL/WDNJgc6zNY6/rhLxqAD8VJc3QpuS1E77iV\naM+wlP7+HKe86SFyhkMCQFWmIveCeb0U0MTHV+Uem1vYWu5gLwSRvvvQlBiTx8Nb\ngLo8C8GxW6uCVPxk4gqnvwVSIN8sBfxQksHMOU3zQYo=\n-----END RSA PRIVATE KEY-----\n',
  228. env_id: config.env
  229. }
  230. })
  231. let result = app1.auth().createTicket('oyeju0Eoc1ZCEgyxfk2vNeYDMpRs')
  232. // console.log(result)
  233. assert(result)
  234. })
  235. })