clone of repo on github
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

106 lines
3.6 KiB

import { describe, it, expect } from 'vitest';
import {
isEventId,
isCoordinate,
parseCoordinate,
createCoordinate,
isNostrIdentifier
} from '../../src/lib/utils/nostr_identifiers';
describe('Nostr Identifier Validation', () => {
describe('isEventId', () => {
it('should validate correct hex event IDs', () => {
const validId = 'a'.repeat(64);
expect(isEventId(validId)).toBe(true);
const validIdWithMixedCase = 'A'.repeat(32) + 'f'.repeat(32);
expect(isEventId(validIdWithMixedCase)).toBe(true);
});
it('should reject invalid event IDs', () => {
expect(isEventId('')).toBe(false);
expect(isEventId('abc')).toBe(false);
expect(isEventId('a'.repeat(63))).toBe(false); // too short
expect(isEventId('a'.repeat(65))).toBe(false); // too long
expect(isEventId('g'.repeat(64))).toBe(false); // invalid hex char
});
});
describe('isCoordinate', () => {
it('should validate correct coordinates', () => {
const validCoordinate = `30040:${'a'.repeat(64)}:chapter-1`;
expect(isCoordinate(validCoordinate)).toBe(true);
const coordinateWithColonsInDTag = `30041:${'b'.repeat(64)}:chapter:with:colons`;
expect(isCoordinate(coordinateWithColonsInDTag)).toBe(true);
});
it('should reject invalid coordinates', () => {
expect(isCoordinate('')).toBe(false);
expect(isCoordinate('abc')).toBe(false);
expect(isCoordinate('30040:abc:chapter-1')).toBe(false); // invalid pubkey
expect(isCoordinate('30040:abc')).toBe(false); // missing d-tag
expect(isCoordinate('abc:def:ghi')).toBe(false); // invalid kind
expect(isCoordinate('-1:abc:def')).toBe(false); // negative kind
});
});
describe('parseCoordinate', () => {
it('should parse valid coordinates correctly', () => {
const coordinate = `30040:${'a'.repeat(64)}:chapter-1`;
const parsed = parseCoordinate(coordinate);
expect(parsed).toEqual({
kind: 30040,
pubkey: 'a'.repeat(64),
dTag: 'chapter-1'
});
});
it('should handle d-tags with colons', () => {
const coordinate = `30041:${'b'.repeat(64)}:chapter:with:colons`;
const parsed = parseCoordinate(coordinate);
expect(parsed).toEqual({
kind: 30041,
pubkey: 'b'.repeat(64),
dTag: 'chapter:with:colons'
});
});
it('should return null for invalid coordinates', () => {
expect(parseCoordinate('')).toBeNull();
expect(parseCoordinate('abc')).toBeNull();
expect(parseCoordinate('30040:abc:chapter-1')).toBeNull();
});
});
describe('createCoordinate', () => {
it('should create valid coordinates', () => {
const coordinate = createCoordinate(30040, 'a'.repeat(64), 'chapter-1');
expect(coordinate).toBe(`30040:${'a'.repeat(64)}:chapter-1`);
});
it('should handle d-tags with colons', () => {
const coordinate = createCoordinate(30041, 'b'.repeat(64), 'chapter:with:colons');
expect(coordinate).toBe(`30041:${'b'.repeat(64)}:chapter:with:colons`);
});
});
describe('isNostrIdentifier', () => {
it('should accept valid event IDs', () => {
expect(isNostrIdentifier('a'.repeat(64))).toBe(true);
});
it('should accept valid coordinates', () => {
const coordinate = `30040:${'a'.repeat(64)}:chapter-1`;
expect(isNostrIdentifier(coordinate)).toBe(true);
});
it('should reject invalid identifiers', () => {
expect(isNostrIdentifier('')).toBe(false);
expect(isNostrIdentifier('abc')).toBe(false);
expect(isNostrIdentifier('30040:abc:chapter-1')).toBe(false);
});
});
});