import { render, screen } from '@testing-library/react';
import { describe, expect, it } from 'vitest';
import {
SocialPlatformDetails,
PLATFORM_CONFIG,
type SocialPlatform,
} from './SocialPlatformDetails';
describe('PLATFORM_CONFIG', () => {
it('should generate correct Twitter URL', () => {
const url = PLATFORM_CONFIG.twitter.href('username');
expect(url).toBe('https://x.com/username');
});
it('should generate correct GitHub URL', () => {
const url = PLATFORM_CONFIG.github.href('username');
expect(url).toBe('https://github.com/username');
});
it('should generate correct Farcaster URL', () => {
const url = PLATFORM_CONFIG.farcaster.href('username');
expect(url).toBe('https://warpcast.com/username');
});
it('should return website URL as-is', () => {
const url = PLATFORM_CONFIG.website.href('https://example.com');
expect(url).toBe('https://example.com');
});
it('should have an icon for each platform', () => {
const platforms: SocialPlatform[] = [
'twitter',
'github',
'farcaster',
'website',
];
for (const platform of platforms) {
expect(PLATFORM_CONFIG[platform].icon).toBeDefined();
}
});
});
describe('SocialPlatformDetails', () => {
const platforms: SocialPlatform[] = [
'twitter',
'github',
'farcaster',
'website',
];
for (const platform of platforms) {
it(`should render ${platform} link correctly`, () => {
const value = platform === 'website' ? 'https://example.com' : 'username';
render();
const link = screen.getByRole('link');
expect(link).toHaveAttribute(
'href',
PLATFORM_CONFIG[platform].href(value),
);
expect(link).toHaveAttribute('target', '_blank');
expect(link).toHaveAttribute('rel', 'noopener noreferrer');
expect(screen.getByText(platform)).toHaveClass('sr-only');
const expectedTestId = `ockSocials_${platform.charAt(0).toUpperCase() + platform.slice(1)}`;
expect(link).toHaveAttribute('data-testid', expectedTestId);
const iconContainer = link.querySelector('.flex.h-4.w-4');
expect(iconContainer).toBeInTheDocument();
});
}
it('should apply correct CSS classes', () => {
render();
const link = screen.getByRole('link');
expect(link.className).toContain('flex items-center justify-center p-2');
});
});