Preview: Dev-Registrierung nutzt gespeicherten Branch und Stand

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-09-30 21:54:01 +00:00
1 parent cf2841adf5
commit 3316b562af
5 files changed
+96 -56

No files matched your search

+41 -22
View File
@@ -34,6 +34,7 @@ before(async () => {
await new Promise((r) => runner.listen(0, '127.0.0.1', r))
gitea = http.createServer((req, res) => {
res.setHeader('Content-Type', 'application/json')
giteaHits++
if (giteaDown) { res.statusCode = 500; return res.end('{}') }
res.end(JSON.stringify({ commit: { id: HEAD } }))
})
@@ -62,7 +63,7 @@ before(async () => {
await createDocument('websiteProjects', { ...base, subdomain: 'statisch', previewState: 'online', previewDetected: 'build:npm' }, 'p2')
await createDocument('websiteProjects', {
...base, subdomain: 'devapp', repoFullName: 'JUSN/devapp', previewState: 'sleeping', previewDetected: 'dev:npm',
previewBuiltSha: BUILT, previewEnv: envLib.encryptEnv({ API_KEY: 'geheim-wert' }, key),
previewBuiltSha: BUILT, previewBranch: 'feature-x', previewEnv: envLib.encryptEnv({ API_KEY: 'geheim-wert' }, key),
}, 'p3')
await createDocument('websiteProjects', {
...base, subdomain: 'devoff', repoFullName: 'JUSN/devoff', previewState: 'failed', previewDetected: 'dev:npm',
@@ -182,18 +183,21 @@ test('Registrierung: Runner bekommt Spec mit entschluesselten Variablen', async
assert.equal(puts.length, 1)
assert.equal(puts[0].url, '/dev/devapp')
assert.deepEqual(puts[0].body, {
sub: 'devapp', repo: 'JUSN/devapp', sha: BUILT, branch: 'main', mode: 'dev', env: { API_KEY: 'geheim-wert' },
sub: 'devapp', repo: 'JUSN/devapp', sha: BUILT, branch: 'feature-x', mode: 'dev', env: { API_KEY: 'geheim-wert' },
})
})
test('Registrierung: ohne PREVIEW_ENV_KEY env = {}', async () => {
test('Registrierung: nicht entschluesselbare Variablen (Schluessel fehlt) => uebersprungen', async () => {
const saved = process.env.PREVIEW_ENV_KEY
delete process.env.PREVIEW_ENV_KEY
const errors = console.error
console.error = () => {}
try {
await pd.syncPreviewTls()
await pd.waitForDevRegistration()
} finally { process.env.PREVIEW_ENV_KEY = saved }
assert.deepEqual(puts[0].body.env, {})
} finally { process.env.PREVIEW_ENV_KEY = saved; console.error = errors }
assert.equal(puts.length, 0)
assert.match(await read(), /preview-runner@docker/)
})
test('Registrierung: Runner-Fehler bricht den Abgleich nicht, Datei ist geschrieben', async () => {
@@ -210,30 +214,45 @@ test('Registrierung: Runner-Fehler bricht den Abgleich nicht, Datei ist geschrie
assert.match(await read(), /preview-runner@docker/)
})
test('Registrierung: ohne gebauten Stand wird der Branch-Kopf genutzt, bei Fehlschlag uebersprungen', async () => {
let giteaHits = 0
test('Registrierung: fehlender Stand oder Branch => uebersprungen, kein Gitea-Aufruf', async () => {
const { updateDocument } = await import('../server/services/appwriteAdmin.js')
await updateDocument('websiteProjects', 'p3', { previewBuiltSha: '' })
const errors = console.error
console.error = () => {}
try {
for (const patch of [{ previewBuiltSha: '' }, { previewBranch: '' }]) {
await updateDocument('websiteProjects', 'p3', patch)
giteaHits = 0
puts.length = 0
await pd.syncPreviewTls()
await pd.waitForDevRegistration()
assert.equal(puts.length, 0)
assert.equal(giteaHits, 0)
assert.match(await read(), /preview-runner@docker/)
await updateDocument('websiteProjects', 'p3', { previewBuiltSha: BUILT, previewBranch: 'feature-x' })
}
} finally { console.error = errors }
})
test('Registrierung: kaputte verschluesselte Variablen => uebersprungen', async () => {
const { updateDocument } = await import('../server/services/appwriteAdmin.js')
const good = envLib.encryptEnv({ API_KEY: 'geheim-wert' }, key)
await updateDocument('websiteProjects', 'p3', { previewEnv: 'v1:xx:yy:zz' })
const errors = console.error
console.error = () => {}
try {
await pd.syncPreviewTls()
await pd.waitForDevRegistration()
assert.equal(puts[0].body.sha, HEAD)
puts.length = 0
giteaDown = true
const errors = console.error
console.error = () => {}
try {
await pd.syncPreviewTls()
await pd.waitForDevRegistration()
} finally { console.error = errors }
assert.equal(puts.length, 0)
assert.match(await read(), /preview-runner@docker/) // Router trotzdem da
} finally {
await updateDocument('websiteProjects', 'p3', { previewBuiltSha: BUILT })
console.error = errors
await updateDocument('websiteProjects', 'p3', { previewEnv: good })
}
assert.equal(puts.length, 0)
})
test('Registrierung: keine zwei Runden gleichzeitig', async () => {
await Promise.all([pd.syncPreviewTls(), pd.syncPreviewTls()])
test('Registrierung: laeuft eine Runde, folgt genau eine Wiederholung', async () => {
await Promise.all([pd.syncPreviewTls(), pd.syncPreviewTls(), pd.syncPreviewTls()])
await pd.waitForDevRegistration()
assert.equal(puts.length, 1)
assert.equal(puts.length, 2)
})