Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die README; an keiner Stelle Bedeutung, nur Zeichensetzung.
58 lines
2.1 KiB
TypeScript
58 lines
2.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { execFileSync } from 'node:child_process'
|
|
import path from 'node:path'
|
|
|
|
/**
|
|
* Schema und Migrationen dürfen nicht auseinanderlaufen.
|
|
*
|
|
* Der Anlass war handfest: ein von Hand angelegter GIN-Index über den
|
|
* Suchvektor stand in der Migration, aber nicht in `schema.prisma`. Prisma
|
|
* hielt das für einen Rückstand und fragte bei jedem `migrate dev` nach einem
|
|
* Namen für eine neue Migration - deren Inhalt gewesen wäre, **den Suchindex
|
|
* zu löschen**. Wer die Frage in Eile beantwortet, verliert die gestufte
|
|
* Volltextsuche und merkt es erst, wenn die Suche leer bleibt.
|
|
*
|
|
* Der Vergleich läuft gegen die Datenbank, auf die der Testlauf zeigt. Sie
|
|
* trägt alle Migrationen, also ist ein Unterschied zum Schema genau der
|
|
* Rückstand, den `migrate dev` sonst anbietet.
|
|
*
|
|
* `--exit-code`: 0 heisst kein Unterschied, 2 heisst Unterschied.
|
|
*/
|
|
const url = process.env.DIRECT_DATABASE_URL ?? process.env.DATABASE_URL
|
|
const suite = url ? describe : describe.skip
|
|
|
|
suite('Schema und Migrationen', () => {
|
|
it('haben keinen Unterschied, den migrate dev anbieten würde', () => {
|
|
const wurzel = path.resolve(__dirname, '..')
|
|
|
|
let ausgabe = ''
|
|
let code = 0
|
|
try {
|
|
ausgabe = execFileSync(
|
|
'node',
|
|
[
|
|
require.resolve('prisma/build/index.js', { paths: [wurzel] }),
|
|
'migrate',
|
|
'diff',
|
|
'--from-config-datasource',
|
|
'--to-schema',
|
|
path.join('prisma', 'schema.prisma'),
|
|
'--script',
|
|
'--exit-code',
|
|
],
|
|
{ cwd: wurzel, encoding: 'utf8', env: { ...process.env }, timeout: 120_000 },
|
|
)
|
|
} catch (error) {
|
|
const fehler = error as { status?: number; stdout?: string; stderr?: string }
|
|
code = fehler.status ?? 1
|
|
ausgabe = `${fehler.stdout ?? ''}${fehler.stderr ?? ''}`
|
|
}
|
|
|
|
// Die Meldung nennt das fehlende Stück, damit man nicht suchen muss.
|
|
expect(ausgabe.replace(/^Loaded Prisma config.*$/m, '').trim(), ausgabe).not.toMatch(
|
|
/^--\s*(Create|Drop|Alter|Add)/m,
|
|
)
|
|
expect(code, ausgabe).toBe(0)
|
|
}, 130_000)
|
|
})
|