1177 lines
56 KiB
TypeScript
1177 lines
56 KiB
TypeScript
import { social } from '@crawlee/utils';
|
|
|
|
const {
|
|
EMAIL_REGEX,
|
|
EMAIL_REGEX_GLOBAL,
|
|
FACEBOOK_REGEX,
|
|
FACEBOOK_REGEX_GLOBAL,
|
|
INSTAGRAM_REGEX,
|
|
INSTAGRAM_REGEX_GLOBAL,
|
|
LINKEDIN_REGEX,
|
|
LINKEDIN_REGEX_GLOBAL,
|
|
TWITTER_REGEX,
|
|
TWITTER_REGEX_GLOBAL,
|
|
YOUTUBE_REGEX,
|
|
YOUTUBE_REGEX_GLOBAL,
|
|
TIKTOK_REGEX,
|
|
TIKTOK_REGEX_GLOBAL,
|
|
PINTEREST_REGEX,
|
|
PINTEREST_REGEX_GLOBAL,
|
|
DISCORD_REGEX,
|
|
DISCORD_REGEX_GLOBAL,
|
|
emailsFromText,
|
|
emailsFromUrls,
|
|
parseHandlesFromHtml,
|
|
phonesFromText,
|
|
phonesFromUrls,
|
|
} = social;
|
|
|
|
describe('utils.social', () => {
|
|
describe('emailsFromText()', () => {
|
|
const testEmailsFromText = (text: string, phones: string[]) => {
|
|
expect(emailsFromText(text)).toEqual(phones);
|
|
};
|
|
|
|
test('works with arg with no emails or invalid', () => {
|
|
// @ts-expect-error invalid input type
|
|
expect(emailsFromText()).toEqual([]);
|
|
testEmailsFromText('', []);
|
|
// @ts-expect-error invalid input type
|
|
testEmailsFromText(null, []);
|
|
// @ts-expect-error invalid input type
|
|
testEmailsFromText(undefined, []);
|
|
// @ts-expect-error invalid input type
|
|
testEmailsFromText({}, []);
|
|
testEmailsFromText(' ', []);
|
|
testEmailsFromText(' \n\n\r\t\n ', []);
|
|
});
|
|
|
|
test('extracts emails correctly', () => {
|
|
testEmailsFromText(' info@example.com ', ['info@example.com']);
|
|
|
|
testEmailsFromText(
|
|
`
|
|
info@example.com
|
|
info+something@example.NET
|
|
john.bob.dole@some-domain.co.uk
|
|
`,
|
|
['info@example.com', 'info+something@example.NET', 'john.bob.dole@some-domain.co.uk'],
|
|
);
|
|
|
|
testEmailsFromText(
|
|
`
|
|
this'is'also'valid'email@EXAMPLE.travel
|
|
easy-address@some-domain.co.uk \n\n
|
|
easy-address@some-domain.co.uk
|
|
not @ an.email.com
|
|
@also.not.an.email
|
|
`,
|
|
[
|
|
"this'is'also'valid'email@EXAMPLE.travel",
|
|
'easy-address@some-domain.co.uk',
|
|
'easy-address@some-domain.co.uk',
|
|
],
|
|
);
|
|
|
|
testEmailsFromText(' some.super.long.email.address@some.super.long.domain.name.co.br ', [
|
|
'some.super.long.email.address@some.super.long.domain.name.co.br',
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('emailsFromUrls()', () => {
|
|
test('throws on invalid arg', () => {
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
emailsFromUrls();
|
|
}).toThrowError(/must be an array/);
|
|
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
emailsFromUrls({});
|
|
}).toThrowError(/must be an array/);
|
|
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
emailsFromUrls('fwefwef');
|
|
}).toThrowError(/must be an array/);
|
|
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
emailsFromUrls(12345);
|
|
}).toThrowError(/must be an array/);
|
|
});
|
|
|
|
test('extracts emails correctly', () => {
|
|
expect(emailsFromUrls([])).toEqual([]);
|
|
// @ts-expect-error invalid input type
|
|
expect(emailsFromUrls([1, 2, {}, 'fwef', null, undefined])).toEqual([]);
|
|
|
|
expect(emailsFromUrls(['mailto:info@example.com'])).toEqual(['info@example.com']);
|
|
|
|
expect(
|
|
emailsFromUrls([
|
|
'http://www.example.com',
|
|
'mailto:info@example.com',
|
|
'mailto:info@example.com',
|
|
'email.without.mailto.prefix@example.com',
|
|
'',
|
|
'\n\n\n',
|
|
]),
|
|
).toEqual(['info@example.com', 'info@example.com']);
|
|
|
|
expect(
|
|
emailsFromUrls([
|
|
'http://www.example.com',
|
|
'mailto:info@example.com',
|
|
'mailto:info@example.com',
|
|
'email.without.mailto.prefix@example.com',
|
|
'',
|
|
'\n\n\n',
|
|
]),
|
|
).toEqual(['info@example.com', 'info@example.com']);
|
|
});
|
|
});
|
|
|
|
describe('phonesFromText()', () => {
|
|
const testPhonesFromText = (text: string, phones: string[]) => {
|
|
expect(phonesFromText(text)).toEqual(phones);
|
|
};
|
|
|
|
test('works with arg with no phones or invalid', () => {
|
|
// @ts-expect-error invalid input type
|
|
expect(phonesFromText()).toEqual([]);
|
|
|
|
testPhonesFromText('', []);
|
|
// @ts-expect-error invalid input type
|
|
testPhonesFromText(null, []);
|
|
// @ts-expect-error invalid input type
|
|
testPhonesFromText(undefined, []);
|
|
// @ts-expect-error
|
|
testPhonesFromText({}, []);
|
|
testPhonesFromText(' ', []);
|
|
testPhonesFromText(' \n\n\r\t\n ', []);
|
|
});
|
|
|
|
test('extracts phones correctly', () => {
|
|
testPhonesFromText(
|
|
`
|
|
+420775123456 +420775123456
|
|
|
|
+420 775 123 456
|
|
|
|
775123456 775123456 \n\n
|
|
00420775123456
|
|
1234567 1234567890
|
|
+44 7911 123456
|
|
`,
|
|
[
|
|
'+420775123456',
|
|
'+420775123456',
|
|
'+420 775 123 456',
|
|
'775123456',
|
|
'775123456',
|
|
'00420775123456',
|
|
'1234567',
|
|
'1234567890',
|
|
'+44 7911 123456',
|
|
],
|
|
);
|
|
|
|
testPhonesFromText(
|
|
`
|
|
413-577-1234
|
|
00413-577-1234
|
|
981-413-777-8888
|
|
413.233.2343 +413.233.2343 or 413 233 2343
|
|
562-3113
|
|
123456789 401 311 7898 123456789
|
|
`,
|
|
[
|
|
'413-577-1234',
|
|
'00413-577-1234',
|
|
'981-413-777-8888',
|
|
'413.233.2343',
|
|
'+413.233.2343',
|
|
'413 233 2343',
|
|
'562-3113',
|
|
'123456789',
|
|
'401 311 7898',
|
|
'123456789',
|
|
],
|
|
);
|
|
|
|
testPhonesFromText(
|
|
`
|
|
1 (413) 555-2378
|
|
+1 (413) 555-2378
|
|
1(413)555-2378
|
|
001 (413) 555-2378 1 (413) 555 2378
|
|
1(413)555-2378 or 1(413)555.2378 or 1 (413) 555-2378 or 1 (413) 555 2378 or (303) 494-2320
|
|
`,
|
|
[
|
|
'1 (413) 555-2378',
|
|
'+1 (413) 555-2378',
|
|
'1(413)555-2378',
|
|
'001 (413) 555-2378',
|
|
'1 (413) 555 2378',
|
|
'1(413)555-2378',
|
|
'1(413)555.2378',
|
|
'1 (413) 555-2378',
|
|
'1 (413) 555 2378',
|
|
'(303) 494-2320',
|
|
],
|
|
);
|
|
|
|
testPhonesFromText(
|
|
`
|
|
123-456-789
|
|
123 456 789
|
|
123.456.789
|
|
123.456.789.123
|
|
+123.456.789.123
|
|
`,
|
|
['123-456-789', '123 456 789', '123.456.789', '123.456.789.123', '+123.456.789.123'],
|
|
);
|
|
|
|
testPhonesFromText(
|
|
`
|
|
(000)000-0000
|
|
(000)000 0000
|
|
(000)000.0000
|
|
(000) 000-0000
|
|
(000) 000 0000
|
|
(000) 000.0000
|
|
`,
|
|
[
|
|
'(000)000-0000',
|
|
'(000)000 0000',
|
|
'(000)000.0000',
|
|
'(000) 000-0000',
|
|
'(000) 000 0000',
|
|
'(000) 000.0000',
|
|
],
|
|
);
|
|
|
|
testPhonesFromText(
|
|
`
|
|
000-0000
|
|
000 0000
|
|
000.0000
|
|
|
|
0000000
|
|
0000000000
|
|
(000)0000000
|
|
`,
|
|
['000-0000', '000 0000', '000.0000', '0000000', '0000000000', '(000)0000000'],
|
|
);
|
|
});
|
|
|
|
test('skips invalid phones', () => {
|
|
testPhonesFromText(
|
|
`
|
|
2018-10-11 123
|
|
456789 345
|
|
1 2 3 4 5 6 7 8
|
|
`,
|
|
[],
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('phonesFromUrls()', () => {
|
|
test('throws on invalid arg', () => {
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
phonesFromUrls();
|
|
}).toThrowError(/must be an array/);
|
|
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
phonesFromUrls({});
|
|
}).toThrowError(/must be an array/);
|
|
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
phonesFromUrls('fwefwef');
|
|
}).toThrowError(/must be an array/);
|
|
|
|
expect(() => {
|
|
// @ts-expect-error invalid input type
|
|
phonesFromUrls(12345);
|
|
}).toThrowError(/must be an array/);
|
|
});
|
|
|
|
test('extracts phones correctly', () => {
|
|
expect(phonesFromUrls([])).toEqual([]);
|
|
// @ts-expect-error invalid input type
|
|
expect(phonesFromUrls([1, 2, {}, 'fwef', null, undefined])).toEqual([]);
|
|
|
|
expect(
|
|
phonesFromUrls([
|
|
'tel:12345678',
|
|
'tel:/22345678', //
|
|
'tel://32345678',
|
|
'PHONE:42345678', //
|
|
'phone:/52345678',
|
|
'phone://62345678',
|
|
'telephone:72345678',
|
|
'telephone:/82345678',
|
|
'telephone://92345678',
|
|
'callto:97345678',
|
|
'CALLTO:/+98345678',
|
|
'callto://9992345678',
|
|
]),
|
|
).toEqual([
|
|
'12345678',
|
|
'22345678',
|
|
'32345678',
|
|
'42345678',
|
|
'52345678',
|
|
'62345678',
|
|
'72345678',
|
|
'82345678',
|
|
'92345678',
|
|
'97345678',
|
|
'+98345678',
|
|
'9992345678',
|
|
]);
|
|
|
|
expect(
|
|
phonesFromUrls([
|
|
'https://www.example.com',
|
|
'ftp://www.example.com',
|
|
'1234567',
|
|
'+42055555567',
|
|
'tel://+42012345678',
|
|
'tel://+420.123.456',
|
|
'http://www.example.com',
|
|
]),
|
|
).toEqual(['+42012345678', '+420.123.456']);
|
|
});
|
|
});
|
|
|
|
describe('parseHandlesFromHtml()', () => {
|
|
const EMPTY_RESULT: social.SocialHandles = {
|
|
emails: [],
|
|
phones: [],
|
|
phonesUncertain: [],
|
|
linkedIns: [],
|
|
twitters: [],
|
|
instagrams: [],
|
|
facebooks: [],
|
|
youtubes: [],
|
|
tiktoks: [],
|
|
pinterests: [],
|
|
discords: [],
|
|
};
|
|
|
|
test('handles invalid arg', () => {
|
|
// @ts-expect-error invalid input type
|
|
expect(parseHandlesFromHtml()).toEqual(EMPTY_RESULT);
|
|
// @ts-expect-error invalid input type
|
|
expect(parseHandlesFromHtml(undefined)).toEqual(EMPTY_RESULT);
|
|
// @ts-expect-error invalid input type
|
|
expect(parseHandlesFromHtml(null)).toEqual(EMPTY_RESULT);
|
|
// @ts-expect-error invalid input type
|
|
expect(parseHandlesFromHtml({})).toEqual(EMPTY_RESULT);
|
|
// @ts-expect-error invalid input type
|
|
expect(parseHandlesFromHtml(1234)).toEqual(EMPTY_RESULT);
|
|
});
|
|
|
|
test('works', () => {
|
|
expect(parseHandlesFromHtml('')).toEqual(EMPTY_RESULT);
|
|
expect(parseHandlesFromHtml(' ')).toEqual(EMPTY_RESULT);
|
|
const html =
|
|
'use the data in this [YouTube Video](https://www.youtube.com/watch?v=BsidLZKdYWQ).\\n\\n## Sample result\\n' +
|
|
'use the data in this [YouTube Video](https://www.youtube.com/watch?v=BsidLZKd123).\\\\n\\\\n## Sample result\\\\n';
|
|
expect(parseHandlesFromHtml(html)).toMatchObject({
|
|
youtubes: [
|
|
'https://www.youtube.com/watch?v=BsidLZKd123',
|
|
'https://www.youtube.com/watch?v=BsidLZKdYWQ',
|
|
],
|
|
});
|
|
|
|
expect(
|
|
parseHandlesFromHtml(`
|
|
<html>
|
|
<head>
|
|
<title>Bla</title>
|
|
</head>
|
|
<a>
|
|
<p>bob@example.com</p>
|
|
bob@example.com testing skipping duplicates xxx@blabla
|
|
<p>carl@example.com</p>
|
|
<a href="mailto:alice@example.com"></a>
|
|
<a href="mailto:david@example.com"></a>
|
|
|
|
<a href="skip.this.one@gmail.com"></a>
|
|
<img src="http://somewhere.com/ skip.this.one.too@gmail.com " />
|
|
<a href="http://somewhere.com/ skip.this.one.too@gmail.com "></a>
|
|
|
|
+420775222222
|
|
+4207751111111
|
|
+4207751111111 test duplicate
|
|
1 2 3 4 5 6 7 8 9 0
|
|
<a href="skip.this.one: +42099999999"></a>
|
|
<a href="tel://+42077533333"></a>
|
|
|
|
https://www.linkedin.com/in/bobnewman
|
|
https://www.linkedin.com/in/alicenewman/
|
|
https://www.linkedin.com/in/alicenewman/ duplicate
|
|
http://www.linkedin.com/in/nohttps/
|
|
https://cz.linkedin.com/in/somecountry
|
|
https://www.linkedin.com/in/carl-newman/ignored-sub-link
|
|
https://www.linkedin.com/in/first-last-123456a
|
|
<a href="https://www.linkedin.com/in/jancurn">Profile</a>
|
|
<a href="https://www.linkedin.com/in/carl-newman-5555555a/detail/recent-activity/">Sub-link</a>
|
|
<a href="www.linkedin.com/company/delegatus">Company</a>
|
|
|
|
https://www.instagram.com/old_prague/
|
|
https://www.instagram.com/old_prague/ duplicate
|
|
instagram.com/old_prague
|
|
https://www.instagram.com/newyorkarea/
|
|
<a href="https://www.instagram.com/york">link</a>
|
|
<a href="https://www.instagram.com/york2/something">sub-link</a>
|
|
|
|
<a href="twitter.com/betasomething">link</a>
|
|
https://www.twitter.com/apify
|
|
https://www.twitter.com/apify duplicate
|
|
<a href="twitter.com/cblabla/sub-dir/">link</a>
|
|
<a href="x.com/apify">link</a>
|
|
<a href="x.com/cblabla/sub-dir/">link</a>
|
|
|
|
<a href="facebook.com/carl.username123/sub-dir/">link</a>
|
|
https://www.facebook.com/bob.username123/
|
|
https://www.facebook.com/bob.username123/ duplicate
|
|
http://www.facebook.com/alice.username123
|
|
<a href="https://www.facebook.com/profile.php?id=1155802082&xxx=5">link x</a>
|
|
<a href="https://youtu.be/kM7YfhfkiEE">Youtube</a>
|
|
<a href="https://youtube.com/@channel">Youtube Channel</a>
|
|
<a href="fb.com/dada5678?query=1">link</a>
|
|
<a href="https://www.facebook.com/pages/category/category-name/page-name-and-ID/">link</a>
|
|
<a href="fb.com/pages/page-name/142434434>link</a>
|
|
|
|
https://www.tiktok.com/trending?shareId=1234567890123456789/
|
|
m.tiktok.com/v/1234567890123456789
|
|
<a href="https://tiktok.com/@jack1234">Profile</a>
|
|
<a href="https://www.tiktok.com/@username/video/1234567890123456789">Most popular video</a>
|
|
<a href="https://www.tiktok.com/embed/1234567890123456789/"Embed video</a>
|
|
m.tiktok.com/v/1234567890123456789 duplicate
|
|
<a href="https://www.pinterest.com/jack">Profile</a>
|
|
<a href="https://pinterest.com/pin/10084556789">Top pin</a>
|
|
<a href="https://uk.pinterest.com/user/board/">My board</a>
|
|
pinterest.com/my_username
|
|
<a href="https://pinterest.com/pin/10084556789">My favourite pin</a> duplicate
|
|
<a href="https://discord.com/invite/jyEM2PRvMU/">Join us on Discord</a>
|
|
<a href="discord.gg/discord-developers">Join our Discord community</a>
|
|
<div>+4207751111111<a href="mailto:eva@example.com">eva@example.com</a></div>
|
|
</body>
|
|
</html>
|
|
`),
|
|
).toEqual({
|
|
discords: ['discord.gg/discord-developers', 'https://discord.com/invite/jyEM2PRvMU/'],
|
|
emails: [
|
|
'alice@example.com',
|
|
'bob@example.com',
|
|
'carl@example.com',
|
|
'david@example.com',
|
|
'eva@example.com',
|
|
],
|
|
phones: ['+42077533333'],
|
|
phonesUncertain: [
|
|
'+4207751111111',
|
|
'+420775222222',
|
|
|
|
// tiktok videos have purely numeric ids so this can't be avoided
|
|
'123456789012345',
|
|
],
|
|
linkedIns: [
|
|
'http://www.linkedin.com/in/nohttps/',
|
|
'https://cz.linkedin.com/in/somecountry',
|
|
'https://www.linkedin.com/in/alicenewman/',
|
|
'https://www.linkedin.com/in/bobnewman',
|
|
'https://www.linkedin.com/in/carl-newman-5555555a/',
|
|
'https://www.linkedin.com/in/carl-newman/',
|
|
'https://www.linkedin.com/in/first-last-123456a',
|
|
'https://www.linkedin.com/in/jancurn',
|
|
'www.linkedin.com/company/delegatus',
|
|
],
|
|
instagrams: [
|
|
'https://www.instagram.com/newyorkarea/',
|
|
'https://www.instagram.com/old_prague/',
|
|
'https://www.instagram.com/york',
|
|
'https://www.instagram.com/york2/',
|
|
'instagram.com/old_prague',
|
|
],
|
|
pinterests: [
|
|
'https://pinterest.com/pin/10084556789',
|
|
'https://uk.pinterest.com/user/board/',
|
|
'https://www.pinterest.com/jack',
|
|
'pinterest.com/my_username',
|
|
],
|
|
tiktoks: [
|
|
'https://tiktok.com/@jack1234',
|
|
'https://www.tiktok.com/@username/video/1234567890123456789',
|
|
'https://www.tiktok.com/embed/1234567890123456789/',
|
|
'https://www.tiktok.com/trending?shareId=1234567890123456789/',
|
|
'm.tiktok.com/v/1234567890123456789',
|
|
],
|
|
twitters: [
|
|
'https://www.twitter.com/apify',
|
|
'twitter.com/betasomething',
|
|
'twitter.com/cblabla/',
|
|
'x.com/apify',
|
|
'x.com/cblabla/',
|
|
],
|
|
facebooks: [
|
|
'facebook.com/carl.username123/',
|
|
'fb.com/dada5678',
|
|
'fb.com/pages/page-name/142434434',
|
|
'http://www.facebook.com/alice.username123',
|
|
'https://www.facebook.com/bob.username123/',
|
|
'https://www.facebook.com/pages/category/category-name/page-name-and-ID/',
|
|
'https://www.facebook.com/profile.php?id=1155802082',
|
|
],
|
|
youtubes: ['https://youtu.be/kM7YfhfkiEE', 'https://youtube.com/@channel'],
|
|
});
|
|
});
|
|
|
|
test('data is set correctly', () => {
|
|
const data = {} as any;
|
|
parseHandlesFromHtml(
|
|
`
|
|
<html>
|
|
<head>
|
|
<title>Bla</title>
|
|
</head>
|
|
<body>
|
|
Body content
|
|
</body>
|
|
</html>
|
|
`,
|
|
data,
|
|
);
|
|
|
|
expect(data.$('body').text().trim()).toBe('Body content');
|
|
expect(data.text.trim()).toBe('Body content');
|
|
});
|
|
});
|
|
|
|
describe('EMAIL_REGEX', () => {
|
|
test('works', () => {
|
|
expect(EMAIL_REGEX).toBeInstanceOf(RegExp);
|
|
expect(EMAIL_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(EMAIL_REGEX.flags).toBe('i');
|
|
expect(EMAIL_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(EMAIL_REGEX.test('bob@example.com')).toBe(true);
|
|
expect(EMAIL_REGEX.test('ALICE@EXAMPLE.COM')).toBe(true);
|
|
|
|
expect(EMAIL_REGEX.test('bob+something@example.co.uk')).toBe(true);
|
|
expect(EMAIL_REGEX.test('really.long.email.address@really.long.domain.name.travel')).toBe(true);
|
|
expect(EMAIL_REGEX.test('really-long-email-address@really.long.domain.name.travel')).toBe(true);
|
|
expect(EMAIL_REGEX.test('really_long_email_address@really.long.domain.name.travel')).toBe(true);
|
|
|
|
expect(EMAIL_REGEX.test('a alice@example.com')).toBe(false);
|
|
expect(EMAIL_REGEX.test('bob@example.com alice@example.com')).toBe(false);
|
|
expect(EMAIL_REGEX.test('')).toBe(false);
|
|
expect(EMAIL_REGEX.test('dummy')).toBe(false);
|
|
|
|
expect(EMAIL_REGEX_GLOBAL.test('bob@example.com')).toBe(true);
|
|
expect('bob@example.com alice@example.com'.match(EMAIL_REGEX_GLOBAL)).toEqual([
|
|
'bob@example.com',
|
|
'alice@example.com',
|
|
]);
|
|
|
|
expect(''.match(EMAIL_REGEX_GLOBAL)).toBe(null);
|
|
expect(' dummy '.match(EMAIL_REGEX_GLOBAL)).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('LINKEDIN_REGEX', () => {
|
|
test('works', () => {
|
|
expect(LINKEDIN_REGEX).toBeInstanceOf(RegExp);
|
|
expect(LINKEDIN_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(LINKEDIN_REGEX.flags).toBe('i');
|
|
expect(LINKEDIN_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/bobnewman')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/bobnewman/')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('http://www.linkedin.com/in/bobnewman')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('http://ie.linkedin.com/in/bobnewman')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('https://linkedin.com/in/bobnewman')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/carl-newman')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/first-last-123456a')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/first_last_1%23456a')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('HTTPS://WWW.LINKEDIN.COM/IN/CARL-NEWMAN')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('www.linkedin.com/in/bobnewman')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('linkedin.com/in/bobnewman')).toBe(true);
|
|
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/alan-turing')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('en.linkedin.com/in/alan-turing')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('linkedin.com/in/alan-turing')).toBe(true);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/company/delegatus')).toBe(true);
|
|
|
|
// Test there is just on matching group for the username
|
|
expect('https://www.linkedin.com/in/bobnewman/'.match(LINKEDIN_REGEX)![1]).toBe('bobnewman');
|
|
expect('http://www.linkedin.com/in/bobnewman'.match(LINKEDIN_REGEX)![1]).toBe('bobnewman');
|
|
expect('www.linkedin.com/in/bobnewman/'.match(LINKEDIN_REGEX)![1]).toBe('bobnewman');
|
|
expect('linkedin.com/in/bobnewman'.match(LINKEDIN_REGEX)![1]).toBe('bobnewman');
|
|
|
|
expect(LINKEDIN_REGEX.test('')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('dummy')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('a https://www.linkedin.com/in/bobnewman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('https://linkedin.com/in/bobnewman/sub-page')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('xhttps://www.linkedin.com/in/carl-newman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('0https://www.linkedin.com/in/carl-newman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('_https://www.linkedin.com/in/carl-newman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('xlinkedin.com/in/bobnewman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('_linkedin.com/in/bobnewman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('0linkedin.com/in/bobnewman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/bobnewman/?param=bla')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('://linkedin.com/in/bobnewman')).toBe(false);
|
|
expect(LINKEDIN_REGEX.test('https://www.linkedin.com/in/bob https://www.linkedin.com/in/alice')).toBe(
|
|
false,
|
|
);
|
|
|
|
expect(LINKEDIN_REGEX_GLOBAL.test('https://www.linkedin.com/in/bobnewman')).toBe(true);
|
|
expect(
|
|
`
|
|
https://www.linkedin.com/in/bobnewman
|
|
"http://ie.linkedin.com/in/alicenewman"
|
|
https://www.linkedin.com/in/someverylongnamesomeverylongnamesomeverylongnamesomeverylongnamesomeverylongnamesomeverylongname
|
|
linkedin.com/in/carlnewman
|
|
`.match(LINKEDIN_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://www.linkedin.com/in/bobnewman',
|
|
'http://ie.linkedin.com/in/alicenewman',
|
|
'linkedin.com/in/carlnewman',
|
|
]);
|
|
expect(
|
|
`
|
|
-https://www.linkedin.com/in/bobnewman/sub-dir
|
|
:http://ie.linkedin.com/in/alicenewman?param=1
|
|
xlinkedin.com/in/carlnewman
|
|
alinkedin.com/in/carlnewman
|
|
_linkedin.com/in/carlnewman
|
|
`.match(LINKEDIN_REGEX_GLOBAL),
|
|
).toEqual(['https://www.linkedin.com/in/bobnewman/', 'http://ie.linkedin.com/in/alicenewman']);
|
|
expect(''.match(LINKEDIN_REGEX_GLOBAL)).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('INSTAGRAM_REGEX', () => {
|
|
test('works', () => {
|
|
expect(INSTAGRAM_REGEX).toBeInstanceOf(RegExp);
|
|
expect(INSTAGRAM_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(INSTAGRAM_REGEX.flags).toBe('i');
|
|
expect(INSTAGRAM_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(INSTAGRAM_REGEX.test('https://www.instagram.com/old_prague')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('https://www.instagram.com/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('http://www.instagram.com/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('https://instagram.com/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('HTTPS://INSTAGR.AM/OLD_PRAGUE/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('http://instagr.am/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('https://www.instagr.am/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('www.instagram.com/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('instagram.com/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('www.instagr.am/old_prague/')).toBe(true);
|
|
expect(INSTAGRAM_REGEX.test('instagr.am/old_prague/')).toBe(true);
|
|
|
|
// Test there is just on matching group for the username
|
|
expect('https://www.instagram.com/old_prague/'.match(INSTAGRAM_REGEX)![1]).toBe('old_prague');
|
|
expect('http://www.instagram.com/old_prague/'.match(INSTAGRAM_REGEX)![1]).toBe('old_prague');
|
|
expect('www.instagram.com/old_prague'.match(INSTAGRAM_REGEX)![1]).toBe('old_prague');
|
|
expect('instagram.com/old_prague'.match(INSTAGRAM_REGEX)![1]).toBe('old_prague');
|
|
|
|
expect(INSTAGRAM_REGEX.test('')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('dummy')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('a https://www.instagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('https://www.instagram.com/a')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('https://www.instagram.com/old_prague/sub-page')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('xhttps://www.instagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('0https://www.instagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('_https://www.instagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('xinstagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('_instagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('0instagram.com/old_prague')).toBe(false);
|
|
expect(social.INSTAGRAM_REGEX.test('https://www.instagram.com/explore/')).toBe(false);
|
|
expect(social.INSTAGRAM_REGEX.test('https://www.instagram.com/_n/')).toBe(false);
|
|
expect(social.INSTAGRAM_REGEX.test('https://www.instagram.com/_u/')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('https://www.instagram.com/old_prague/?param=bla')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('://www.instagram.com/old_prague')).toBe(false);
|
|
expect(INSTAGRAM_REGEX.test('http://www.instagram.com/old_prague http://www.instagram.com/old_brno')).toBe(
|
|
false,
|
|
);
|
|
|
|
expect(INSTAGRAM_REGEX_GLOBAL.test('https://www.instagram.com/old_prague')).toBe(true);
|
|
expect(
|
|
`
|
|
https://www.instagram.com/old_prague
|
|
https://www.instagram.com/someverylongusernamethatisnotgood
|
|
"instagram.com/old_brno"
|
|
http://instagr.am/old_plzen
|
|
`.match(INSTAGRAM_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://www.instagram.com/old_prague',
|
|
'instagram.com/old_brno',
|
|
'http://instagr.am/old_plzen',
|
|
]);
|
|
expect(
|
|
`
|
|
-https://www.instagram.com/old_prague/sub-dir
|
|
instagr.am/old_plzen?param=1
|
|
xinstagram.com/old_brno
|
|
ainstagram.com/old_brno
|
|
_instagram.com/old_brno
|
|
`.match(INSTAGRAM_REGEX_GLOBAL),
|
|
).toEqual(['https://www.instagram.com/old_prague/', 'instagr.am/old_plzen']);
|
|
expect(''.match(INSTAGRAM_REGEX_GLOBAL)).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('TWITTER_REGEX', () => {
|
|
test('works', () => {
|
|
expect(TWITTER_REGEX).toBeInstanceOf(RegExp);
|
|
expect(TWITTER_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(TWITTER_REGEX.flags).toBe('i');
|
|
expect(TWITTER_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/apify/')).toBe(true);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/aa_bb_123')).toBe(true);
|
|
expect(TWITTER_REGEX.test('http://www.twitter.com/apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('https://twitter.com/apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('http://twitter.com/apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('www.twitter.com/apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('twitter.com/apify')).toBe(true);
|
|
|
|
expect(TWITTER_REGEX.test('https://www.x.com/apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('https://www.x.com/@apify')).toBe(true);
|
|
expect(TWITTER_REGEX.test('https://www.x.com/aa_bb_123')).toBe(true);
|
|
expect(TWITTER_REGEX.test('x.com/apify')).toBe(true);
|
|
|
|
// Test there is just on matching group for the username
|
|
expect('https://www.twitter.com/apify/'.match(TWITTER_REGEX)![1]).toBe('apify');
|
|
expect('http://www.twitter.com/apify'.match(TWITTER_REGEX)![1]).toBe('apify');
|
|
expect('www.twitter.com/apify'.match(TWITTER_REGEX)![1]).toBe('apify');
|
|
expect('twitter.com/apify'.match(TWITTER_REGEX)![1]).toBe('apify');
|
|
|
|
expect('https://www.x.com/apify/'.match(TWITTER_REGEX)![1]).toBe('apify');
|
|
expect('http://www.x.com/@apify'.match(TWITTER_REGEX)![1]).toBe('apify');
|
|
|
|
expect(TWITTER_REGEX.test('')).toBe(false);
|
|
expect(TWITTER_REGEX.test('dummy')).toBe(false);
|
|
expect(TWITTER_REGEX.test('a https://www.twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/apify/sub-page')).toBe(false);
|
|
expect(TWITTER_REGEX.test('xhttps://www.twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('0https://www.twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('_https://www.twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('xtwitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('_twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('0twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/apify?param=bla')).toBe(false);
|
|
expect(TWITTER_REGEX.test('://www.twitter.com/apify')).toBe(false);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/apify https://www.twitter.com/jack')).toBe(false);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/oauth')).toBe(false);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/account')).toBe(false);
|
|
expect(TWITTER_REGEX.test('https://www.twitter.com/privacy/')).toBe(false);
|
|
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/i/flow/login')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://business.x.com/en')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/privacy')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://help.x.com/en/using-x/download-the-x-app')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://careers.x.com/en')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://developer.x.com/en')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/i/directory/profiles')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/settings/account/personalization')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/explore')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/i/premium_sign_up')).toBe(false);
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://x.com/compose/post')).toBe(false);
|
|
|
|
expect(TWITTER_REGEX_GLOBAL.test('https://www.twitter.com/apify')).toBe(true);
|
|
expect(
|
|
`
|
|
https://www.twitter.com/apify
|
|
www.twitter.com/jack/sub-dir
|
|
www.twitter.com/invalidverylongtwitterhandlenotgood
|
|
twitter.com/bob123?param=1
|
|
www.x.com/apify/sub-dir
|
|
`.match(TWITTER_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://www.twitter.com/apify',
|
|
'www.twitter.com/jack/',
|
|
'twitter.com/bob123',
|
|
'www.x.com/apify/',
|
|
]);
|
|
expect(
|
|
`
|
|
-https://www.twitter.com/apify
|
|
twitter.com/jack
|
|
twitter.com/carl123
|
|
xtwitter.com/bob
|
|
atwitter.com/bob
|
|
_twitter.com/bob
|
|
`.match(TWITTER_REGEX_GLOBAL),
|
|
).toEqual(['https://www.twitter.com/apify', 'twitter.com/jack', 'twitter.com/carl123']);
|
|
expect(''.match(TWITTER_REGEX_GLOBAL)).toBe(null);
|
|
});
|
|
});
|
|
|
|
describe('FACEBOOK_REGEX', () => {
|
|
test('works', () => {
|
|
expect(FACEBOOK_REGEX).toBeInstanceOf(RegExp);
|
|
expect(FACEBOOK_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(FACEBOOK_REGEX.flags).toBe('i');
|
|
expect(FACEBOOK_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/someusername')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/someusername/')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/some-username-1234')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/some-username-1234/')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('http://www.facebook.com/some.username123')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('www.facebook.com/someusername')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('facebook.com/someusername')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('https://www.fb.com/someusername')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('https://www.fb.com/someusername/')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('http://www.fb.com/some.username123')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('www.fb.com/someusername')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('fb.com/someusername')).toBe(true);
|
|
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/profile.php?id=1155802082')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('http://www.facebook.com/profile.php?id=1155802082')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('www.facebook.com/profile.php?id=1155802082')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('facebook.com/profile.php?id=1155802082')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('fb.com/profile.php?id=1155802082')).toBe(true);
|
|
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pageName')).toBe(true);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/KinEssor-Groupe-Conseil/208264345877578')).toBe(
|
|
true,
|
|
);
|
|
expect(
|
|
FACEBOOK_REGEX.test(
|
|
'https://www.facebook.com/pages/category/Lawyer---Law-Firm/Delegatus-services-juridiques-inc-131011223614905/',
|
|
),
|
|
).toBe(true);
|
|
|
|
// Test there is just on matching group for the username
|
|
expect('https://www.facebook.com/someusername/'.match(FACEBOOK_REGEX)![1]).toBe('someusername');
|
|
expect('https://www.facebook.com/someusername'.match(FACEBOOK_REGEX)![1]).toBe('someusername');
|
|
expect('https://www.facebook.com/profile.php?id=1155802082'.match(FACEBOOK_REGEX)![1]).toBe(
|
|
'profile.php?id=1155802082',
|
|
);
|
|
expect('fb.com/someusername'.match(FACEBOOK_REGEX)![1]).toBe('someusername');
|
|
expect('facebook.com/pages/KinEssor-Groupe-Conseil/208264345877578'.match(FACEBOOK_REGEX)![1]).toBe(
|
|
'pages/KinEssor-Groupe-Conseil/208264345877578',
|
|
);
|
|
|
|
expect(FACEBOOK_REGEX.test('')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('dummy')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('a https://www.facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/a')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/someusername/sub-page')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('http://www.facebook.com/profile.php')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('xhttps://www.facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('0https://www.facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('_https://www.facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('xfacebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('_facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('0facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/someusername?param=bla')).toBe(false);
|
|
|
|
expect(FACEBOOK_REGEX.test('://www.facebook.com/someusername')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/someusername https://www.facebook.com/jack')).toBe(
|
|
false,
|
|
);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/groups')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/events')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/policies/')).toBe(false);
|
|
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/?category=liked&ref=bookmarks')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/merge')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/search')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/create')).toBe(false);
|
|
expect(FACEBOOK_REGEX.test('https://www.facebook.com/pages/createCustomWebsiteName')).toBe(true);
|
|
|
|
expect(FACEBOOK_REGEX_GLOBAL.test('https://www.facebook.com/someusername')).toBe(true);
|
|
expect(
|
|
`
|
|
https://www.facebook.com/someusername?param=123
|
|
www.facebook.com/another123/sub-dir
|
|
www.facebook.com/pages/
|
|
facebook.com/pages/some-page
|
|
https://www.facebook.com/waytoolongusernamewaytoolongusernamewaytoolongusernamewaytoolongusernamewaytoolongusername
|
|
fb.com/bob123
|
|
`.match(FACEBOOK_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://www.facebook.com/someusername',
|
|
'www.facebook.com/another123/',
|
|
'facebook.com/pages/some-page',
|
|
'fb.com/bob123',
|
|
]);
|
|
expect(
|
|
`
|
|
-https://www.facebook.com/someusername/
|
|
facebook.com/jack4567
|
|
fb.com/carl123
|
|
xfacebook.com/bob
|
|
afacebook.com/bob
|
|
_facebook.com/bob
|
|
`.match(FACEBOOK_REGEX_GLOBAL),
|
|
).toEqual(['https://www.facebook.com/someusername/', 'facebook.com/jack4567', 'fb.com/carl123']);
|
|
expect(''.match(FACEBOOK_REGEX_GLOBAL)).toBe(null);
|
|
});
|
|
});
|
|
describe('YOUTUBE_REGEX', () => {
|
|
it('works', () => {
|
|
expect(YOUTUBE_REGEX).toBeInstanceOf(RegExp);
|
|
expect(YOUTUBE_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(YOUTUBE_REGEX.flags).toBe('i');
|
|
expect(YOUTUBE_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(''.match(social.YOUTUBE_REGEX_GLOBAL)).toBe(null);
|
|
expect(' dummy '.match(social.YOUTUBE_REGEX_GLOBAL)).toBe(null);
|
|
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/watch?v=kM7YfhfkiEE')).toBe(true);
|
|
expect(YOUTUBE_REGEX.test('https://youtu.be/kM7YfhfkiEE')).toBe(true);
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/c/TrapNation')).toBe(true);
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/channel/UCklie6BM0fhFvzWYqQVoCTA')).toBe(true);
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/user/pewdiepie')).toBe(true);
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/linkinpark')).toBe(true);
|
|
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/@LinkinPark')).toBe(true);
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/c/@TrapNation')).toBe(true);
|
|
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/user/@PewDiePie')).toBe(false);
|
|
expect(YOUTUBE_REGEX.test('https://www.youtube.com/channel/@TrapNation')).toBe(false);
|
|
expect(YOUTUBE_REGEX.test('https://youtu.be/@kM7YfhfkiEE')).toBe(false);
|
|
|
|
expect(YOUTUBE_REGEX.test('://www.youtube.com/c/TrapNation')).toBe(false);
|
|
expect(YOUTUBE_REGEX.test('https://youtu.be/kM7YfhfkiEE https://www.youtube.com/user/pewdiepie')).toBe(
|
|
false,
|
|
);
|
|
expect(YOUTUBE_REGEX.test('xyoutu.be/kM7YfhfkiEE')).toBe(false);
|
|
expect(YOUTUBE_REGEX.test('-https://www.youtube.com/user/pewdiepie')).toBe(false);
|
|
|
|
// Test there is just on matching group for the channel, video or username
|
|
expect('https://www.youtube.com/watch?v=kM7YfhfkiEE'.match(social.YOUTUBE_REGEX)![1]).toBe('kM7YfhfkiEE');
|
|
expect('https://youtu.be/kM7YfhfkiEE'.match(social.YOUTUBE_REGEX)![1]).toBe('kM7YfhfkiEE');
|
|
expect('https://www.youtube.com/c/TrapNation'.match(social.YOUTUBE_REGEX)![1]).toBe('TrapNation');
|
|
expect('https://www.youtube.com/channel/UCklie6BM0fhFvzWYqQVoCTA'.match(social.YOUTUBE_REGEX)![1]).toBe(
|
|
'UCklie6BM0fhFvzWYqQVoCTA',
|
|
);
|
|
expect('https://www.youtube.com/user/pewdiepie'.match(social.YOUTUBE_REGEX)![1]).toBe('pewdiepie');
|
|
|
|
expect(
|
|
`
|
|
https://www.youtube.com/apify/
|
|
-https://www.youtube.com/someusername/
|
|
youtube.com/jack4567
|
|
https://www.youtube.com/watch?v=kM7YfhfkiEE
|
|
byoutube.com/bob
|
|
ayoutube.com/bob
|
|
_youtube.com/bob
|
|
www.youtube.com/c/TrapNation
|
|
https://www.youtube.com/channel/UCklie6BM0fhFvzWYqQVoCTA
|
|
youtube.com/user/pewdiepie
|
|
www.youtube.com/@LinkinPark
|
|
youtube.com/linkinpark
|
|
`.match(YOUTUBE_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://www.youtube.com/apify',
|
|
'https://www.youtube.com/someusername',
|
|
'youtube.com/jack4567',
|
|
'https://www.youtube.com/watch?v=kM7YfhfkiEE',
|
|
'www.youtube.com/c/TrapNation',
|
|
'https://www.youtube.com/channel/UCklie6BM0fhFvzWYqQVoCTA',
|
|
'youtube.com/user/pewdiepie',
|
|
'www.youtube.com/@LinkinPark',
|
|
'youtube.com/linkinpark',
|
|
]);
|
|
});
|
|
});
|
|
describe('TIKTOK_REGEX', () => {
|
|
it('works', () => {
|
|
expect(TIKTOK_REGEX).toBeInstanceOf(RegExp);
|
|
expect(TIKTOK_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(TIKTOK_REGEX.flags).toBe('i');
|
|
expect(TIKTOK_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(''.match(TIKTOK_REGEX_GLOBAL)).toBe(null);
|
|
expect(' dummy '.match(TIKTOK_REGEX_GLOBAL)).toBe(null);
|
|
|
|
expect(TIKTOK_REGEX.test('https://www.tiktok.com/trending?shareId=123456789')).toBe(true);
|
|
expect(TIKTOK_REGEX.test('https://www.tiktok.com/embed/123456789')).toBe(true);
|
|
expect(TIKTOK_REGEX.test('https://m.tiktok.com/v/123456789')).toBe(true);
|
|
expect(TIKTOK_REGEX.test('https://www.tiktok.com/@user')).toBe(true);
|
|
expect(TIKTOK_REGEX.test('https://www.tiktok.com/@user/video/123456789')).toBe(true);
|
|
|
|
expect(TIKTOK_REGEX.test('_https://www.tiktok.com/trending?shareId=123456789')).toBe(false);
|
|
expect(TIKTOK_REGEX.test('xtiktok.com/embed/123456789/')).toBe(false);
|
|
expect(TIKTOK_REGEX.test('_pinterest.com/someusername')).toBe(false);
|
|
expect(TIKTOK_REGEX.test('0https://www.tiktok.com/trending?shareId=123456789')).toBe(false);
|
|
|
|
// Test there is just one matching group for video id or username
|
|
expect('https://www.tiktok.com/trending?shareId=123456789'.match(TIKTOK_REGEX)![1]).toBe(
|
|
'trending?shareId=123456789',
|
|
);
|
|
expect('www.tiktok.com/embed/123456789/'.match(TIKTOK_REGEX)![1]).toBe('embed/123456789');
|
|
expect('tiktok.com/@jack'.match(TIKTOK_REGEX)![1]).toBe('@jack');
|
|
expect('https://www.tiktok.com/@username/video/123456789'.match(TIKTOK_REGEX)![1]).toBe(
|
|
'@username/video/123456789',
|
|
);
|
|
|
|
expect(
|
|
`
|
|
https://www.tiktok.com/trending?shareId=123456789
|
|
www.tiktok.com/embed/123456789/
|
|
m.tiktok.com/v/123456789
|
|
tiktok.com/@user
|
|
https://www.tiktok.com/@username/video/123456789
|
|
-https://www.tiktok.com/@username/video/82347868
|
|
atiktok.com/embed/123456789/
|
|
_tiktok.com/embed/123456789/
|
|
www.tiktok.com/embed/nonNumericVideoId
|
|
https://www.tiktok.com/@jack1234/invalidSubpath/
|
|
https://www.tiktok.com/trending?shareId=1234567898904582904537057328079034789063454432789054378
|
|
https://www.tiktok.com/@userWithLongVideoName/video/123456789890458290453705732807903478904327890543654645365478
|
|
`.match(TIKTOK_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://www.tiktok.com/trending?shareId=123456789',
|
|
'www.tiktok.com/embed/123456789/',
|
|
'm.tiktok.com/v/123456789',
|
|
'tiktok.com/@user',
|
|
'https://www.tiktok.com/@username/video/123456789',
|
|
'https://www.tiktok.com/@username/video/82347868',
|
|
'https://www.tiktok.com/@jack1234/',
|
|
'https://www.tiktok.com/@userWithLongVideoName/',
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('PINTEREST_REGEX', () => {
|
|
it('works', () => {
|
|
expect(PINTEREST_REGEX).toBeInstanceOf(RegExp);
|
|
expect(PINTEREST_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(PINTEREST_REGEX.flags).toBe('i');
|
|
expect(PINTEREST_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(''.match(PINTEREST_REGEX_GLOBAL)).toBe(null);
|
|
expect(' dummy '.match(PINTEREST_REGEX_GLOBAL)).toBe(null);
|
|
|
|
expect(PINTEREST_REGEX.test('https://pinterest.com/pin/123456789')).toBe(true);
|
|
expect(PINTEREST_REGEX.test('https://www.pinterest.cz/pin/123456789')).toBe(true);
|
|
expect(PINTEREST_REGEX.test('https://www.pinterest.com/user')).toBe(true);
|
|
expect(PINTEREST_REGEX.test('https://www.pinterest.co.uk/user')).toBe(true);
|
|
expect(PINTEREST_REGEX.test('pinterest.com/user_name.gold')).toBe(true);
|
|
expect(PINTEREST_REGEX.test('https://cz.pinterest.com/user/board')).toBe(true);
|
|
|
|
expect(PINTEREST_REGEX.test('_https://pinterest.com/pin/123456789')).toBe(false);
|
|
expect(PINTEREST_REGEX.test('xpinterest.com/user_name.gold')).toBe(false);
|
|
expect(PINTEREST_REGEX.test('_pinterest.com/someusername')).toBe(false);
|
|
expect(PINTEREST_REGEX.test('0pinterest.com/someusername')).toBe(false);
|
|
|
|
// Test there is just on matching group for the pin, board or username
|
|
expect('https://pinterest.com/pin/123456789'.match(PINTEREST_REGEX)![1]).toBe('pin/123456789');
|
|
expect('https://www.pinterest.com/username'.match(PINTEREST_REGEX)![1]).toBe('username');
|
|
expect('pinterest.com/user_name.gold'.match(PINTEREST_REGEX)![1]).toBe('user_name.gold');
|
|
expect('https://cz.pinterest.com/username/board'.match(PINTEREST_REGEX)![1]).toBe('username/board');
|
|
|
|
expect(
|
|
`
|
|
https://pinterest.com/pin/123456789
|
|
-https://pinterest.com/pin/10084556789/
|
|
https://www.pinterest.cz/pin/123456789
|
|
https://www.pinterest.com/user
|
|
https://uk.pinterest.com/user
|
|
https://www.pinterest.co.uk/user
|
|
pinterest.com/user_name.gold
|
|
https://cz.pinterest.com/user/board
|
|
https://www.pinterest.cz/pin/nonNumericPinId
|
|
`.match(PINTEREST_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://pinterest.com/pin/123456789',
|
|
'https://pinterest.com/pin/10084556789/',
|
|
'https://www.pinterest.cz/pin/123456789',
|
|
'https://www.pinterest.com/user',
|
|
'https://uk.pinterest.com/user',
|
|
'https://www.pinterest.co.uk/user',
|
|
'pinterest.com/user_name.gold',
|
|
'https://cz.pinterest.com/user/board',
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('DISCORD_REGEX', () => {
|
|
it('works', () => {
|
|
expect(DISCORD_REGEX).toBeInstanceOf(RegExp);
|
|
expect(DISCORD_REGEX_GLOBAL).toBeInstanceOf(RegExp);
|
|
|
|
expect(DISCORD_REGEX.flags).toBe('i');
|
|
expect(DISCORD_REGEX_GLOBAL.flags).toBe('gi');
|
|
|
|
expect(''.match(DISCORD_REGEX_GLOBAL)).toBe(null);
|
|
expect(' dummy '.match(DISCORD_REGEX_GLOBAL)).toBe(null);
|
|
|
|
expect(DISCORD_REGEX.test('https://discord.gg/discord-developers')).toBe(true);
|
|
expect(DISCORD_REGEX.test('https://discord.com/invite/jyEM2PRvMU')).toBe(true);
|
|
expect(DISCORD_REGEX.test('https://discordapp.com/channels/231496023303957476')).toBe(true);
|
|
expect(DISCORD_REGEX.test('https://discord.com/channels/231496023303957476/2332823543826404586')).toBe(
|
|
true,
|
|
);
|
|
expect(DISCORD_REGEX.test('https://ptb.discord.com/channels/231496023303957476/2332823543826404586')).toBe(
|
|
true,
|
|
);
|
|
expect(DISCORD_REGEX.test('ptb.discord.com/invite/jyEM2PRvMU')).toBe(true);
|
|
expect(DISCORD_REGEX.test('canary.discord.com/invite/jyEM2PRvMU')).toBe(true);
|
|
|
|
expect(DISCORD_REGEX.test('https://discord.com/channels/nonNumbericChannelId')).toBe(false);
|
|
expect(DISCORD_REGEX.test('9discord.gg/discord-developers')).toBe(false);
|
|
expect(DISCORD_REGEX.test('-discordapp.com/channels/231496023303957476/')).toBe(false);
|
|
|
|
// Test there is just on matching group for the channel or invite (matches discord.* / discordapp.* prefix as well as they differ)
|
|
expect('https://discord.gg/discord-developers'.match(DISCORD_REGEX)![1]).toBe(
|
|
'discord.gg/discord-developers',
|
|
);
|
|
expect('https://discord.com/invite/jyEM2PRvMU'.match(DISCORD_REGEX)![1]).toBe(
|
|
'discord.com/invite/jyEM2PRvMU',
|
|
);
|
|
expect('https://discordapp.com/channels/231496023303957476'.match(DISCORD_REGEX)![1]).toBe(
|
|
'discordapp.com/channels/231496023303957476',
|
|
);
|
|
expect('https://discord.com/channels/231496023303957476/2332823543826404586'.match(DISCORD_REGEX)![1]).toBe(
|
|
'discord.com/channels/231496023303957476/2332823543826404586',
|
|
);
|
|
|
|
expect(
|
|
`
|
|
https://discord.gg/discord-developers/
|
|
https://discord.com/invite/jyEM2PRvMU
|
|
-https://discordapp.com/channels/231496023303957476/
|
|
https://discord.com/channels/231496023303957476/2332823543826404586
|
|
discord.gg/discord-developers
|
|
https://discordapp.com/channels/nonNumbericChannelId
|
|
`.match(DISCORD_REGEX_GLOBAL),
|
|
).toEqual([
|
|
'https://discord.gg/discord-developers/',
|
|
'https://discord.com/invite/jyEM2PRvMU',
|
|
'https://discordapp.com/channels/231496023303957476/',
|
|
'https://discord.com/channels/231496023303957476/2332823543826404586',
|
|
'discord.gg/discord-developers',
|
|
]);
|
|
});
|
|
});
|
|
});
|