Skip to content

PgTAP:Examples:NanoID

PgTAP 으로 NanoID 유닛 테스트 하는 샘플

Code

BEGIN;

SELECT plan(8);

--------------------------------------------------------------------------------
-- 1. 함수 존재 여부
--------------------------------------------------------------------------------
SELECT has_function(
    'public', 'generate_random_slug', ARRAY[]::TEXT[],
    'function generate_random_slug() should exist'
);

SELECT function_returns(
    'public', 'generate_random_slug', ARRAY[]::TEXT[], 'text',
    'generate_random_slug() should return text'
);

--------------------------------------------------------------------------------
-- 2. 반환값 길이 검증 (nanoid size=21)
--------------------------------------------------------------------------------
SELECT is(
    length(generate_random_slug()), 21,
    'slug length should be 21'
);

--------------------------------------------------------------------------------
-- 3. 허용된 알파벳만 포함하는지 검증 (0-9, a-z)
--------------------------------------------------------------------------------
SELECT matches(
    generate_random_slug(), '^[0-9a-z]{21}$',
    'slug should only contain lowercase alphanumeric characters (0-9, a-z)'
);

--------------------------------------------------------------------------------
-- 4. 대문자·특수문자 미포함 검증
--------------------------------------------------------------------------------
SELECT doesnt_match(
    generate_random_slug(), '[A-Z_\-]',
    'slug should not contain uppercase letters, underscores, or hyphens'
);

--------------------------------------------------------------------------------
-- 5. 호출마다 고유한 값 생성 검증
--------------------------------------------------------------------------------
SELECT isnt(
    generate_random_slug(), generate_random_slug(),
    'consecutive calls should return different values'
);

--------------------------------------------------------------------------------
-- 6. 대량 생성 시 고유성 검증 (1000건)
--------------------------------------------------------------------------------
SELECT is(
    (SELECT COUNT(DISTINCT generate_random_slug()) FROM generate_series(1, 1000)),
    1000::BIGINT,
    '1000 generated slugs should all be unique'
);

--------------------------------------------------------------------------------
-- 7. NULL·빈 문자열이 아닌지 검증
--------------------------------------------------------------------------------
SELECT isnt(
    generate_random_slug(), NULL,
    'slug should not be NULL'
);

SELECT finish();

ROLLBACK;

See also