All files / src/tests utils.js

86.11% Statements 31/36
86.66% Branches 26/30
100% Functions 6/6
85.71% Lines 30/35

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 1137x 7x 7x 7x 7x 7x 7x 7x   16x   7x     15x                 15x       15x                     11x                     11x         11x       1x 1x 1x   1x         1x       1x                 24x 24x     24x       23x 23x     23x 23x                   7x                  
const { randomUUID } = require('crypto');
const path = require('path');
const fs = require('fs');
const bcrypt = require('bcryptjs');
const request = require('supertest');
const app = require('../server');
const config = require('../config');
const pool = require('../database/connection');
 
const uniqueEmail = (prefix = 'user') => `${prefix}-${randomUUID()}@example.com`;
 
const defaultPassword = 'Password123!';
 
async function registerUser(role = 'candidate', overrides = {}) {
  const userData = {
    firstName: overrides.firstName || 'Test',
    lastName: overrides.lastName || 'User',
    email: overrides.email || uniqueEmail(role),
    password: overrides.password || defaultPassword,
    role,
    ...overrides
  };
 
  const response = await request(app)
    .post('/api/auth/register')
    .send(userData);
 
  return {
    token: response.body.token,
    user: response.body.user,
    credentials: {
      email: userData.email,
      password: userData.password
    }
  };
}
 
async function createEmployerProfile(token, overrides = {}) {
  const employerData = {
    companyName: overrides.companyName || `Company ${randomUUID().slice(0, 8)}`,
    industry: overrides.industry || 'Technology',
    companySize: overrides.companySize || '11-50',
    website: overrides.website || 'https://example.com',
    description: overrides.description || 'Test company description',
    address: overrides.address || '123 Test St',
    phone: overrides.phone || '+1-555-0000',
    ...overrides
  };
 
  const response = await request(app)
    .post('/api/employers')
    .set('Authorization', `Bearer ${token}`)
    .send(employerData);
 
  return response.body.employer;
}
 
async function createAdminUser() {
  const email = uniqueEmail('admin');
  const password = defaultPassword;
  const passwordHash = await bcrypt.hash(password, 10);
 
  const result = await pool.query(
    'INSERT INTO users (email, password_hash, first_name, last_name, role) VALUES ($1, $2, $3, $4, $5) RETURNING id',
    [email, passwordHash, 'Admin', 'User', 'admin']
  );
 
  const loginResponse = await request(app)
    .post('/api/auth/login')
    .send({ email, password });
 
  return {
    token: loginResponse.body.token,
    user: loginResponse.body.user,
    userId: result.rows[0].id,
    credentials: { email, password }
  };
}
 
async function ensureUploadDir() {
  const uploadDir = path.join(__dirname, '..', '..', config.uploadDir);
  Iif (!fs.existsSync(uploadDir)) {
    fs.mkdirSync(uploadDir, { recursive: true });
  }
  return uploadDir;
}
 
async function cleanupUploads() {
  const uploadDir = await ensureUploadDir();
  Iif (!fs.existsSync(uploadDir)) {
    return;
  }
  const entries = fs.readdirSync(uploadDir);
  for (const entry of entries) {
    const filePath = path.join(uploadDir, entry);
    try {
      fs.unlinkSync(filePath);
    } catch (error) {
      // Ignore deletion errors in tests
    }
  }
}
 
module.exports = {
  registerUser,
  createEmployerProfile,
  createAdminUser,
  uniqueEmail,
  defaultPassword,
  ensureUploadDir,
  cleanupUploads
};