import { mkdtempSync, cpSync } from 'node:fs' import { tmpdir } from 'node:os' import { join } from 'node:path' import { spawnSync, spawn } from 'node:child_process' import { randomBytes } from 'node:crypto' import { PrismaClient } from '@prisma/client' import bcrypt from 'bcryptjs' const production=process.argv.includes('--production') const dir=mkdtempSync(join(tmpdir(),'syncova-test-')) const database='file:'+join(dir,'test.db').replaceAll('\\','/') const env={...process.env,DATABASE_URL:database,NEXTAUTH_SECRET:randomBytes(32).toString('hex'),AUTH_TRUST_HOST:'true',NEXTAUTH_URL:'http://127.0.0.1:3219',PORT:'3219',HOSTNAME:'127.0.0.1',TEST_DIST_DIR:production?'.next-e2e-production':'.next-e2e'} const setup=spawnSync(process.execPath,['node_modules/prisma/build/index.js','db','push','--skip-generate'],{env,stdio:'inherit'}) if(setup.status!==0) process.exit(1) const prisma=new PrismaClient({datasources:{db:{url:database}}}) await prisma.user.create({data:{email:'super@example.org',password:await bcrypt.hash('Test-password-only-2026',12),role:'SUPER_ADMIN'}}) await prisma.user.create({data:{email:'editor@example.org',password:await bcrypt.hash('Test-password-only-2026',12),role:'ADMIN'}}) await prisma.sitePages.create({data:{id:1,imprint:'## Kontakt\nTestverwaltung',privacy:'## Datenschutz\nTestinhalt',accessibility:'## Stand\nTestinhalt',easyLanguage:'## Willkommen\nTestinhalt',signLanguage:'## Video\nTestinhalt'}}) await prisma.privacyPolicy.create({data:{slug:'test-bauantrag',title:'Bauantrag',processingDescription:'Bauantrag bearbeiten',recipients:'Bauamt',responsible:'Testverwaltung',isPublic:true}}) await prisma.$disconnect() if(production){ const build=spawnSync(process.execPath,['node_modules/next/dist/bin/next','build'],{env,stdio:'inherit'}) if(build.status!==0)process.exit(build.status??1) cpSync(join(env.TEST_DIST_DIR,'static'),join(env.TEST_DIST_DIR,'standalone',env.TEST_DIST_DIR,'static'),{recursive:true}) } const args=production?[join(env.TEST_DIST_DIR,'standalone','server.js')]:['node_modules/next/dist/bin/next','dev','--port','3219','--hostname','127.0.0.1'] const child=spawn(process.execPath,args,{env,stdio:'inherit'}) for(const signal of ['SIGINT','SIGTERM']) process.on(signal,()=>child.kill(signal)) child.on('exit',code=>process.exit(code??1))