Projekt anlegen/archivieren: Review-Punkte

- Anlegen uebernimmt keinen alten Eintrag gleichen Namens mehr (Repo in
  Gitea geloescht): Platzhalter werden entfernt, ein verknuepftes altes
  Projekt blockiert den Namen mit klarer Meldung, bevor ein Repo entsteht;
  neue Projekte starten mit archived=false
- archiveRepo aendert Gitea und Dokument unter der Repo-Sperre; der Import
  liest den Archiv-Stand vor dem Spiegeln frisch aus Gitea
- Reaktivieren: Preview aus -> synced, Deploy-Fehler -> deploy_failed
  statt dauerhaft 'pending'

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-10-04 13:36:26 +00:00
1 parent 017a9c22f2
commit 800630ea4b
2 files changed
+105 -49

No files matched your search

+21 -3
View File
@@ -150,10 +150,28 @@ test('Reaktivieren mit Website: status nicht mehr archived (pending bis der Depl
await svc.archiveRepo('p_mit', false)
const d = aw.get('websiteProjects', 'p_mit')
assert.equal(d.archived, false)
assert.equal(d.status, 'pending') // hier ohne PREVIEW_DEPLOY_ROOT: kein Deploy, also nicht 'deployed'
// Status vor dem Redeploy geschrieben, nicht danach (der Runner setzt spaeter selbst 'deployed')
// hier ohne PREVIEW_DEPLOY_ROOT: kein Deploy -> 'pending' und als fehlgeschlagen markiert
assert.deepEqual([d.status, d.provisioningStatus], ['pending', 'deploy_failed'])
// der Status wird vor dem Redeploy geschrieben, danach nicht mehr (der Runner setzt 'deployed')
const patches = aw.calls.filter((c) => c.method === 'PATCH' && c.path.endsWith('/p_mit'))
assert.equal(patches.at(-1).body.data.status, 'pending')
assert.equal(patches.at(-1).body.data.status, undefined)
})
test('Neues Projekt: alter verknuepfter Eintrag mit demselben Namen blockiert mit klarer Meldung, bevor ein Repo entsteht', async () => {
aw.insert('websiteProjects', { repoFullName: 'WEBklar/alt-belegt', projectName: 'Alt', archived: true, status: 'archived', kind: 'website', customerId: 'cAlt' })
const before = gitea.calls.filter((c) => c.path.endsWith('/generate')).length
await assert.rejects(svc.createProjectFromTemplate({ displayName: 'alt belegt', repoName: 'alt-belegt' }), (err) =>
err.status === 409 && /alten Projekt/.test(err.message) && /archiviert/.test(err.message))
assert.equal(gitea.calls.filter((c) => c.path.endsWith('/generate')).length, before)
})
test('Neues Projekt: alter Platzhalter ohne Bezug wird entfernt, das neue Projekt startet sauber', async () => {
aw.insert('websiteProjects', { $id: 'platzhalter', repoFullName: 'WEBklar/frei-machen', projectName: 'alt', archived: true, status: 'archived' })
const r = await svc.createProjectFromTemplate({ displayName: 'Frei machen', customerId: 'c1' })
assert.equal(aw.get('websiteProjects', 'platzhalter'), undefined)
const d = docOf(r.repoFullName)
assert.equal(d.archived, false)
assert.equal(d.customerId, 'c1')
})
test('Abgleich ueberschreibt den Projektnamen nicht mehr', async () => {