Files
wehub-resource-sync 3a28426bf4
Lint and Format Check / lint-and-format (push) Failing after 0s
Check Migrations / Check for duplicate migration numbers (push) Failing after 1s
CI Pre-merge Check / CI Pre-merge Check (push) Failing after 2m17s
chore: import upstream snapshot with attribution
2026-07-13 12:23:40 +08:00

132 lines
3.8 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest';
const mockGetSecretByKey = vi.fn();
const mockCreateSecret = vi.fn();
const mockInitializeApiKey = vi.fn().mockResolvedValue('api-key');
const mockInitializeAnonKey = vi.fn().mockResolvedValue('anon_test');
const mockInitializeJwtKeyPair = vi
.fn()
.mockResolvedValue({ privateKey: 'priv-key', publicKey: 'pub-key', kid: 'kid-id' });
const mockIsCloudEnvironment = vi.fn();
const mockGetApiBaseUrl = vi.fn().mockReturnValue('https://api.example.com');
const mockClientQuery = vi.fn();
const mockClientRelease = vi.fn();
const mockConnect = vi.fn().mockResolvedValue({
query: mockClientQuery,
release: mockClientRelease,
});
const mockGetUserTables = vi.fn().mockResolvedValue([]);
const mockSeedStripeKeysFromEnv = vi.fn().mockResolvedValue(undefined);
vi.mock('../../src/services/secrets/secret.service.js', () => ({
SecretService: {
getInstance: () => ({
getSecretByKey: mockGetSecretByKey,
createSecret: mockCreateSecret,
initializeApiKey: mockInitializeApiKey,
initializeAnonKey: mockInitializeAnonKey,
initializeJwtKeyPair: mockInitializeJwtKeyPair,
}),
},
}));
vi.mock('../../src/utils/environment.js', () => ({
isCloudEnvironment: mockIsCloudEnvironment,
getApiBaseUrl: mockGetApiBaseUrl,
}));
vi.mock('../../src/infra/database/database.manager.js', () => ({
DatabaseManager: {
getInstance: () => ({
getPool: () => ({
connect: mockConnect,
}),
getUserTables: mockGetUserTables,
}),
},
}));
vi.mock('../../src/services/payments/stripe/sync.service.js', () => ({
StripeSyncService: {
getInstance: () => ({
seedStripeKeysFromEnv: mockSeedStripeKeysFromEnv,
}),
},
}));
vi.mock('../../src/services/auth/oauth-config.service.js', () => ({
OAuthConfigService: {
getInstance: () => ({
getAllConfigs: vi.fn().mockResolvedValue([]),
createConfig: vi.fn().mockResolvedValue(undefined),
}),
},
}));
vi.mock('../../src/services/auth/auth-config.service.js', () => ({
AuthConfigService: {
getInstance: () => ({
getConfig: vi.fn().mockResolvedValue(null),
updateConfig: vi.fn().mockResolvedValue(undefined),
}),
},
}));
vi.mock('../../src/utils/logger.js', () => ({
default: {
info: vi.fn(),
warn: vi.fn(),
error: vi.fn(),
debug: vi.fn(),
},
}));
describe('seedBackend secret initialization', () => {
beforeEach(() => {
vi.clearAllMocks();
mockClientQuery.mockResolvedValue({ rows: [] });
mockGetUserTables.mockResolvedValue([]);
process.env.ROOT_ADMIN_USERNAME = 'admin';
process.env.ROOT_ADMIN_PASSWORD = 'change-this-password';
process.env.JWT_SECRET = 'jwt-secret';
});
it('seeds INSFORGE_INTERNAL_URL in OSS environments', async () => {
mockIsCloudEnvironment.mockReturnValue(false);
mockGetSecretByKey.mockResolvedValue(null);
const { seedBackend } = await import('../../src/utils/seed.js');
await seedBackend();
expect(mockCreateSecret).toHaveBeenCalledWith({
key: 'INSFORGE_INTERNAL_URL',
isReserved: true,
value: 'http://insforge:7130',
});
});
it('skips INSFORGE_INTERNAL_URL in cloud but still seeds JWT_SECRET when missing', async () => {
mockIsCloudEnvironment.mockReturnValue(true);
mockGetSecretByKey.mockImplementation(async (key: string) => {
if (key === 'JWT_SECRET') {
return null;
}
return null;
});
const { seedBackend } = await import('../../src/utils/seed.js');
await seedBackend();
expect(mockCreateSecret).not.toHaveBeenCalledWith(
expect.objectContaining({ key: 'INSFORGE_INTERNAL_URL' })
);
expect(mockCreateSecret).toHaveBeenCalledWith({
key: 'JWT_SECRET',
isReserved: true,
value: 'jwt-secret',
});
});
});