puppet-mock.ts 8.0 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
  FileBox,
}             from 'file-box'

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

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

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

88 89 90
    this.state.on('pending')
    // await some tasks...
    this.state.on(true)
91

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
92 93
    this.userId = 'logined_user_id'
    const user = this.Contact.load(this.userId)
94
    this.emit('login', user)
95

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
96 97 98
    const msg  = this.Message.createMT('mock_id')
    await msg.ready()

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

104 105 106 107 108 109 110 111 112 113
  }

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

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

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

123 124
    if (!this.logonoff()) {
      throw new Error('logout before login?')
125 126
    }

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

    // TODO: do the logout job
131 132
  }

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

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

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

150
  public async contactFindAll(query: ContactQueryFilter): Promise<string[]> {
151 152
    log.verbose('PuppetMock', 'contactFindAll(%s)', query)

153 154 155
    return []
  }

156 157
  public async contactAvatar(contactId: string): Promise<FileBox> {
    log.verbose('PuppetMock', 'contactAvatar(%s)', contactId)
158

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

163 164 165 166 167 168 169 170 171 172
  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)
173

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

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
181 182 183 184 185
  /**
   *
   * Message
   *
   */
186 187 188 189 190 191 192 193 194 195 196 197
  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 (李卓桓) 已提交
198 199
    const payload: MessagePayload = {
      date      : new Date(),
200
      direction : this.Message.Direction.MT,
201
      fromId    : 'xxx',
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
202
      text      : 'mock message text',
203
      toId      : this.userSelf().id,
204
      type      : this.Message.Type.Text,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
205 206 207 208
    }
    return payload
  }

209 210 211 212 213 214 215 216 217 218 219 220
  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 (李卓桓) 已提交
221 222
  }

223 224 225 226
  public async messageForward(
    receiver  : Receiver,
    messageId : string,
  ): Promise<void> {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
227
    log.verbose('PuppetMock', 'messageForward(%s, %s)',
228 229
                              receiver,
                              messageId,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
230 231 232 233 234 235 236 237
              )
  }

  /**
   *
   * Room
   *
   */
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
238 239 240
  public async roomRawPayload(
    id: string,
  ): Promise<MockRoomRawPayload> {
241 242 243 244 245 246 247 248 249
    log.verbose('PuppetMock', 'roomRawPayload(%s)', id)

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

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
251 252 253
  public async roomRawPayloadParser(
    rawPayload: MockRoomRawPayload,
  ): Promise<RoomPayload> {
254 255 256
    log.verbose('PuppetMock', 'roomRawPayloadParser(%s)', rawPayload)

    const payload: RoomPayload = {
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
257
      topic          : 'mock topic',
258
      memberIdList   : [],
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
259 260 261 262
      nameMap        : {} as any,
      roomAliasMap   : {} as any,
      contactAliasMap: {} as any,
    }
263 264

    return payload
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
265 266
  }

267 268
  public async roomFindAll(
    query: RoomQueryFilter = { topic: /.*/ },
269
  ): Promise<string[]> {
270 271
    log.verbose('PuppetMock', 'roomFindAll(%s)', query)

272 273 274 275
    return []
  }

  public async roomDel(
276 277
    roomId    : string,
    contactId : string,
278
  ): Promise<void> {
279
    log.verbose('PuppetMock', 'roomDel(%s, %s)', roomId, contactId)
280 281 282
  }

  public async roomAdd(
283 284
    roomId    : string,
    contactId : string,
285
  ): Promise<void> {
286
    log.verbose('PuppetMock', 'roomAdd(%s, %s)', roomId, contactId)
287 288
  }

289 290 291 292 293
  public async roomTopic(
    roomId: string,
    topic?: string,
  ): Promise<void | string> {
    log.verbose('PuppetMock', 'roomTopic(%s, %s)', roomId, topic)
294

295 296 297 298 299 300
    if (typeof topic === 'undefined') {
      return 'mock room topic'
    }
    return
  }

301 302 303 304 305
  public async roomCreate(
    contactIdList : string[],
    topic         : string,
  ): Promise<string> {
    log.verbose('PuppetMock', 'roomCreate(%s, %s)', contactIdList, topic)
306

307
    return 'mock_room_id'
308 309
  }

310 311
  public async roomQuit(roomId: string): Promise<void> {
    log.verbose('PuppetMock', 'roomQuit(%s)', roomId)
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
312 313
  }

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
314 315 316 317 318 319
  /**
   *
   *
   * FriendRequest
   *
   */
320 321 322 323 324
  public async friendRequestSend(
    contactId : string,
    hello     : string,
  ): Promise<void> {
    log.verbose('PuppetMock', 'friendRequestSend(%s, %s)', contactId, hello)
325 326
  }

327 328 329 330 331
  public async friendRequestAccept(
    contactId : string,
    ticket    : string,
  ): Promise<void> {
    log.verbose('PuppetMock', 'friendRequestAccept(%s, %s)', contactId, ticket)
332 333 334 335 336
  }

}

export default PuppetMock