mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-10-30 04:54:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			218 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import MastodonEntity from '@/mastodon/entity'
 | |
| import MastodonNotificationType from '@/mastodon/notification'
 | |
| import Mastodon from '@/mastodon'
 | |
| import MegalodonNotificationType from '@/notification'
 | |
| import axios, { AxiosResponse, InternalAxiosRequestConfig, AxiosHeaders } from 'axios'
 | |
| 
 | |
| jest.mock('axios')
 | |
| 
 | |
| const account: MastodonEntity.Account = {
 | |
|   id: '1',
 | |
|   username: 'h3poteto',
 | |
|   acct: 'h3poteto@pleroma.io',
 | |
|   display_name: 'h3poteto',
 | |
|   locked: false,
 | |
|   group: false,
 | |
|   noindex: false,
 | |
|   suspended: false,
 | |
|   limited: false,
 | |
|   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,
 | |
|   source: {
 | |
|     privacy: null,
 | |
|     sensitive: false,
 | |
|     language: null,
 | |
|     note: 'test',
 | |
|     fields: []
 | |
|   }
 | |
| }
 | |
| 
 | |
| const status: MastodonEntity.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',
 | |
|   created_at: '2019-03-26T21:40:32',
 | |
|   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 MastodonEntity.Application,
 | |
|   language: null,
 | |
|   pinned: null,
 | |
|   bookmarked: false
 | |
| }
 | |
| 
 | |
| const follow: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '1',
 | |
|   type: MastodonNotificationType.Follow
 | |
| }
 | |
| 
 | |
| const favourite: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '2',
 | |
|   status: status,
 | |
|   type: MastodonNotificationType.Favourite
 | |
| }
 | |
| 
 | |
| const mention: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '3',
 | |
|   status: status,
 | |
|   type: MastodonNotificationType.Mention
 | |
| }
 | |
| 
 | |
| const reblog: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '4',
 | |
|   status: status,
 | |
|   type: MastodonNotificationType.Reblog
 | |
| }
 | |
| 
 | |
| const poll: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '5',
 | |
|   type: MastodonNotificationType.Poll
 | |
| }
 | |
| 
 | |
| const followRequest: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '6',
 | |
|   type: MastodonNotificationType.FollowRequest
 | |
| }
 | |
| 
 | |
| const toot: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '7',
 | |
|   status: status,
 | |
|   type: MastodonNotificationType.Status
 | |
| }
 | |
| 
 | |
| const unknownEvent: MastodonEntity.Notification = {
 | |
|   account: account,
 | |
|   created_at: '2021-01-31T23:33:26',
 | |
|   id: '8',
 | |
|   type: 'unknown'
 | |
| }
 | |
| 
 | |
| ;(axios.CancelToken.source as any).mockImplementation(() => {
 | |
|   return {
 | |
|     token: {
 | |
|       throwIfRequested: () => {},
 | |
|       promise: {
 | |
|         then: () => {},
 | |
|         catch: () => {}
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| })
 | |
| 
 | |
| describe('getNotifications', () => {
 | |
|   const client = new Mastodon('http://localhost', 'sample token')
 | |
|   const cases: Array<{ event: MastodonEntity.Notification; expected: Entity.NotificationType; title: string }> = [
 | |
|     {
 | |
|       event: follow,
 | |
|       expected: MegalodonNotificationType.Follow,
 | |
|       title: 'follow'
 | |
|     },
 | |
|     {
 | |
|       event: favourite,
 | |
|       expected: MegalodonNotificationType.Favourite,
 | |
|       title: 'favourite'
 | |
|     },
 | |
|     {
 | |
|       event: mention,
 | |
|       expected: MegalodonNotificationType.Mention,
 | |
|       title: 'mention'
 | |
|     },
 | |
|     {
 | |
|       event: reblog,
 | |
|       expected: MegalodonNotificationType.Reblog,
 | |
|       title: 'reblog'
 | |
|     },
 | |
|     {
 | |
|       event: poll,
 | |
|       expected: MegalodonNotificationType.PollExpired,
 | |
|       title: 'poll'
 | |
|     },
 | |
|     {
 | |
|       event: followRequest,
 | |
|       expected: MegalodonNotificationType.FollowRequest,
 | |
|       title: 'followRequest'
 | |
|     },
 | |
|     {
 | |
|       event: toot,
 | |
|       expected: MegalodonNotificationType.Status,
 | |
|       title: 'status'
 | |
|     }
 | |
|   ]
 | |
|   cases.forEach(c => {
 | |
|     it(`should be ${c.title} event`, async () => {
 | |
|       const config: InternalAxiosRequestConfig<any> = {
 | |
|         headers: new AxiosHeaders()
 | |
|       }
 | |
|       const mockResponse: AxiosResponse<Array<MastodonEntity.Notification>> = {
 | |
|         data: [c.event],
 | |
|         status: 200,
 | |
|         statusText: '200OK',
 | |
|         headers: {},
 | |
|         config: config
 | |
|       }
 | |
|       ;(axios.get as any).mockResolvedValue(mockResponse)
 | |
|       const res = await client.getNotifications()
 | |
|       expect(res.data[0].type).toEqual(c.expected)
 | |
|     })
 | |
|   })
 | |
|   it('UnknownEvent should be ignored', async () => {
 | |
|     const config: InternalAxiosRequestConfig<any> = {
 | |
|       headers: new AxiosHeaders()
 | |
|     }
 | |
|     const mockResponse: AxiosResponse<Array<MastodonEntity.Notification>> = {
 | |
|       data: [unknownEvent],
 | |
|       status: 200,
 | |
|       statusText: '200OK',
 | |
|       headers: {},
 | |
|       config: config
 | |
|     }
 | |
|     ;(axios.get as any).mockResolvedValue(mockResponse)
 | |
|     const res = await client.getNotifications()
 | |
|     expect(res.data).toEqual([])
 | |
|   })
 | |
| })
 |