quasqui
Version:
The meta-framework suite designed from scratch for frontend-focused modern web development.
215 lines (194 loc) • 6.67 kB
text/typescript
import path from 'path';
import { EventEmitter, Readable } from 'stream';
import { defaultsConfig, NormalizedConfig } from '@modern-js/core';
import { ModernServerContext, NextFunction } from '@modern-js/types';
import httpMocks from 'node-mocks-http';
import portfinder from 'portfinder';
import createServer, { RUN_MODE, Server } from '../src';
import { ModernServer } from '../src/server/modern-server';
import { createContext } from '../src/libs/context';
const appDirectory = path.join(__dirname, './fixtures/pure');
describe('test server', () => {
test('should throw error when ', resolve => {
try {
createServer(null as any);
} catch (e: any) {
expect((e as Error).message).toBe(
'can not start mserver without options',
);
resolve();
}
});
test('shoule get modern server instance', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
});
const port = await portfinder.getPortPromise();
expect(server instanceof Server).toBe(true);
server.listen(port, () => {
server.close();
});
});
describe('shoule get production modern server instance', () => {
test('should init server correctly', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
});
const modernServer = (server as any).server;
const {
pwd,
distDir,
workDir,
conf,
handlers,
isDev,
staticGenerate,
presetRoutes,
} = modernServer;
expect(pwd).toBe(appDirectory);
expect(distDir).toBe(path.join(appDirectory, 'dist'));
expect(workDir).toBe(distDir);
expect(conf).toBe(defaultsConfig);
expect(handlers).toBeDefined();
expect(isDev).toBeFalsy();
expect(staticGenerate).toBeFalsy();
expect(presetRoutes).toBeUndefined();
});
test('should add handler correctly', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
});
const modernServer = (server as any).server;
const len = modernServer.handlers.length;
const syncHandler = (ctx: ModernServerContext, next: NextFunction) => {
console.info(ctx.url);
next();
};
modernServer.addHandler(syncHandler);
const newLen = modernServer.handlers.length;
expect(len + 1).toBe(newLen);
expect(modernServer.handlers[newLen - 1]).not.toBe(syncHandler);
const asyncHandler = async (
ctx: ModernServerContext,
next: NextFunction,
) => {
console.info(ctx.url);
next();
};
modernServer.addHandler(asyncHandler);
const nextLen = modernServer.handlers.length;
expect(newLen + 1).toBe(nextLen);
expect(modernServer.handlers[nextLen - 1]).toBe(asyncHandler);
});
test('should get request handler correctly', async () => {
const server = await createServer({
config: {
...(defaultsConfig as NormalizedConfig),
output: {
path: 'test-dist',
},
},
pwd: appDirectory,
});
const modernServer: ModernServer = (server as any).server;
const handler = modernServer.getRequestHandler();
expect(typeof handler === 'function').toBeTruthy();
const req = httpMocks.createRequest({
url: '/',
headers: {
host: 'modernjs.com',
},
eventEmitter: Readable,
method: 'GET',
});
const res = httpMocks.createResponse({ eventEmitter: EventEmitter });
handler(req, res, () => {
// empty
});
const html = await new Promise((resolve, _reject) => {
res.on('finish', () => {
resolve(res._getData());
});
});
expect(html).toMatch('<div>Modern.js</div>');
});
});
describe('should split server work correctly', () => {
test('should init api server correctly', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
apiOnly: true,
runMode: RUN_MODE.FULL,
});
const modernServer = (server as any).server;
modernServer.emitRouteHook('reset', {});
expect(modernServer.prepareWebHandler()).toBeNull();
await server.close();
});
test('should init web server correctly', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
ssrOnly: true,
runMode: RUN_MODE.FULL,
});
const modernServer = (server as any).server;
modernServer.emitRouteHook('reset', {});
expect(modernServer.prepareAPIHandler()).toBeNull();
await server.close();
});
test('should init ssr server correctly', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
webOnly: true,
});
const modernServer = (server as any).server;
const req = httpMocks.createRequest({
url: '/',
eventEmitter: Readable,
method: 'GET',
});
const res = httpMocks.createResponse({ eventEmitter: EventEmitter });
const ctx = createContext(req, res);
ctx.resHasHandled = () => true;
ctx.error = () => {
// empty
};
expect(await modernServer.warmupSSRBundle()).toBeNull();
expect(await modernServer.handleAPI(ctx, {})).toBeUndefined();
expect(await modernServer.handleWeb(ctx, {})).toBeNull();
});
test('should init web server with proxy correctly', async () => {
const server = await createServer({
config: defaultsConfig as NormalizedConfig,
pwd: appDirectory,
webOnly: true,
proxyTarget: {
api: '/',
ssr: '/',
},
});
const modernServer = (server as any).server;
const req = httpMocks.createRequest({
url: '/',
eventEmitter: Readable,
method: 'GET',
});
const res = httpMocks.createResponse({ eventEmitter: EventEmitter });
const ctx = createContext(req, res);
ctx.resHasHandled = () => true;
ctx.error = () => {
// empty
};
expect(await modernServer.warmupSSRBundle()).toBeNull();
expect(await modernServer.handleAPI(ctx, {})).toBeNull();
expect(await modernServer.handleWeb(ctx, { isSSR: true })).toBeNull();
await server.close();
});
});
});