import { generateToken, verify, getLogin, getTrusted } from '../auth';

const VALID_SECRET = 'test-jwt-secret-ktery-ma-alespon-32-znaku';
const SHORT_SECRET = 'kratky';

beforeEach(() => {
    process.env.JWT_SECRET = VALID_SECRET;
});

afterEach(() => {
    delete process.env.JWT_SECRET;
});

describe('generateToken', () => {
    test('vrátí token pro platný login', () => {
        const token = generateToken('alice');
        expect(typeof token).toBe('string');
        expect(token.length).toBeGreaterThan(0);
    });

    test('vyhodí chybu bez JWT_SECRET', () => {
        delete process.env.JWT_SECRET;
        expect(() => generateToken('alice')).toThrow('JWT_SECRET');
    });

    test('vyhodí chybu pro příliš krátký JWT_SECRET', () => {
        process.env.JWT_SECRET = SHORT_SECRET;
        expect(() => generateToken('alice')).toThrow('32');
    });

    test('vyhodí chybu pro prázdný login', () => {
        expect(() => generateToken('')).toThrow('login');
    });

    test('vyhodí chybu pro login obsahující jen mezery', () => {
        expect(() => generateToken('   ')).toThrow('login');
    });

    test('vyhodí chybu pro chybějící login', () => {
        expect(() => generateToken(undefined)).toThrow('login');
    });
});

describe('verify', () => {
    test('vrátí true pro platný token', () => {
        const token = generateToken('alice');
        expect(verify(token)).toBe(true);
    });

    test('vrátí false pro podvrženou signaturu', () => {
        const token = generateToken('alice');
        const tampered = token.slice(0, -5) + 'XXXXX';
        expect(verify(tampered)).toBe(false);
    });

    test('vrátí false pro token podepsaný jiným secret', () => {
        process.env.JWT_SECRET = 'other-secret-min-32-chars-bbbbb!';
        const tokenOther = generateToken('alice');
        process.env.JWT_SECRET = VALID_SECRET;
        expect(verify(tokenOther)).toBe(false);
    });
});

describe('getLogin / getTrusted', () => {
    test('round-trip: getLogin vrátí správný login', () => {
        const token = generateToken('bob');
        expect(getLogin(token)).toBe('bob');
    });

    test('trusted=false je výchozí hodnota', () => {
        const token = generateToken('alice');
        expect(getTrusted(token)).toBe(false);
    });

    test('trusted=true je zachováno', () => {
        const token = generateToken('alice', true);
        expect(getTrusted(token)).toBe(true);
    });

    test('getLogin vyhodí chybu pro chybějící token', () => {
        expect(() => getLogin(undefined)).toThrow('token');
    });
});
