mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
Country-only boards auto-publish geographic location flags without showing a flag dropdown, matching existing /bant/ behavior.
155 lines
5.2 KiB
TypeScript
155 lines
5.2 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import {
|
|
getCommentFlagOptionsForDirectory,
|
|
getCommentFlagPublishOptionsForDirectory,
|
|
getCommentFlagPublishOptionsFromSelection,
|
|
getCommentFlagRequestFromSelection,
|
|
hasCommentFlagsForDirectory,
|
|
} from '../comment-flag-selection';
|
|
|
|
describe('comment-flag-selection', () => {
|
|
it('does not expose options for boards without flags', () => {
|
|
expect(getCommentFlagOptionsForDirectory({ features: {}, title: '/mu/ - Music' })).toEqual([]);
|
|
});
|
|
|
|
it('detects flag-capable directories from directory metadata', () => {
|
|
expect(hasCommentFlagsForDirectory({ features: {}, title: '/mu/ - Music' })).toBe(false);
|
|
expect(hasCommentFlagsForDirectory({ features: { hasFlags: true }, title: '/pol/ - Politically Incorrect' })).toBe(true);
|
|
});
|
|
|
|
it('uses geographic location as the default for other flag boards', () => {
|
|
expect(
|
|
getCommentFlagOptionsForDirectory({
|
|
directoryCode: 'fit',
|
|
features: { hasFlags: true },
|
|
title: '/fit/ - Fitness',
|
|
}),
|
|
).toEqual([{ label: 'Geographic Location', value: 'country:auto' }]);
|
|
});
|
|
|
|
it.each([
|
|
{ directoryCode: 'bant', title: '/bant/ - International/Random' },
|
|
{ directoryCode: 'int', title: '/int/ - International' },
|
|
{ directoryCode: 'sp', title: '/sp/ - Sports' },
|
|
])('does not expose a flag selector on /$directoryCode/ but still publishes geographic location', ({ directoryCode, title }) => {
|
|
expect(
|
|
getCommentFlagOptionsForDirectory({
|
|
directoryCode,
|
|
features: { hasFlags: true },
|
|
title,
|
|
}),
|
|
).toEqual([]);
|
|
|
|
expect(
|
|
getCommentFlagPublishOptionsForDirectory({
|
|
directoryCode,
|
|
features: { hasFlags: true },
|
|
title,
|
|
}),
|
|
).toEqual({
|
|
challengeRequest: {
|
|
challengeAnswers: ['bitsocial-flags:5chan:flag:country:auto'],
|
|
},
|
|
flairs: [{ type: 'country', code: 'auto', text: 'flag:country:auto' }],
|
|
});
|
|
});
|
|
|
|
it('matches the 4chan /pol/ flag order', () => {
|
|
const options = getCommentFlagOptionsForDirectory({
|
|
directoryCode: 'pol',
|
|
features: { hasFlags: true },
|
|
title: '/pol/ - Politically Incorrect',
|
|
});
|
|
|
|
expect(options.slice(0, 6)).toEqual([
|
|
{ label: 'Geographic Location', value: 'country:auto' },
|
|
{ label: 'Anarcho-Capitalist', value: 'pol:AC' },
|
|
{ label: 'Anarchist', value: 'pol:AN' },
|
|
{ label: 'Black Nationalist', value: 'pol:BL' },
|
|
{ label: 'Confederate', value: 'pol:CF' },
|
|
{ label: 'Communist', value: 'pol:CM' },
|
|
]);
|
|
expect(options.slice(-6)).toEqual([
|
|
{ label: 'Republican', value: 'pol:RE' },
|
|
{ label: 'Task Force Z', value: 'pol:MZ' },
|
|
{ label: 'Templar', value: 'pol:TM' },
|
|
{ label: 'Tree Hugger', value: 'pol:TR' },
|
|
{ label: 'United Nations', value: 'pol:UN' },
|
|
{ label: 'White Supremacist', value: 'pol:WP' },
|
|
]);
|
|
});
|
|
|
|
it('matches the 4chan /mlp/ flag default', () => {
|
|
const options = getCommentFlagOptionsForDirectory({
|
|
directoryCode: 'mlp',
|
|
features: { hasFlags: true },
|
|
title: '/mlp/ - Pony',
|
|
});
|
|
|
|
expect(options.slice(0, 4)).toEqual([
|
|
{ label: 'None', value: 'none' },
|
|
{ label: '4cc /mlp/', value: 'pony:4CC' },
|
|
{ label: 'Adagio Dazzle', value: 'pony:ADA' },
|
|
{ label: 'Anon', value: 'pony:AN' },
|
|
]);
|
|
});
|
|
|
|
it('falls back to the board title when directoryCode is blank', () => {
|
|
const options = getCommentFlagOptionsForDirectory({
|
|
directoryCode: ' ',
|
|
features: { hasFlags: true },
|
|
title: '/mlp/ - Pony',
|
|
});
|
|
|
|
expect(options.slice(0, 2)).toEqual([
|
|
{ label: 'None', value: 'none' },
|
|
{ label: '4cc /mlp/', value: 'pony:4CC' },
|
|
]);
|
|
});
|
|
|
|
it('serializes selected flags as challenge-readable flag requests', () => {
|
|
expect(getCommentFlagRequestFromSelection('country:auto')).toEqual({
|
|
type: 'country',
|
|
code: 'auto',
|
|
text: 'flag:country:auto',
|
|
});
|
|
expect(getCommentFlagRequestFromSelection('pol:AC')).toEqual({
|
|
type: 'pol',
|
|
code: 'AC',
|
|
text: 'flag:pol:AC',
|
|
});
|
|
expect(getCommentFlagRequestFromSelection('pony:AJ')).toEqual({
|
|
type: 'pony',
|
|
code: 'AJ',
|
|
text: 'flag:pony:AJ',
|
|
});
|
|
expect(getCommentFlagRequestFromSelection('none')).toBeUndefined();
|
|
});
|
|
|
|
it('publishes selected flags as signed comment flairs and challenge answers', () => {
|
|
expect(getCommentFlagPublishOptionsFromSelection('country:auto')).toEqual({
|
|
challengeRequest: {
|
|
challengeAnswers: ['bitsocial-flags:5chan:flag:country:auto'],
|
|
},
|
|
flairs: [{ type: 'country', code: 'auto', text: 'flag:country:auto' }],
|
|
});
|
|
expect(getCommentFlagPublishOptionsFromSelection('pony:AJ')).toEqual({
|
|
challengeRequest: {
|
|
challengeAnswers: ['bitsocial-flags:5chan:flag:pony:AJ'],
|
|
},
|
|
flairs: [{ type: 'pony', code: 'AJ', text: 'flag:pony:AJ' }],
|
|
});
|
|
});
|
|
|
|
it('clears flag publish data when no flag is selected', () => {
|
|
expect(getCommentFlagPublishOptionsFromSelection('none')).toEqual({
|
|
challengeRequest: undefined,
|
|
flairs: undefined,
|
|
});
|
|
expect(getCommentFlagPublishOptionsFromSelection(undefined)).toEqual({
|
|
challengeRequest: undefined,
|
|
flairs: undefined,
|
|
});
|
|
});
|
|
});
|