paricafe/packages/megalodon/test/unit/parser.spec.ts
2024-11-20 12:45:51 +08:00

157 lines
3.8 KiB
TypeScript

import { Parser } from '@/parser'
import Entity from '@/entity'
const account: Entity.Account = {
id: '1',
username: 'h3poteto',
acct: 'h3poteto@pleroma.io',
display_name: 'h3poteto',
locked: false,
group: false,
noindex: null,
suspended: null,
limited: null,
created_at: '2019-03-26T21:30:32',
followers_count: 10,
following_count: 10,
statuses_count: 100,
note: 'engineer',
url: 'https://pleroma.io',
avatar: '',
avatar_static: '',
header: '',
header_static: '',
emojis: [],
moved: null,
fields: [],
bot: false
}
const status: Entity.Status = {
id: '1',
uri: 'http://example.com',
url: 'http://example.com',
account: account,
in_reply_to_id: null,
in_reply_to_account_id: null,
reblog: null,
content: 'hoge',
plain_content: 'hoge',
created_at: '2019-03-26T21:40:32',
edited_at: null,
emojis: [],
replies_count: 0,
reblogs_count: 0,
favourites_count: 0,
reblogged: null,
favourited: null,
muted: null,
sensitive: false,
spoiler_text: '',
visibility: 'public',
media_attachments: [],
mentions: [],
tags: [],
card: null,
poll: null,
application: {
name: 'Web'
} as Entity.Application,
language: null,
pinned: null,
emoji_reactions: [],
bookmarked: false,
quote: false
}
const notification: Entity.Notification = {
id: '1',
account: account,
status: status,
type: 'favourite',
created_at: '2019-04-01T17:01:32'
}
const conversation: Entity.Conversation = {
id: '1',
accounts: [account],
last_status: status,
unread: true
}
describe('Parser', () => {
let parser: Parser
beforeEach(() => {
parser = new Parser()
})
describe('parse', () => {
describe('message is heartbeat', () => {
const message: string = ':thump\n'
it('should be called', () => {
const spy = jest.fn()
parser.on('heartbeat', spy)
parser.parse(message)
expect(spy).toHaveBeenLastCalledWith({})
})
})
describe('message is not json', () => {
describe('event is delete', () => {
const message = `event: delete\ndata: 12asdf34\n\n`
it('should be called', () => {
const spy = jest.fn()
parser.once('delete', spy)
parser.parse(message)
expect(spy).toHaveBeenCalledWith('12asdf34')
})
})
describe('event is not delete', () => {
const message = `event: event\ndata: 12asdf34\n\n`
it('should be error', () => {
const error = jest.fn()
const deleted = jest.fn()
parser.once('error', error)
parser.once('delete', deleted)
parser.parse(message)
expect(error).toHaveBeenCalled()
expect(deleted).not.toHaveBeenCalled()
})
})
})
describe('message is json', () => {
describe('event is update', () => {
const message = `event: update\ndata: ${JSON.stringify(status)}\n\n`
it('should be called', () => {
const spy = jest.fn()
parser.once('update', spy)
parser.parse(message)
expect(spy).toHaveBeenCalledWith(status)
})
})
describe('event is notification', () => {
const message = `event: notification\ndata: ${JSON.stringify(notification)}\n\n`
it('should be called', () => {
const spy = jest.fn()
parser.once('notification', spy)
parser.parse(message)
expect(spy).toHaveBeenCalledWith(notification)
})
})
describe('event is conversation', () => {
const message = `event: conversation\ndata: ${JSON.stringify(conversation)}\n\n`
it('should be called', () => {
const spy = jest.fn()
parser.once('conversation', spy)
parser.parse(message)
expect(spy).toHaveBeenCalledWith(conversation)
})
})
})
})
})