DALL-E MCP Server
by Garoth
Verified
import { jest } from '@jest/globals';
import { DalleService } from '../dalle-service.js';
import fs from 'fs-extra';
import path from 'path';
import os from 'os';
// Set this to true to run all tests including those that make additional API calls
const RUN_ALL_TESTS = process.env.RUN_ALL_TESTS === 'true';
// These tests use real API calls and may take longer to complete
describe('DalleService Integration Tests', () => {
let service: DalleService;
let tempDir: string;
beforeEach(async () => {
// Create a temporary directory for test images
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'dalle-test-'));
service = new DalleService({
apiKey: process.env.OPENAI_API_KEY!,
defaultSaveDir: tempDir
});
});
afterEach(async () => {
// Clean up temporary directory after tests
await fs.remove(tempDir);
});
// Increase timeout for API calls
jest.setTimeout(60000);
describe('validateApiKey', () => {
it('should validate API key', async () => {
const result = await service.validateApiKey();
expect(result).toBe(true);
});
});
describe('generateImage', () => {
it('should generate an image with default parameters', async () => {
const result = await service.generateImage('A cute cat sitting on a windowsill');
expect(result.success).toBe(true);
expect(result.error).toBeUndefined();
expect(result.imagePaths).toBeDefined();
expect(result.imagePaths?.length).toBe(1);
expect(result.model).toBe('dall-e-3');
expect(result.prompt).toBe('A cute cat sitting on a windowsill');
// Verify image file exists
const imagePath = result.imagePaths![0];
expect(await fs.pathExists(imagePath)).toBe(true);
// Verify image file is not empty
const stats = await fs.stat(imagePath);
expect(stats.size).toBeGreaterThan(1000); // Image should be at least 1KB
});
it('should generate multiple images with custom parameters', async () => {
const result = await service.generateImage('A mountain landscape at sunset', {
model: 'dall-e-2',
size: '512x512',
n: 2,
fileName: 'test-landscape'
});
expect(result.success).toBe(true);
expect(result.error).toBeUndefined();
expect(result.imagePaths).toBeDefined();
expect(result.imagePaths?.length).toBe(2);
expect(result.model).toBe('dall-e-2');
// Verify image files exist
for (const imagePath of result.imagePaths!) {
expect(await fs.pathExists(imagePath)).toBe(true);
expect(imagePath).toContain('test-landscape');
// Verify image file is not empty
const stats = await fs.stat(imagePath);
expect(stats.size).toBeGreaterThan(1000);
}
});
it('should handle API errors gracefully', async () => {
// Create a service with an invalid API key
const invalidService = new DalleService({
apiKey: 'invalid-key',
defaultSaveDir: tempDir
});
const result = await invalidService.generateImage('This should fail');
expect(result.success).toBe(false);
expect(result.error).toBeDefined();
expect(result.imagePaths).toBeUndefined();
});
});
// Additional tests that make more API calls - only run when RUN_ALL_TESTS is true
// These tests are skipped by default to avoid excessive API usage
(RUN_ALL_TESTS ? describe : describe.skip)('editImage', () => {
let testImagePath: string;
beforeEach(async () => {
// Use a pre-generated test image from assets if available
const assetImagePath = path.resolve(process.cwd(), 'assets/test-image.png');
if (await fs.pathExists(assetImagePath)) {
// Copy the test image to the temp directory
const tempImagePath = path.join(tempDir, 'test-image.png');
await fs.copyFile(assetImagePath, tempImagePath);
testImagePath = tempImagePath;
} else {
// Generate a test image to edit
const genResult = await service.generateImage('A plain white mug on a table', {
model: 'dall-e-2', // Use DALL-E 2 for edits
fileName: 'test-mug-original'
});
testImagePath = genResult.imagePaths![0];
}
});
it('should attempt to edit an image', async () => {
const result = await service.editImage(
'Add a logo to the mug',
testImagePath,
{ fileName: 'test-mug-edited' }
);
// If the API call succeeds, verify the result
if (result.success) {
expect(result.error).toBeUndefined();
expect(result.imagePaths).toBeDefined();
expect(result.imagePaths?.length).toBe(1);
// Verify edited image file exists
const imagePath = result.imagePaths![0];
expect(await fs.pathExists(imagePath)).toBe(true);
expect(imagePath).toContain('test-mug-edited');
} else {
// If the API call fails, log the error but don't fail the test
// This is because image editing has specific format requirements
console.log('Image edit API call failed:', result.error);
expect(result.error).toBeDefined();
}
});
});
(RUN_ALL_TESTS ? describe : describe.skip)('createVariation', () => {
let testImagePath: string;
beforeEach(async () => {
// Use a pre-generated test image from assets if available
const assetImagePath = path.resolve(process.cwd(), 'assets/test-image.png');
if (await fs.pathExists(assetImagePath)) {
// Copy the test image to the temp directory
const tempImagePath = path.join(tempDir, 'test-image.png');
await fs.copyFile(assetImagePath, tempImagePath);
testImagePath = tempImagePath;
} else {
// Generate a test image for variations
const genResult = await service.generateImage('A simple geometric shape', {
model: 'dall-e-2', // Use DALL-E 2 for variations
fileName: 'test-shape-original'
});
testImagePath = genResult.imagePaths![0];
}
});
it('should create variations of an image', async () => {
const result = await service.createVariation(
testImagePath,
{
n: 2,
fileName: 'test-shape-variation'
}
);
expect(result.success).toBe(true);
expect(result.error).toBeUndefined();
expect(result.imagePaths).toBeDefined();
expect(result.imagePaths?.length).toBe(2);
// Verify variation image files exist
for (const imagePath of result.imagePaths!) {
expect(await fs.pathExists(imagePath)).toBe(true);
expect(imagePath).toContain('test-shape-variation');
}
});
});
});