// tests/unit/models/User.test.js
const User = require('../../../models/User');

describe('User Model', () => {
  test('should create a new user with provided data', () => {
    const userData = {
      id: 'test-id',
      email: 'test@example.com',
      passwordHash: 'hashed_password',
      firstName: 'John',
      lastName: 'Doe',
      userType: 'job-seeker',
      tenantId: 'tenant1'
    };

    const user = User.create(userData);

    expect(user.id).toBe('test-id');
    expect(user.email).toBe('test@example.com');
    expect(user.firstName).toBe('John');
    expect(user.lastName).toBe('Doe');
    expect(user.userType).toBe('job-seeker');
    expect(user.tenantId).toBe('tenant1');
  });

  test('should generate ID if not provided', () => {
    const userData = {
      email: 'test@example.com',
      passwordHash: 'hashed_password',
      firstName: 'John',
      lastName: 'Doe',
      userType: 'job-seeker',
      tenantId: 'tenant1'
    };

    const user = User.create(userData);

    expect(user.id).toBeDefined();
    expect(typeof user.id).toBe('string');
    expect(user.id.length).toBeGreaterThan(0);
  });

  test('should validate required fields', () => {
    const user = new User(
      'test-id',
      'test@example.com',
      'hashed_password',
      'John',
      'Doe',
      'job-seeker',
      'tenant1'
    );

    expect(() => user.validate()).not.toThrow();
  });

  test('should throw error if missing required fields', () => {
    const user = new User();

    expect(() => user.validate()).toThrow('Missing required fields');
  });

  test('should throw error for invalid email format', () => {
    const user = new User(
      'test-id',
      'invalid-email',
      'hashed_password',
      'John',
      'Doe',
      'job-seeker',
      'tenant1'
    );

    expect(() => user.validate()).toThrow('Invalid email format');
  });

  test('should throw error for invalid user type', () => {
    const user = new User(
      'test-id',
      'test@example.com',
      'hashed_password',
      'John',
      'Doe',
      'invalid-type',
      'tenant1'
    );

    expect(() => user.validate()).toThrow('User type must be either job-seeker or job-provider');
  });
});