mplus-studio / backend /src /app.integration.spec.ts
joelsefanja's picture
Deploy Mplus Studio
993eeba verified
Raw
History Blame Contribute Delete
2.83 kB
import request from 'supertest';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { createApp } from './app.js';
describe('generation api', () => {
afterEach(() => {
vi.unstubAllEnvs();
});
it('returns health status', async () => {
await request(createApp()).get('/health').expect(200, { status: 'ok' });
});
it('accepts uploaded images and returns a queued generation job', async () => {
const app = createApp();
const response = await request(app)
.post('/api/generations')
.field('prompt', 'Photorealistic product image')
.field('preset', 'studio')
.field('ratio', '16:9')
.field('mode', 'product')
.attach('images', Buffer.from('image'), { filename: 'product.png', contentType: 'image/png' })
.expect(202);
expect(response.body).toMatchObject({
provider: 'mock',
status: expect.stringMatching(/queued|running|completed/),
});
expect(response.body.jobId).toEqual(expect.any(String));
await vi.waitFor(async () => {
const jobResponse = await request(app).get(`/api/generations/${response.body.jobId}`).expect(200);
expect(jobResponse.body).toMatchObject({
status: 'completed',
result: {
provider: 'mock',
preset: 'studio',
ratio: '16:9',
images: [{ originalName: 'product.png' }],
},
});
expect(jobResponse.body.result.images[0].variants).toHaveLength(3);
});
});
it('normalizes multiple uploaded images to one menu generation job', async () => {
const app = createApp();
const response = await request(app)
.post('/api/generations')
.field('prompt', 'Menu image')
.field('preset', 'studio')
.field('ratio', '16:9')
.field('mode', 'product')
.attach('images', Buffer.from('one'), { filename: 'burger.png', contentType: 'image/png' })
.attach('images', Buffer.from('two'), { filename: 'drink.png', contentType: 'image/png' })
.expect(202);
await vi.waitFor(async () => {
const jobResponse = await request(app).get(`/api/generations/${response.body.jobId}`).expect(200);
expect(jobResponse.body.result).toMatchObject({
ratio: '1:1',
images: [{ originalName: 'burger.png' }],
});
});
});
it('returns 404 for unknown generation jobs', async () => {
await request(createApp()).get('/api/generations/missing').expect(404, { error: 'Generation job not found' });
});
it('rejects requests without images', async () => {
await request(createApp())
.post('/api/generations')
.field('prompt', 'Photorealistic product image')
.field('preset', 'studio')
.field('ratio', '16:9')
.field('mode', 'product')
.expect(400, { error: 'At least one image is required' });
});
});