import { describe, expect, it } from 'bun:test';
import { getRandomUserAgent } from '../src/user-agent';

describe('User Agent', () => {
  describe('getRandomUserAgent', () => {
    it('should return a user agent string', () => {
      const userAgent = getRandomUserAgent();
      expect(typeof userAgent).toBe('string');
      expect(userAgent.length).toBeGreaterThan(0);
    });

    it('should return a valid user agent containing Mozilla', () => {
      const userAgent = getRandomUserAgent();
      expect(userAgent).toContain('Mozilla');
    });

    it('should return different user agents on multiple calls', () => {
      const userAgents = new Set();
      // Get 20 user agents
      for (let i = 0; i < 20; i++) {
        userAgents.add(getRandomUserAgent());
      }
      // Should have at least 2 different user agents
      expect(userAgents.size).toBeGreaterThan(1);
    });

    it('should return user agents with browser identifiers', () => {
      const userAgent = getRandomUserAgent();
      const hasBrowser =
        userAgent.includes('Chrome') ||
        userAgent.includes('Firefox') ||
        userAgent.includes('Safari') ||
        userAgent.includes('Edg');
      expect(hasBrowser).toBe(true);
    });

    it('should return user agents with OS identifiers', () => {
      const userAgent = getRandomUserAgent();
      const hasOS =
        userAgent.includes('Windows') ||
        userAgent.includes('Macintosh') ||
        userAgent.includes('Mac OS X');
      expect(hasOS).toBe(true);
    });

    it('should handle multiple concurrent calls', () => {
      const promises = Array(10)
        .fill(null)
        .map(() => Promise.resolve(getRandomUserAgent()));

      return Promise.all(promises).then(userAgents => {
        expect(userAgents).toHaveLength(10);
        userAgents.forEach(ua => {
          expect(typeof ua).toBe('string');
          expect(ua.length).toBeGreaterThan(0);
        });
      });
    });
  });
});
