/**
 * assertNotDevBypassInProduction() — unit tests.
 *
 * Tests the three behavioral cases:
 *  1. NODE_ENV='production' AND DEV_AUTH_BYPASS='true' → calls process.exit(1)
 *  2. NODE_ENV='development' AND DEV_AUTH_BYPASS='true' → does NOT call process.exit
 *  3. NODE_ENV='production' AND DEV_AUTH_BYPASS unset → does NOT call process.exit
 */

import { describe, it, expect, vi, afterEach } from 'vitest';
import { assertNotDevBypassInProduction } from '../../src/lib/bootGuards.js';

describe('assertNotDevBypassInProduction', () => {
  const originalNodeEnv = process.env.NODE_ENV;
  const originalBypassFlag = process.env.DEV_AUTH_BYPASS;

  afterEach(() => {
    // Restore env after each test
    process.env.NODE_ENV = originalNodeEnv;
    if (originalBypassFlag === undefined) {
      delete process.env.DEV_AUTH_BYPASS;
    } else {
      process.env.DEV_AUTH_BYPASS = originalBypassFlag;
    }
  });

  it('calls process.exit(1) when NODE_ENV=production and DEV_AUTH_BYPASS=true', () => {
    process.env.NODE_ENV = 'production';
    process.env.DEV_AUTH_BYPASS = 'true';

    const exitSpy = vi
      .spyOn(process, 'exit')
      .mockImplementation((() => {
        throw new Error('process.exit called');
      }) as never);

    expect(() => assertNotDevBypassInProduction()).toThrow('process.exit called');
    expect(exitSpy).toHaveBeenCalledWith(1);

    exitSpy.mockRestore();
  });

  it('does NOT call process.exit when NODE_ENV=development and DEV_AUTH_BYPASS=true', () => {
    process.env.NODE_ENV = 'development';
    process.env.DEV_AUTH_BYPASS = 'true';

    const exitSpy = vi
      .spyOn(process, 'exit')
      .mockImplementation((() => {
        throw new Error('process.exit called');
      }) as never);

    expect(() => assertNotDevBypassInProduction()).not.toThrow();
    expect(exitSpy).not.toHaveBeenCalled();

    exitSpy.mockRestore();
  });

  it('does NOT call process.exit when NODE_ENV=production and DEV_AUTH_BYPASS is unset', () => {
    process.env.NODE_ENV = 'production';
    delete process.env.DEV_AUTH_BYPASS;

    const exitSpy = vi
      .spyOn(process, 'exit')
      .mockImplementation((() => {
        throw new Error('process.exit called');
      }) as never);

    expect(() => assertNotDevBypassInProduction()).not.toThrow();
    expect(exitSpy).not.toHaveBeenCalled();

    exitSpy.mockRestore();
  });
});
