fluxer/packages/api/src/models/tests/EmbedIconUrlSanitization.test.tsx
2026-02-17 12:22:36 +00:00

175 lines
4.9 KiB
TypeScript

/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
import {Embed} from '@fluxer/api/src/models/Embed';
import {EmbedAuthor} from '@fluxer/api/src/models/EmbedAuthor';
import {EmbedFooter} from '@fluxer/api/src/models/EmbedFooter';
import {EmbedProvider} from '@fluxer/api/src/models/EmbedProvider';
import {describe, expect, it} from 'vitest';
describe('EmbedAuthor icon URL sanitisation', () => {
it('normalises empty icon_url values to null', () => {
const author = new EmbedAuthor({
name: 'Alice',
url: 'https://remote.example/@alice',
icon_url: '',
});
expect(author.iconUrl).toBeNull();
expect(author.toMessageEmbedAuthor().icon_url).toBeNull();
});
it('normalises invalid icon_url values to null', () => {
const author = new EmbedAuthor({
name: 'Alice',
url: 'https://remote.example/@alice',
icon_url: 'not-a-valid-url',
});
expect(author.iconUrl).toBeNull();
expect(author.toMessageEmbedAuthor().icon_url).toBeNull();
});
it('keeps valid icon_url values', () => {
const author = new EmbedAuthor({
name: 'Alice',
url: ' https://remote.example/@alice ',
icon_url: ' https://remote.example/avatar.png ',
});
expect(author.url).toBe('https://remote.example/@alice');
expect(author.iconUrl).toBe('https://remote.example/avatar.png');
expect(author.toMessageEmbedAuthor().url).toBe('https://remote.example/@alice');
expect(author.toMessageEmbedAuthor().icon_url).toBe('https://remote.example/avatar.png');
});
it('normalises invalid author url values to null', () => {
const author = new EmbedAuthor({
name: 'Alice',
url: 'not-a-valid-url',
icon_url: 'https://remote.example/avatar.png',
});
expect(author.url).toBeNull();
expect(author.toMessageEmbedAuthor().url).toBeNull();
});
});
describe('EmbedFooter icon URL sanitisation', () => {
it('normalises empty icon_url values to null', () => {
const footer = new EmbedFooter({
text: 'Example Server',
icon_url: '',
});
expect(footer.iconUrl).toBeNull();
expect(footer.toMessageEmbedFooter().icon_url).toBeNull();
});
it('normalises invalid icon_url values to null', () => {
const footer = new EmbedFooter({
text: 'Example Server',
icon_url: 'not-a-valid-url',
});
expect(footer.iconUrl).toBeNull();
expect(footer.toMessageEmbedFooter().icon_url).toBeNull();
});
it('keeps valid icon_url values', () => {
const footer = new EmbedFooter({
text: 'Example Server',
icon_url: ' https://remote.example/server-icon.png ',
});
expect(footer.iconUrl).toBe('https://remote.example/server-icon.png');
expect(footer.toMessageEmbedFooter().icon_url).toBe('https://remote.example/server-icon.png');
});
});
describe('Embed URL sanitisation', () => {
it('normalises invalid embed url values to null', () => {
const embed = new Embed({
type: 'rich',
title: null,
description: null,
url: 'not-a-valid-url',
timestamp: null,
color: null,
author: null,
provider: null,
thumbnail: null,
image: null,
video: null,
footer: null,
fields: null,
nsfw: null,
children: null,
});
expect(embed.url).toBeNull();
expect(embed.toMessageEmbed().url).toBeNull();
});
it('keeps valid embed urls', () => {
const embed = new Embed({
type: 'rich',
title: null,
description: null,
url: ' https://remote.example/post/1 ',
timestamp: null,
color: null,
author: null,
provider: null,
thumbnail: null,
image: null,
video: null,
footer: null,
fields: null,
nsfw: null,
children: null,
});
expect(embed.url).toBe('https://remote.example/post/1');
expect(embed.toMessageEmbed().url).toBe('https://remote.example/post/1');
});
});
describe('EmbedProvider URL sanitisation', () => {
it('normalises invalid provider url values to null', () => {
const provider = new EmbedProvider({
name: 'Example',
url: 'not-a-valid-url',
});
expect(provider.url).toBeNull();
expect(provider.toMessageEmbedProvider().url).toBeNull();
});
it('keeps valid provider urls', () => {
const provider = new EmbedProvider({
name: 'Example',
url: ' https://remote.example ',
});
expect(provider.url).toBe('https://remote.example/');
expect(provider.toMessageEmbedProvider().url).toBe('https://remote.example/');
});
});