puppet-mock.ts 10.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/**
 *   Wechaty - https://github.com/chatie/wechaty
 *
 *   @copyright 2016-2018 Huan LI <zixia@zixia.net>
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */
19
import path  from 'path'
20 21

import {
22 23 24 25 26
  FileBox,
}             from 'file-box'

import {
  MessagePayload,
27 28

  ContactGender,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
29
  ContactType,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
30
  ContactPayload,
31

32
  FriendshipPayload,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
33
  RoomPayload,
34
  RoomMemberPayload,
35
}                       from '../puppet/'
36 37 38
import {
  Puppet,
  PuppetOptions,
39
  Receiver,
40
  MessageType,
41
}                       from '../puppet/'
42 43 44

import {
  log,
45
  qrCodeForChatie,
46
}                       from '../config'
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
47

48 49 50
export type PuppetFoodType = 'scan' | 'ding'
export type ScanFoodType   = 'scan' | 'login' | 'logout'

51 52 53 54 55
export interface MockContactRawPayload {
  name : string,
}

export interface MockMessageRawPayload {
56
  id   : string,
57 58 59 60 61 62
  from : string,
  to   : string,
  text : string
}

export interface MockRoomRawPayload {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
63 64 65
  topic      : string,
  memberList : string[],
  ownerId    : string,
66 67
}

68 69 70
export class PuppetMock extends Puppet {

  constructor(
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
71
    public options: PuppetOptions,
72
  ) {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
73
    super(options)
74 75 76
  }

  public async start(): Promise<void> {
77
    log.verbose('PuppetMock', `start() with ${this.options.memory.name}`)
78

79 80 81
    this.state.on('pending')
    // await some tasks...
    this.state.on(true)
82

83
    this.id = 'logined_user_id'
84 85 86 87 88 89 90 91 92
    // const user = this.Contact.load(this.id)
    this.emit('login', this.id)

    const MOCK_MSG_ID = 'mockid'
    this.cacheMessagePayload.set(MOCK_MSG_ID, {
      id        : MOCK_MSG_ID,
      type      : MessageType.Text,
      text      : 'mock text',
      timestamp : Date.now(),
93 94
      fromId    : 'xxx',
      toId      : 'xxx',
95
    })
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
96

97
    setInterval(() => {
98 99
      log.verbose('PuppetMock', `start() setInterval() pretending received a new message: ${MOCK_MSG_ID}`)
      this.emit('message', MOCK_MSG_ID)
100 101
    }, 3000)

102 103 104 105 106 107 108 109 110 111
  }

  public async stop(): Promise<void> {
    log.verbose('PuppetMock', 'quit()')

    if (this.state.off()) {
      log.warn('PuppetMock', 'quit() is called on a OFF puppet. await ready(off) and return.')
      await this.state.ready('off')
      return
    }
112

113 114 115 116 117 118 119
    this.state.off('pending')
    // await some tasks...
    this.state.off(true)
  }

  public async logout(): Promise<void> {
    log.verbose('PuppetMock', 'logout()')
120

121
    if (!this.id) {
122
      throw new Error('logout before login?')
123 124
    }

125 126
    this.emit('logout', this.id) // becore we will throw above by logonoff() when this.user===undefined
    this.id = undefined
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
127 128

    // TODO: do the logout job
129 130
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
131 132 133 134 135
  /**
   *
   * Contact
   *
   */
136 137
  public contactAlias(contactId: string)                      : Promise<string>
  public contactAlias(contactId: string, alias: string | null): Promise<void>
138

139 140
  public async contactAlias(contactId: string, alias?: string|null): Promise<void | string> {
    log.verbose('PuppetMock', 'contactAlias(%s, %s)', contactId, alias)
141

142 143 144 145 146 147
    if (typeof alias === 'undefined') {
      return 'mock alias'
    }
    return
  }

148 149 150 151 152
  public async contactValid(contactId: string): Promise<boolean> {
    log.verbose('PuppetMock', 'contactValid(%s)', contactId)
    return true
  }

153 154
  public async contactList(): Promise<string[]> {
    log.verbose('PuppetMock', 'contactList()')
155

156 157 158
    return []
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
159
  public async contactQrcode(contactId: string): Promise<string> {
160 161 162 163 164 165 166 167 168 169 170 171
    if (contactId !== this.selfId()) {
      throw new Error('can not set avatar for others')
    }

    throw new Error('not supported')
    // return await this.bridge.WXqr
  }

  public async contactAvatar(contactId: string)                : Promise<FileBox>
  public async contactAvatar(contactId: string, file: FileBox) : Promise<void>

  public async contactAvatar(contactId: string, file?: FileBox): Promise<void | FileBox> {
172
    log.verbose('PuppetMock', 'contactAvatar(%s)', contactId)
173

174 175 176 177 178 179 180 181 182 183
    /**
     * 1. set
     */
    if (file) {
      return
    }

    /**
     * 2. get
     */
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
184
    const WECHATY_ICON_PNG = path.resolve('../../docs/images/wechaty-icon.png')
185
    return FileBox.fromFile(WECHATY_ICON_PNG)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
186 187
  }

188 189 190 191 192 193 194 195 196 197
  public async contactRawPayload(id: string): Promise<MockContactRawPayload> {
    log.verbose('PuppetMock', 'contactRawPayload(%s)', id)
    const rawPayload: MockContactRawPayload = {
      name : 'mock name',
    }
    return rawPayload
  }

  public async contactRawPayloadParser(rawPayload: MockContactRawPayload): Promise<ContactPayload> {
    log.verbose('PuppetMock', 'contactRawPayloadParser(%s)', rawPayload)
198

199
    const payload: ContactPayload = {
200 201 202
      id     : 'id',
      gender : ContactGender.Unknown,
      type   : ContactType.Unknown,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
203
    }
204
    return payload
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
205 206
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
207 208 209 210 211
  /**
   *
   * Message
   *
   */
212
  public async messageFile(id: string): Promise<FileBox> {
213
    return FileBox.fromBase64(
214
      'cRH9qeL3XyVnaXJkppBuH20tf5JlcG9uFX1lL2IvdHRRRS9kMMQxOPLKNYIzQQ==',
215
      'mock-file' + id + '.txt',
216 217 218
    )
  }

219 220 221
  public async messageRawPayload(id: string): Promise<MockMessageRawPayload> {
    log.verbose('PuppetMock', 'messageRawPayload(%s)', id)
    const rawPayload: MockMessageRawPayload = {
222
      id   : 'id',
223 224 225 226 227 228 229 230 231
      from : 'from_id',
      text : 'mock message text',
      to   : 'to_id',
    }
    return rawPayload
  }

  public async messageRawPayloadParser(rawPayload: MockMessageRawPayload): Promise<MessagePayload> {
    log.verbose('PuppetMock', 'messagePayload(%s)', rawPayload)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
232
    const payload: MessagePayload = {
233
      id        : rawPayload.id,
234
      timestamp : Date.now(),
235
      fromId    : 'xxx',
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
236
      text      : 'mock message text',
237
      toId      : this.selfId(),
238
      type      : MessageType.Text,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
239 240 241 242
    }
    return payload
  }

243 244 245 246 247 248 249 250 251 252 253 254
  public async messageSendText(
    receiver : Receiver,
    text     : string,
  ): Promise<void> {
    log.verbose('PuppetMock', 'messageSend(%s, %s)', receiver, text)
  }

  public async messageSendFile(
    receiver : Receiver,
    file     : FileBox,
  ): Promise<void> {
    log.verbose('PuppetMock', 'messageSend(%s, %s)', receiver, file)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
255 256
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
257 258 259 260 261 262 263 264
  public async messageSendContact(
    receiver  : Receiver,
    contactId : string,
  ): Promise<void> {
    log.verbose('PuppetMock', 'messageSend("%s", %s)', JSON.stringify(receiver), contactId)
    return
  }

265 266 267 268
  public async messageForward(
    receiver  : Receiver,
    messageId : string,
  ): Promise<void> {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
269
    log.verbose('PuppetMock', 'messageForward(%s, %s)',
270 271
                              receiver,
                              messageId,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
272 273 274 275 276 277 278 279
              )
  }

  /**
   *
   * Room
   *
   */
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
280 281 282
  public async roomRawPayload(
    id: string,
  ): Promise<MockRoomRawPayload> {
283 284 285
    log.verbose('PuppetMock', 'roomRawPayload(%s)', id)

    const rawPayload: MockRoomRawPayload = {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
286
      ownerId      : 'mock_room_owner_id',
287 288 289 290 291
      topic      : 'mock topic',
      memberList : [],
    }
    return rawPayload
  }
292

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
293 294 295
  public async roomRawPayloadParser(
    rawPayload: MockRoomRawPayload,
  ): Promise<RoomPayload> {
296 297 298
    log.verbose('PuppetMock', 'roomRawPayloadParser(%s)', rawPayload)

    const payload: RoomPayload = {
299 300
      id           : 'id',
      topic        : 'mock topic',
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
301
    }
302 303

    return payload
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
304 305
  }

306 307 308 309 310
  public async roomValid(roomId: string): Promise<boolean> {
    log.verbose('PuppetMock', 'roomValid(%s)', roomId)
    return true
  }

311 312
  public async roomList(): Promise<string[]> {
    log.verbose('PuppetMock', 'roomList()')
313

314 315 316 317
    return []
  }

  public async roomDel(
318 319
    roomId    : string,
    contactId : string,
320
  ): Promise<void> {
321
    log.verbose('PuppetMock', 'roomDel(%s, %s)', roomId, contactId)
322 323
  }

324 325 326 327 328 329 330 331 332 333 334 335
  public async roomAvatar(roomId: string): Promise<FileBox> {
    log.verbose('PuppetMock', 'roomAvatar(%s)', roomId)

    const payload = await this.roomPayload(roomId)

    if (payload.avatar) {
      return FileBox.fromUrl(payload.avatar)
    }
    log.warn('PuppetMock', 'roomAvatar() avatar not found, use the chatie default.')
    return qrCodeForChatie()
  }

336
  public async roomAdd(
337 338
    roomId    : string,
    contactId : string,
339
  ): Promise<void> {
340
    log.verbose('PuppetMock', 'roomAdd(%s, %s)', roomId, contactId)
341 342
  }

343 344 345
  public async roomTopic(roomId: string)                : Promise<string>
  public async roomTopic(roomId: string, topic: string) : Promise<void>

346 347 348 349 350
  public async roomTopic(
    roomId: string,
    topic?: string,
  ): Promise<void | string> {
    log.verbose('PuppetMock', 'roomTopic(%s, %s)', roomId, topic)
351

352 353 354 355 356 357
    if (typeof topic === 'undefined') {
      return 'mock room topic'
    }
    return
  }

358 359 360 361 362
  public async roomCreate(
    contactIdList : string[],
    topic         : string,
  ): Promise<string> {
    log.verbose('PuppetMock', 'roomCreate(%s, %s)', contactIdList, topic)
363

364
    return 'mock_room_id'
365 366
  }

367 368
  public async roomQuit(roomId: string): Promise<void> {
    log.verbose('PuppetMock', 'roomQuit(%s)', roomId)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
369 370
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
371
  public async roomQrcode(roomId: string): Promise<string> {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
372 373 374
    return roomId + ' mock qrcode'
  }

375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392
  public async roomMemberList(roomId: string) : Promise<string[]> {
    log.verbose('PuppetMock', 'roommemberList(%s)', roomId)
    return []
  }

  public async roomMemberRawPayload(roomId: string, contactId: string): Promise<any>  {
    log.verbose('PuppetMock', 'roomMemberRawPayload(%s, %s)', roomId, contactId)
    return {}
  }

  public async roomMemberRawPayloadParser(rawPayload: any): Promise<RoomMemberPayload>  {
    log.verbose('PuppetMock', 'roomMemberRawPayloadParser(%s)', rawPayload)
    return {
      id: 'xx',
      roomAlias: 'yy',
    }
  }

393 394 395 396 397 398 399 400 401 402
  public async roomAnnounce(roomId: string)                : Promise<string>
  public async roomAnnounce(roomId: string, text: string)  : Promise<void>

  public async roomAnnounce(roomId: string, text?: string) : Promise<void | string> {
    if (text) {
      return
    }
    return 'mock announcement for ' + roomId
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
403 404
  /**
   *
405
   * Friendship
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
406 407
   *
   */
408
  public async friendshipRawPayload(id: string)            : Promise<any> {
409 410
    return {id} as any
  }
411
  public async friendshipRawPayloadParser(rawPayload: any) : Promise<FriendshipPayload> {
412 413 414
    return rawPayload
  }

415
  public async friendshipVerify(
416 417 418
    contactId : string,
    hello     : string,
  ): Promise<void> {
419
    log.verbose('PuppetMock', 'friendshipVerify(%s, %s)', contactId, hello)
420 421
  }

422 423
  public async friendshipAccept(
    friendshipId : string,
424
  ): Promise<void> {
425
    log.verbose('PuppetMock', 'friendshipAccept(%s)', friendshipId)
426 427
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
428 429 430 431
  public ding(data?: any): Promise<string> {
    return data
  }

432 433 434
}

export default PuppetMock