index.test.ts 14 KB

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