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
}                       from '../message'
29 30
import {
  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 37
import {
  Room,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
38
  RoomPayload,
39
  RoomQueryFilter,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
40
}                       from '../room'
41 42 43 44 45 46 47
// import {
//   FriendRequest,
// }                       from '../puppet/friend-request'
import {
  Puppet,
  PuppetOptions,
}                       from '../puppet/'
48 49 50

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

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

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

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

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

72 73 74
export class PuppetMock extends Puppet {

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

  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}`)
90

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

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

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

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

106 107 108 109 110 111 112 113 114 115
  }

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

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

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

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

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

    // TODO: do the logout job
133 134
  }

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

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

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

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

155 156 157
    return []
  }

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

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

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

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

Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
183 184 185 186 187
  /**
   *
   * Message
   *
   */
188 189 190 191 192 193 194 195 196 197 198 199
  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 (李卓桓) 已提交
200 201
    const payload: MessagePayload = {
      date      : new Date(),
202 203
      direction : this.Message.Direction.MT,
      from      : this.Contact.load('xxx'),
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
204 205
      text      : 'mock message text',
      to        : this.userSelf(),
206
      type      : this.Message.Type.Text,
Huan (李卓桓)'s avatar
Huan (李卓桓) 已提交
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
    }
    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
   *
   */
227 228 229 230 231 232 233 234 235 236
  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
  }
237

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

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

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

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

257 258 259 260
    return []
  }

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

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

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

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

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

286 287 288
    if (!contactList || ! contactList.map) {
      throw new Error('contactList not found')
    }
289
    const r = this.Room.load('mock room id') as Room
290 291 292
    return r
  }

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

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

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

}

export default PuppetMock