119 lines
2.9 KiB
TypeScript
119 lines
2.9 KiB
TypeScript
import {
|
|
LikelyType,
|
|
getLinkMeta,
|
|
getLikelyType,
|
|
} from '../../src/lib/link-meta/link-meta'
|
|
import {exampleComHtml} from './__mocks__/exampleComHtml'
|
|
import AtpAgent from '@atproto/api'
|
|
import {DEFAULT_SERVICE, RootStoreModel} from '../../src/state'
|
|
|
|
describe('getLinkMeta', () => {
|
|
let rootStore: RootStoreModel
|
|
|
|
beforeEach(() => {
|
|
rootStore = new RootStoreModel(new AtpAgent({service: DEFAULT_SERVICE}))
|
|
})
|
|
|
|
const inputs = [
|
|
'',
|
|
'httpbadurl',
|
|
'https://example.com',
|
|
'https://example.com/index.html',
|
|
'https://example.com/image.png',
|
|
'https://example.com/video.avi',
|
|
'https://example.com/audio.ogg',
|
|
'https://example.com/text.txt',
|
|
'https://example.com/javascript.js',
|
|
'https://bsky.app/',
|
|
'https://bsky.app/index.html',
|
|
]
|
|
const outputs = [
|
|
{
|
|
error: 'Invalid URL',
|
|
likelyType: LikelyType.Other,
|
|
url: '',
|
|
},
|
|
{
|
|
error: 'Invalid URL',
|
|
likelyType: LikelyType.Other,
|
|
url: 'httpbadurl',
|
|
},
|
|
{
|
|
likelyType: LikelyType.HTML,
|
|
url: 'https://example.com',
|
|
title: 'Example Domain',
|
|
description: 'An example website',
|
|
},
|
|
{
|
|
likelyType: LikelyType.HTML,
|
|
url: 'https://example.com/index.html',
|
|
title: 'Example Domain',
|
|
description: 'An example website',
|
|
},
|
|
{
|
|
likelyType: LikelyType.Image,
|
|
url: 'https://example.com/image.png',
|
|
},
|
|
{
|
|
likelyType: LikelyType.Video,
|
|
url: 'https://example.com/video.avi',
|
|
},
|
|
{
|
|
likelyType: LikelyType.Audio,
|
|
url: 'https://example.com/audio.ogg',
|
|
},
|
|
{
|
|
likelyType: LikelyType.Text,
|
|
url: 'https://example.com/text.txt',
|
|
},
|
|
{
|
|
likelyType: LikelyType.Other,
|
|
url: 'https://example.com/javascript.js',
|
|
},
|
|
{
|
|
likelyType: LikelyType.AtpData,
|
|
url: '/',
|
|
title: 'Bluesky',
|
|
description: 'A new kind of social network',
|
|
},
|
|
{
|
|
likelyType: LikelyType.AtpData,
|
|
url: '/index.html',
|
|
title: 'Not found',
|
|
},
|
|
{
|
|
likelyType: LikelyType.Other,
|
|
url: '',
|
|
title: '',
|
|
},
|
|
]
|
|
it('correctly handles a set of text inputs', async () => {
|
|
for (let i = 0; i < inputs.length; i++) {
|
|
global.fetch = jest.fn().mockImplementationOnce(() => {
|
|
return new Promise((resolve, _reject) => {
|
|
resolve({
|
|
ok: true,
|
|
status: 200,
|
|
text: () => exampleComHtml,
|
|
})
|
|
})
|
|
})
|
|
const input = inputs[i]
|
|
const output = await getLinkMeta(rootStore, input)
|
|
expect(output).toEqual(outputs[i])
|
|
}
|
|
})
|
|
})
|
|
|
|
describe('getLikelyType', () => {
|
|
it('correctly handles non-parsed url', async () => {
|
|
const output = await getLikelyType('https://example.com')
|
|
expect(output).toEqual(LikelyType.HTML)
|
|
})
|
|
|
|
it('handles non-string urls without crashing', async () => {
|
|
const output = await getLikelyType('123')
|
|
expect(output).toEqual(LikelyType.Other)
|
|
})
|
|
})
|