puppet-mock.ts 7.8 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.
 *
 */
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
19
import * as path  from 'path'
20 21

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

import {
  Message,
  MessagePayload,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
28
  MessageDirection,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
29
}                       from '../message'
30 31
import {
  Contact,
32
  ContactQueryFilter,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
33 34
  Gender,
  ContactType,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
35
  ContactPayload,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
36
}                       from '../contact'
37 38
import {
  Room,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
39
  RoomPayload,
40
  RoomQueryFilter,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
41
}                       from '../room'
42 43 44 45 46 47 48
// import {
//   FriendRequest,
// }                       from '../puppet/friend-request'
import {
  Puppet,
  PuppetOptions,
}                       from '../puppet/'
49 50 51

import {
  log,
52
}                       from '../config'
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
53

54 55 56
export type PuppetFoodType = 'scan' | 'ding'
export type ScanFoodType   = 'scan' | 'login' | 'logout'

57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
export interface MockContactRawPayload {
  name : string,
}

export interface MockMessageRawPayload {
  from : string,
  to   : string,
  text : string
}

export interface MockRoomRawPayload {
  topic: string,
  memberList: string[],
  owner: string,
}

73 74 75
export class PuppetMock extends Puppet {

  constructor(
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
76
    public options: PuppetOptions,
77
  ) {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
78
    super(options)
79 80 81 82 83 84 85 86 87 88 89 90
  }

  public toString() {
    return `PuppetMock<${this.options.profile.name}>`
  }

  public ding(data?: any): Promise<string> {
    return data
  }

  public async start(): Promise<void> {
    log.verbose('PuppetMock', `start() with ${this.options.profile}`)
91

92 93 94
    this.state.on('pending')
    // await some tasks...
    this.state.on(true)
95

96 97
    const user = Contact.load('logined_user_id')
    const msg  = Message.createMT('mock_id')
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
98

99 100
    this.user = user
    this.emit('login', user)
101 102

    setInterval(() => {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
103 104
      log.verbose('PuppetMock', `start() setInterval() pretending received a new message: ${msg}`)
      this.emit('message', msg)
105 106
    }, 3000)

107 108 109 110 111 112 113 114 115 116
  }

  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
    }
117

118 119 120 121 122 123 124
    this.state.off('pending')
    // await some tasks...
    this.state.off(true)
  }

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

126 127
    if (!this.logonoff()) {
      throw new Error('logout before login?')
128 129
    }

130
    this.emit('logout', this.user!) // becore we will throw above by logonoff() when this.user===undefined
131
    this.user = undefined
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
132 133

    // TODO: do the logout job
134 135
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
136 137 138 139 140
  /**
   *
   * Contact
   *
   */
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
141 142
  public contactAlias(contact: Contact)                      : Promise<string>
  public contactAlias(contact: Contact, alias: string | null): Promise<void>
143

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
144
  public async contactAlias(contact: Contact, alias?: string|null): Promise<void | string> {
145 146
    log.verbose('PuppetMock', 'contactAlias(%s, %s)', contact, alias)

147 148 149 150 151 152
    if (typeof alias === 'undefined') {
      return 'mock alias'
    }
    return
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
153
  public async contactFindAll(query: ContactQueryFilter): Promise<Contact[]> {
154 155
    log.verbose('PuppetMock', 'contactFindAll(%s)', query)

156 157 158
    return []
  }

159 160 161
  public async contactAvatar(contact: Contact): Promise<FileBox> {
    log.verbose('PuppetMock', 'contactAvatar(%s)', contact)

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
162
    const WECHATY_ICON_PNG = path.resolve('../../docs/images/wechaty-icon.png')
163
    return FileBox.fromLocal(WECHATY_ICON_PNG)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
164 165
  }

166 167 168 169 170 171 172 173 174 175
  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)
176

177
    const payload: ContactPayload = {
178 179
      gender: Gender.Unknown,
      type:   ContactType.Unknown,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
180
    }
181
    return payload
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
182 183
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
184 185 186 187 188
  /**
   *
   * Message
   *
   */
189 190 191 192 193 194 195 196 197 198 199 200
  public async messageRawPayload(id: string): Promise<MockMessageRawPayload> {
    log.verbose('PuppetMock', 'messageRawPayload(%s)', id)
    const rawPayload: MockMessageRawPayload = {
      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 (李卓桓) 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
    const payload: MessagePayload = {
      date      : new Date(),
      direction : MessageDirection.MT,
      from      : Contact.load('xxx'),
      text      : 'mock message text',
      to        : this.userSelf(),
      type      : Message.Type.Text,
    }
    return payload
  }

  public async messageSend(message: Message): Promise<void> {
    log.verbose('PuppetMock', 'messageSend(%s)', message)
  }

  public async messageForward(message: Message, to: Contact | Room): Promise<void> {
    log.verbose('PuppetMock', 'messageForward(%s, %s)',
                              message,
                              to,
              )
  }

  /**
   *
   * Room
   *
   */
228 229 230 231 232 233 234 235 236 237
  public async roomRawPayload(id: string): Promise<MockRoomRawPayload> {
    log.verbose('PuppetMock', 'roomRawPayload(%s)', id)

    const rawPayload: MockRoomRawPayload = {
      owner      : 'mock_room_owner_id',
      topic      : 'mock topic',
      memberList : [],
    }
    return rawPayload
  }
238

239 240 241 242
  public async roomRawPayloadParser(rawPayload: MockRoomRawPayload): Promise<RoomPayload> {
    log.verbose('PuppetMock', 'roomRawPayloadParser(%s)', rawPayload)

    const payload: RoomPayload = {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
243 244 245 246 247 248
      topic          : 'mock topic',
      memberList     : [],
      nameMap        : {} as any,
      roomAliasMap   : {} as any,
      contactAliasMap: {} as any,
    }
249 250

    return payload
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
251 252
  }

253 254
  public async roomFindAll(
    query: RoomQueryFilter = { topic: /.*/ },
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
255
  ): Promise<Room[]> {
256 257
    log.verbose('PuppetMock', 'roomFindAll(%s)', query)

258 259 260 261
    return []
  }

  public async roomDel(
262 263
    room    : Room,
    contact : Contact,
264
  ): Promise<void> {
265
    log.verbose('PuppetMock', 'roomDel(%s, %s)', room, contact)
266 267 268
  }

  public async roomAdd(
269 270
    room    : Room,
    contact : Contact,
271
  ): Promise<void> {
272
    log.verbose('PuppetMock', 'roomAdd(%s, %s)', room, contact)
273 274
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
275
  public async roomTopic(room: Room, topic?: string): Promise<void | string> {
276 277
    log.verbose('PuppetMock', 'roomTopic(%s, %s)', room, topic)

278 279 280 281 282 283
    if (typeof topic === 'undefined') {
      return 'mock room topic'
    }
    return
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
284
  public async roomCreate(contactList: Contact[], topic: string): Promise<Room> {
285 286
    log.verbose('PuppetMock', 'roomCreate(%s, %s)', contactList, topic)

287 288 289
    if (!contactList || ! contactList.map) {
      throw new Error('contactList not found')
    }
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
290
    const r = Room.load('mock room id') as Room
291 292 293 294
    r.puppet = this
    return r
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
295
  public async roomQuit(room: Room): Promise<void> {
296
    log.verbose('PuppetMock', 'roomQuit(%s)', room)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
297 298
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
299 300 301 302 303 304
  /**
   *
   *
   * FriendRequest
   *
   */
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
305
  public async friendRequestSend(contact: Contact, hello: string): Promise<void> {
306
    log.verbose('PuppetMock', 'friendRequestSend(%s, %s)', contact, hello)
307 308
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
309
  public async friendRequestAccept(contact: Contact, ticket: string): Promise<void> {
310
    log.verbose('PuppetMock', 'friendRequestAccept(%s, %s)', contact, ticket)
311 312 313 314 315
  }

}

export default PuppetMock