You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

backendTest.ts 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689
  1. import { Injector } from "../src/backend/Injector/Injector";
  2. import { FrontworkAdmin } from "../src/backend/Admin/Admin";
  3. import { T1 } from "../src/backend/Types/Items";
  4. import { RPCSocket } from "rpclibrary";
  5. import { FrontcraftIfc, Auth, User, FrontcraftFeatureIfc, Raid, Character, Rank, Class, Race, SRPriority, Spec, Signup } from "../src/backend/Types/Types";
  6. import { SpecT } from "../src/backend/Types/PlayerSpecs";
  7. type protoAccount<C extends Class = Class> = {
  8. name : string,
  9. pwHash?: string
  10. rank : Rank,
  11. race: Race,
  12. class: C,
  13. spec: SpecT[C]
  14. }
  15. const trialsAndUp = {
  16. ADMIN: true,
  17. Guildmaster: true,
  18. Officer: true,
  19. Classleader: true,
  20. Raider: true,
  21. Trial: true,
  22. Social: false,
  23. Guest: false
  24. }
  25. const adminsOnly = {
  26. ADMIN: true,
  27. Guildmaster: true,
  28. Officer: true,
  29. Classleader: false,
  30. Raider: false,
  31. Trial: false,
  32. Social: false,
  33. Guest: false
  34. }
  35. const defaultPermissions = [
  36. { rpcname: 'signup', ...trialsAndUp
  37. },{ rpcname: 'reset', ...adminsOnly
  38. },{ rpcname: 'modifyPermissions', ...adminsOnly
  39. },{ rpcname: 'manageGuild', ...adminsOnly
  40. },{ rpcname: 'managePriorities', ...adminsOnly
  41. },{ rpcname: 'softreserveCurrency', ...adminsOnly
  42. },{ rpcname: 'manageRaid', ...adminsOnly
  43. }]
  44. const testAccounts : protoAccount[] = [
  45. {
  46. name: 'Rain',
  47. race: 'Human',
  48. class: 'Warrior',
  49. spec: 'Protection',
  50. rank: 'Guildmaster'
  51. },{
  52. name: 'Celinda',
  53. class: 'Warrior',
  54. race: 'Night Elf',
  55. spec: 'Protection',
  56. rank: 'Officer'
  57. },{
  58. name: 'Silver',
  59. class: 'Druid',
  60. race: 'Night Elf',
  61. spec: 'Restoration',
  62. rank: 'Raider'
  63. },{
  64. name: 'Dagger',
  65. race: 'Dwarf',
  66. class: 'Rogue',
  67. spec: 'Assassination',
  68. rank: 'Classleader'
  69. },{
  70. name: 'Hope',
  71. class: 'Paladin',
  72. race: 'Human',
  73. spec: 'Holy',
  74. rank: 'Classleader'
  75. },{
  76. name: 'Shrekd',
  77. class: 'Warrior',
  78. race: 'Dwarf',
  79. spec: 'Fury',
  80. rank: 'Classleader'
  81. },{
  82. name: 'Teeniweeni',
  83. class: 'Warlock',
  84. race: 'Gnome',
  85. spec: 'Demonology',
  86. rank: 'Classleader'
  87. },{
  88. name: 'Hagibaba',
  89. class: 'Priest',
  90. race: 'Human',
  91. spec: 'Discipline',
  92. rank: 'Classleader'
  93. },{
  94. name: 'Muffinbreak',
  95. class: 'Mage',
  96. race: 'Gnome',
  97. spec: 'Arcane',
  98. rank: 'Classleader'
  99. },
  100. ]
  101. describe('Frontcraft', () => {
  102. let auth: Auth,
  103. adminUser : User,
  104. server: FrontworkAdmin,
  105. client : RPCSocket & FrontcraftIfc,
  106. adminClient : RPCSocket & FrontcraftFeatureIfc,
  107. raids: Raid[] = [],
  108. users : {[username in string] : { account: User, character: Character, auth: Auth, signup?:Signup, item?:string }} = {}
  109. const createAccount = (user: User) => {
  110. return client.UserManager.createUser(user)
  111. }
  112. const createAccountAndUser = async (acc : protoAccount) => {
  113. const account = await createAccount({
  114. pwhash: 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', //sha256("a")
  115. rank: acc.rank,
  116. username: acc.name,
  117. })
  118. const auth = await client.UserManager.login(acc.name, 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb')
  119. const id = await client.CharacterManager.getSpecId(acc.class, acc.spec)
  120. const char = await client.CharacterManager.createCharacter(auth.token.value, {
  121. charactername: acc.name,
  122. specid: id,
  123. userid: account.id!,
  124. race: acc.race
  125. })
  126. return {
  127. account: account,
  128. character: char,
  129. auth: auth
  130. }
  131. }
  132. before(function (done){
  133. this.timeout(10000);
  134. server = Injector.resolve<FrontworkAdmin>(FrontworkAdmin)
  135. server.start().then((_server) => {
  136. RPCSocket.makeSocket<FrontcraftIfc>(20000, 'localhost').then(_client => {
  137. client = _client
  138. createAccount({
  139. pwhash: 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb', //hash("a")
  140. rank: 'ADMIN',
  141. username: 'a',
  142. MC: 2
  143. }).then(adminUser => {
  144. client.UserManager.login(adminUser.username, 'ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb').then(auth => {
  145. const sock = new RPCSocket(
  146. auth.port,
  147. "localhost"
  148. )
  149. sock.connect<any>(auth.token.value).then(cli => {
  150. adminClient = cli
  151. sock.hook('kick', () => {
  152. console.log("I got kicked");
  153. })
  154. sock.hook('getUserData', () => auth)
  155. sock.hook('navigate', (where:string) => {
  156. console.log("Nagivate client to "+where);
  157. })
  158. sock.on('error', (e) => {
  159. console.log('Socket error', e)
  160. })
  161. done()
  162. })
  163. })
  164. })
  165. })
  166. }).catch(done)
  167. })
  168. after(()=>{
  169. client.destroy()
  170. adminClient.destroy()
  171. server.stop()
  172. })
  173. it('create raids', (done) => {
  174. let insertRaid = <Raid>{
  175. description: "Test raid 1",
  176. title: 'MC',
  177. start: Date.now().toString(),
  178. tier: 'MC'
  179. }
  180. adminClient.manageRaid.createRaid(insertRaid).then(() => {
  181. client.RaidManager.getRaids().then((r)=>{
  182. if(r[0].title === insertRaid.title
  183. && r[0].description === insertRaid.description
  184. && r[0].tier === "MC"){
  185. raids.push(r[0])
  186. done()
  187. }
  188. }).catch(done)
  189. }).catch(done)
  190. })
  191. it('create users', (done)=>{
  192. Promise.all(testAccounts.map(acc => createAccountAndUser(acc))).then(accs => {
  193. if(accs.length === testAccounts.length){
  194. accs.forEach(acc => {
  195. users[acc.account.username] = acc
  196. })
  197. done()
  198. }
  199. }).catch(done)
  200. })
  201. it('should sign up', (done)=>{
  202. Promise.all(Object.values(users).map((user) =>
  203. adminClient.signup.sign(user.auth.token.value, user.character, raids[0], false).catch(done)
  204. )).then(x => {
  205. adminClient.signup.getSignups(raids[0]).then(s => {
  206. if(s.length == testAccounts.length){
  207. s.forEach(sign => {
  208. users[sign.username].signup = sign
  209. })
  210. done()
  211. }else{
  212. done("Unexpected number of signups: "+s.length)
  213. }
  214. })
  215. })
  216. })
  217. it('calculate priorities', (done)=>{
  218. const makePrio = async (itemname:string, spec?: Spec, race?:Race, mod:number = 0, description:string = "") => {
  219. let specid
  220. if(spec)
  221. specid = await client.CharacterManager.getSpecId(spec.class, <any>spec.specname)
  222. await adminClient.managePriorities.setPriority(itemname, {
  223. specid: specid,
  224. race: race,
  225. modifier: mod,
  226. description: description
  227. })
  228. }
  229. Promise.all([
  230. makePrio(
  231. 'Bracers of Arcane Accuracy',
  232. {class:'Warlock', specname:'Demonology'},
  233. undefined, 2, "hit bias"
  234. ),
  235. makePrio(
  236. 'Bracers of Arcane Accuracy',
  237. {class:'Warlock', specname:'Affliction'},
  238. undefined, 2, "hit bias"
  239. ),
  240. makePrio(
  241. 'Bracers of Arcane Accuracy',
  242. {class:'Warlock', specname:'Destruction'},
  243. undefined, 2, "hit bias"
  244. ),
  245. makePrio(
  246. 'Bracers of Arcane Accuracy',
  247. {class:'Mage', specname:'Arcane'},
  248. undefined, 1, "hit bias"
  249. ),
  250. makePrio(
  251. 'Bracers of Arcane Accuracy',
  252. {class:'Mage', specname:'Frost'},
  253. undefined, 1, "hit bias"
  254. ),
  255. makePrio(
  256. 'Bracers of Arcane Accuracy',
  257. {class:'Mage', specname:'Fire'},
  258. undefined, 1, "hit bias"
  259. ),
  260. makePrio(
  261. 'Maladath, Runed Blade of the Black Flight',
  262. undefined,
  263. "Human", -2, "(1) Non-Human"
  264. ),
  265. makePrio(
  266. 'Maladath, Runed Blade of the Black Flight',
  267. {class:'Rogue', specname:'Subtlety'},
  268. undefined, 2, "...Rogues (weapon skill bias)"
  269. ),
  270. makePrio(
  271. 'Maladath, Runed Blade of the Black Flight',
  272. {class:'Rogue', specname:'Combat'},
  273. undefined, 2, "...Rogues (weapon skill bias)"
  274. ),
  275. makePrio(
  276. 'Maladath, Runed Blade of the Black Flight',
  277. {class:'Rogue', specname:'Assassination'},
  278. undefined, 2, "...Rogues (weapon skill bias)"
  279. ),
  280. makePrio(
  281. 'Maladath, Runed Blade of the Black Flight',
  282. {class:'Warrior', specname:'Fury'},
  283. 'Human', 4, "+2 Fury Warrior (weapon skill bias), +2 to offset (1)"
  284. ),
  285. makePrio(
  286. 'Cloak of Firemaw',
  287. {class:'Rogue', specname:'Assassination'},
  288. undefined, 2, "agi-to-ap bias"
  289. ),
  290. makePrio(
  291. 'Cloak of Firemaw',
  292. {class:'Rogue', specname:'Combat'},
  293. undefined, 2, "agi-to-ap bias"
  294. ),
  295. makePrio(
  296. 'Cloak of Firemaw',
  297. {class:'Rogue', specname:'Subtlety'},
  298. undefined, 2, "agi-to-ap bias"
  299. ),
  300. makePrio(
  301. 'Band of Forced Concentration',
  302. {class:'Warlock', specname:'Demonology'},
  303. undefined, 2, "hit bias"
  304. ),
  305. makePrio(
  306. 'Band of Forced Concentration',
  307. {class:'Warlock', specname:'Affliction'},
  308. undefined, 2, "hit bias"
  309. ),
  310. makePrio(
  311. 'Band of Forced Concentration',
  312. {class:'Warlock', specname:'Destruction'},
  313. undefined, 2, "hit bias"
  314. ),
  315. makePrio(
  316. 'Band of Forced Concentration',
  317. {class:'Mage', specname:'Arcane'},
  318. undefined, 1, "hit bias"
  319. ),
  320. makePrio(
  321. 'Band of Forced Concentration',
  322. {class:'Mage', specname:'Frost'},
  323. undefined, 1, "hit bias"
  324. ),
  325. makePrio(
  326. 'Band of Forced Concentration',
  327. {class:'Mage', specname:'Fire'},
  328. undefined, 1, "hit bias"
  329. ),
  330. makePrio(
  331. 'Drake Fang Talisman',
  332. {class:'Rogue', specname:'Assassination'},
  333. undefined, 4, "hit bias"
  334. ),
  335. makePrio(
  336. 'Drake Fang Talisman',
  337. {class:'Rogue', specname:'Combat'},
  338. undefined, 4, "hit bias"
  339. ),
  340. makePrio(
  341. 'Drake Fang Talisman',
  342. {class:'Rogue', specname:'Subtlety'},
  343. undefined, 4, "hit bias"
  344. ),
  345. makePrio(
  346. 'Drake Fang Talisman',
  347. {class:'Warrior', specname:'Fury'},
  348. undefined, 2, "hit bias"
  349. ),
  350. makePrio(
  351. 'Drake Fang Talisman',
  352. {class:'Druid', specname:'Feral (DPS)'},
  353. undefined, 2, "hit bias"
  354. ),
  355. makePrio(
  356. 'Circle of Applied Force',
  357. {class:'Warrior', specname:'Fury'},
  358. undefined, 2, "str-to-ap bias"
  359. ),
  360. makePrio(
  361. 'Circle of Applied Force',
  362. {class:'Druid', specname:'Feral (DPS)'},
  363. undefined, 2, "str-to-ap bias"
  364. ),
  365. makePrio(
  366. 'Empowered Leggings',
  367. {class:'Paladin', specname:'Holy'},
  368. undefined, 2, "crit bias"
  369. ),
  370. makePrio(
  371. 'Empowered Leggings',
  372. {class:'Druid', specname:'Restoration'},
  373. undefined, 2, "crit bias"
  374. ),
  375. makePrio(
  376. 'Boots of the Shadow Flame',
  377. {class:'Rogue', specname:'Assassination'},
  378. undefined, 2, "hit bias"
  379. ),
  380. makePrio(
  381. 'Boots of the Shadow Flame',
  382. {class:'Rogue', specname:'Combat'},
  383. undefined, 2, "hit bias"
  384. ),
  385. makePrio(
  386. 'Boots of the Shadow Flame',
  387. {class:'Rogue', specname:'Subtlety'},
  388. undefined, 2, "hit bias"
  389. ),
  390. makePrio(
  391. 'Boots of the Shadow Flame',
  392. {class:'Druid', specname:'Feral (DPS)'},
  393. undefined, 2, "hit bias"
  394. ),
  395. makePrio(
  396. 'Neltharion\'s Tear',
  397. {class:'Warlock', specname:'Demonology'},
  398. undefined, 4, "hit bias"
  399. ),
  400. makePrio(
  401. 'Neltharion\'s Tear',
  402. {class:'Warlock', specname:'Affliction'},
  403. undefined, 4, "hit bias"
  404. ),
  405. makePrio(
  406. 'Neltharion\'s Tear',
  407. {class:'Warlock', specname:'Destruction'},
  408. undefined, 4, "hit bias"
  409. ),
  410. makePrio(
  411. 'Neltharion\'s Tear',
  412. {class:'Mage', specname:'Arcane'},
  413. undefined, 2, "hit bias"
  414. ),
  415. makePrio(
  416. 'Neltharion\'s Tear',
  417. {class:'Mage', specname:'Frost'},
  418. undefined, 2, "hit bias"
  419. ),
  420. makePrio(
  421. 'Neltharion\'s Tear',
  422. {class:'Mage', specname:'Fire'},
  423. undefined, 2, "hit bias"
  424. ),
  425. makePrio(
  426. 'Cloak of Draconic Might',
  427. {class:'Warrior', specname:'Fury'},
  428. undefined, 2, "str-to-ap bias"
  429. ),
  430. makePrio(
  431. 'Cloak of Draconic Might',
  432. {class:'Druid', specname:'Feral (DPS)'},
  433. undefined, 2, "str-to-ap bias"
  434. ),
  435. ])
  436. const user = Object.values(users)[0]
  437. adminClient.managePriorities.setPriority(T1[0], {
  438. race: user.character.race,
  439. specid: user.character.specid,
  440. modifier: 1,
  441. description:'AAA'
  442. }).then(() => {
  443. adminClient.managePriorities.setPriority(T1[0], {
  444. race: user.character.race,
  445. specid: undefined,
  446. modifier: 2,
  447. description:'BBB'
  448. }).then(()=>{
  449. adminClient.managePriorities.setPriority(T1[0], {
  450. race: undefined,
  451. specid: user.character.specid,
  452. modifier: 3,
  453. description:'CCC'
  454. }).then(()=>{
  455. client.ItemManager.calculatePriorities(T1[0], user.character).then(sum => {
  456. if(sum === 6)
  457. done()
  458. })
  459. })
  460. })
  461. })
  462. })
  463. it('buy token', (done)=>{
  464. Promise.all(Object.values(users).map(async (user) =>{
  465. const itemname = T1[0]//T1[Math.floor(T1.length*Math.random())]
  466. const modifier = await client.ItemManager.calculatePriorities(itemname, user.character)
  467. const token = await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, user.signup!)
  468. users[user.account.username].item = itemname
  469. if(!token) return false
  470. return modifier+1 === token.level
  471. })).then(success => {
  472. if(success.reduce((prev, curr)=>prev&&curr, true)) done()
  473. })
  474. })
  475. it('not buy token without currency', (done)=>{
  476. const user = Object.values(users)[0]
  477. const itemname = T1[0]
  478. client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, user.signup!).then(token => {
  479. if(!token)
  480. done()
  481. else {
  482. console.log("Unexpected token", token);
  483. }
  484. })
  485. })
  486. it('upgrade token', (done)=>{
  487. const user = Object.values(users)[0]
  488. const itemname = T1[0]
  489. adminClient.softreserveCurrency.incrementCurrency(user.account, raids[0].tier, 2).then(async ()=>{
  490. const item = await client.ItemManager.getItem(itemname)
  491. const before = await client.ItemManager.getToken(user.character, item)
  492. if(!before || before.level !== 7) {
  493. console.log("expected level to be 7", before);
  494. return
  495. }
  496. await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, user.signup!)
  497. const after = await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, user.signup!)
  498. if(!after || after.level !== 9) {
  499. console.log("expected level to be 9", after);
  500. return
  501. }
  502. done()
  503. })
  504. })
  505. it('should buy more tokens', (done) => {
  506. Promise.all(Object.values(users).map(async (user) => {
  507. await adminClient.softreserveCurrency.incrementCurrency(user.account,raids[0].tier, 1)
  508. return await client.ItemManager
  509. .buyToken(
  510. user.auth.token.value,
  511. user.character.charactername,
  512. T1[Math.floor(T1.length*Math.random())],
  513. user.signup!
  514. )
  515. })).then(_ => {
  516. done()
  517. })
  518. })
  519. it('can set permissions', (done) => {
  520. Promise.all(
  521. defaultPermissions.map(perm => adminClient.modifyPermissions.setPermission(perm)),
  522. ).then(_ => {
  523. done()
  524. })
  525. })
  526. it('start raid', (done) => {
  527. client.RaidManager.getRaids().then((r)=>{
  528. adminClient.manageRaid.startRaid(raids[0]).then(async data => {
  529. const dbRaids = await client.RaidManager.getRaids()
  530. if(dbRaids.length === 0){
  531. await client.UserManager.getUser(testAccounts[0].name).then(dbUser => {
  532. if(dbUser && dbUser.MC === 1){
  533. adminClient.signup.getSignups(raids[0]).then(signups => {
  534. if(signups.length === 0){
  535. done()
  536. }else{
  537. console.log(signups);
  538. }
  539. })
  540. }
  541. else{
  542. console.log("Bad user currency", dbUser);
  543. }
  544. })
  545. }
  546. })
  547. })
  548. })
  549. it('reset system', (done) => {
  550. adminClient.reset.wipeCurrencyAndItems().then(() => {
  551. client.UserManager.getUser(testAccounts[0].name).then(user => {
  552. if(user && user.MC === 1){
  553. client.ItemManager.getTokens(users[testAccounts[0].name.toLowerCase()].character, ['MC']).then(tokens => {
  554. if(tokens!.length === 0){
  555. done()
  556. }else{
  557. console.log(tokens);
  558. }
  559. })
  560. }else{
  561. console.log(user)
  562. }
  563. })
  564. })
  565. })
  566. it('implements loot system correctly', (done)=>{
  567. const ONE_WEEK = 4800000000
  568. const Raid = (week:number, tier:string) => {
  569. return <Raid>{
  570. description: tier+" Test raid 1",
  571. title: tier,
  572. start: (week*ONE_WEEK + Date.now()).toString(),
  573. tier: tier
  574. }
  575. }
  576. const user = Object.values(users)[0]
  577. const createRaid = adminClient.manageRaid.createRaid
  578. const sign = async (raid:Raid, late = false) => await adminClient.signup.sign(user.auth.token.value, user.character, raid, late)
  579. const buyToken = async (signup: Signup, itemname: string) => await client.ItemManager.buyToken(user.auth.token.value, user.character.charactername, itemname, signup)
  580. createRaid(Raid(0, 'MC')).then(async (MC0:Raid) => {
  581. const T1_0 = await client.ItemManager.getItem(T1[0])
  582. //const BWL0 = await createRaid(Raid(0, 'BWL'))
  583. const signupMC0 = await sign(MC0)
  584. let token = await buyToken(signupMC0, T1[0])
  585. if(!token){
  586. console.log(MC0, signupMC0)
  587. done("No token created")
  588. return
  589. }
  590. let reserves = await client.ItemManager.getTokens(user.character, [MC0.tier], true)
  591. let streaks = await client.ItemManager.getTokens(user.character, [MC0.tier], false)
  592. if(reserves!.length != 1
  593. || streaks!.length != 0
  594. || reserves![0].itemname !== T1_0.itemname
  595. || reserves![0].level !== 7){
  596. console.log(reserves, streaks);
  597. done("Bad token status")
  598. return
  599. }
  600. await adminClient.manageRaid.startRaid(MC0)
  601. reserves = await client.ItemManager.getTokens(user.character, [MC0.tier], true)
  602. streaks = await client.ItemManager.getTokens(user.character, [MC0.tier], false)
  603. if(reserves!.length != 0
  604. || streaks!.length != 1
  605. || streaks![0].itemname !== T1[0]
  606. || streaks![0].level !== 7){
  607. console.log(reserves, streaks);
  608. done("Bad token status")
  609. return
  610. }
  611. const MC1 = await createRaid(Raid(1, 'MC'))
  612. const signupMC1 = await sign(MC1)
  613. token = await buyToken(signupMC1, T1[1])
  614. reserves = await client.ItemManager.getTokens(user.character, [MC1.tier], true)
  615. streaks = await client.ItemManager.getTokens(user.character, [MC1.tier], false)
  616. if(reserves!.length != 1
  617. || streaks!.length != 0
  618. || reserves![0].itemname !== T1[1]
  619. || reserves![0].level !== 1){
  620. console.log(reserves, streaks);
  621. done("Bad token status")
  622. return
  623. }
  624. done()
  625. }).catch(e => {
  626. console.log(e);
  627. done(e)
  628. })
  629. })
  630. })