import { beforeEach, describe, expect, it, vi } from 'vitest';

vi.mock('@alga-psa/core/secrets', () => ({
  getSecretProviderInstance: vi.fn(async () => ({
    getAppSecret: vi.fn(async () => null),
  })),
}));

import { clearCachedStorageConfig, getStorageConfig, validateFileUpload } from '../src/config/storage';

describe('storage config', () => {
  beforeEach(() => {
    clearCachedStorageConfig();

    delete process.env.STORAGE_DEFAULT_PROVIDER;
    delete process.env.STORAGE_LOCAL_ALLOWED_MIME_TYPES;
    delete process.env.STORAGE_LOCAL_MAX_FILE_SIZE;
    delete process.env.STORAGE_S3_ALLOWED_MIME_TYPES;
    delete process.env.STORAGE_S3_MAX_FILE_SIZE;
  });

  it('defaults to local provider with */* allowlist', async () => {
    const config = await getStorageConfig();
    expect(config.defaultProvider).toBe('local');
    expect(config.providers.local.allowedMimeTypes).toContain('*/*');

    await expect(validateFileUpload('application/pdf', 1)).resolves.toBeUndefined();
  });

  it('rejects files larger than maxFileSize', async () => {
    process.env.STORAGE_LOCAL_MAX_FILE_SIZE = '10';
    await expect(validateFileUpload('text/plain', 11)).rejects.toThrow(/File size exceeds limit/);
  });

  it('enforces mime allowlist with wildcard prefixes', async () => {
    process.env.STORAGE_LOCAL_ALLOWED_MIME_TYPES = 'image/*';
    await expect(validateFileUpload('image/png', 1)).resolves.toBeUndefined();
    await expect(validateFileUpload('application/pdf', 1)).rejects.toThrow('File type not allowed');
  });
});
