zenstack/packages/schema/tests/cli/command.test.ts
Yiming e93ca5bf10
fix: zod typing for DateTime field, improve overall code generation (#363)
Co-authored-by: Abdullah Hassan <iAbdullahHassan@gmail.com>
2023-04-22 09:19:26 -07:00

129 lines
4.8 KiB
TypeScript

/* eslint-disable @typescript-eslint/no-var-requires */
/// <reference types="@types/jest" />
import { getWorkspaceNpmCacheFolder } from '@zenstackhq/testtools';
import * as fs from 'fs';
import * as path from 'path';
import * as tmp from 'tmp';
import { createProgram } from '../../src/cli';
import { execSync } from '../../src/utils/exec-utils';
describe('CLI Command Tests', () => {
let origDir: string;
beforeEach(() => {
origDir = process.cwd();
const r = tmp.dirSync({ unsafeCleanup: true });
console.log(`Project dir: ${r.name}`);
process.chdir(r.name);
});
afterEach(() => {
process.chdir(origDir);
});
function createNpmrc() {
fs.writeFileSync('.npmrc', `cache=${getWorkspaceNpmCacheFolder(__dirname)}`);
}
it('init project t3 npm std', async () => {
execSync('npx --yes create-t3-app@latest --prisma --CI --noGit .', 'inherit', {
npm_config_user_agent: 'npm',
npm_config_cache: getWorkspaceNpmCacheFolder(__dirname),
});
createNpmrc();
const program = createProgram();
await program.parseAsync(['init', '--tag', 'latest'], { from: 'user' });
expect(fs.readFileSync('schema.zmodel', 'utf-8')).toEqual(fs.readFileSync('prisma/schema.prisma', 'utf-8'));
checkDependency('zenstack', true, true);
checkDependency('@zenstackhq/runtime', false, true);
});
it('init project t3 yarn std', async () => {
execSync('npx --yes create-t3-app@latest --prisma --CI --noGit .', 'inherit', {
npm_config_user_agent: 'yarn',
npm_config_cache: getWorkspaceNpmCacheFolder(__dirname),
});
createNpmrc();
const program = createProgram();
await program.parseAsync(['init', '--tag', 'latest'], { from: 'user' });
expect(fs.readFileSync('schema.zmodel', 'utf-8')).toEqual(fs.readFileSync('prisma/schema.prisma', 'utf-8'));
checkDependency('zenstack', true, true);
checkDependency('@zenstackhq/runtime', false, true);
});
it('init project t3 pnpm std', async () => {
execSync('npx --yes create-t3-app@latest --prisma --CI --noGit .', 'inherit', {
npm_config_user_agent: 'pnpm',
npm_config_cache: getWorkspaceNpmCacheFolder(__dirname),
});
createNpmrc();
const program = createProgram();
await program.parseAsync(['init', '--tag', 'latest'], { from: 'user' });
expect(fs.readFileSync('schema.zmodel', 'utf-8')).toEqual(fs.readFileSync('prisma/schema.prisma', 'utf-8'));
checkDependency('zenstack', true, true);
checkDependency('@zenstackhq/runtime', false, true);
});
it('init project t3 non-std prisma schema', async () => {
execSync('npx --yes create-t3-app@latest --prisma --CI --noGit .', 'inherit', {
npm_config_user_agent: 'npm',
npm_config_cache: getWorkspaceNpmCacheFolder(__dirname),
});
createNpmrc();
fs.renameSync('prisma/schema.prisma', 'prisma/my.prisma');
const program = createProgram();
await program.parseAsync(['init', '--tag', 'latest', '--prisma', 'prisma/my.prisma'], { from: 'user' });
expect(fs.readFileSync('schema.zmodel', 'utf-8')).toEqual(fs.readFileSync('prisma/my.prisma', 'utf-8'));
});
it('init project empty project', async () => {
fs.writeFileSync('package.json', JSON.stringify({ name: 'my app', version: '1.0.0' }));
createNpmrc();
const program = createProgram();
await program.parseAsync(['init', '--tag', 'latest'], { from: 'user' });
expect(fs.readFileSync('schema.zmodel', 'utf-8')).toBeTruthy();
});
it('init project existing zmodel', async () => {
fs.writeFileSync('package.json', JSON.stringify({ name: 'my app', version: '1.0.0' }));
const origZModelContent = `
datasource db {
provider = 'sqlite'
url = 'file:./todo.db'
}
`;
fs.writeFileSync('schema.zmodel', origZModelContent);
createNpmrc();
const program = createProgram();
await program.parseAsync(['init', '--tag', 'latest'], { from: 'user' });
expect(fs.readFileSync('schema.zmodel', 'utf-8')).toEqual(origZModelContent);
});
});
function checkDependency(pkg: string, isDev: boolean, requireExactVersion = true) {
const pkgJson = require(path.resolve('./package.json'));
if (isDev) {
expect(pkgJson.devDependencies[pkg]).toBeTruthy();
if (requireExactVersion) {
expect(pkgJson.devDependencies[pkg]).not.toMatch(/^[\^~].*/);
}
} else {
expect(pkgJson.dependencies[pkg]).toBeTruthy();
if (requireExactVersion) {
expect(pkgJson.dependencies[pkg]).not.toMatch(/^[\^~].*/);
}
}
}