Analyse: Runner-Auftrag

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-01 10:15:46 +00:00
1 parent 813c56e6a4
commit 62f196f705
2 files changed
+110 -3

No files matched your search

+76 -1
View File
@@ -112,7 +112,7 @@ test('an: Auftrag mit entschlüsselten Variablen, sofortige Rückgabe, Ergebnis
assert.equal(aw.get('websiteProjects', id).previewState, 'building')
const [sub] = submits()
assert.equal(sub.auth, 'Bearer sekret')
assert.deepEqual(sub.body, { sub: repo.split('/')[1], repo, sha: SHA, branch: 'main', mode: 'auto', displayName: 'Mein Projekt', env: { API_URL: 'https://x.test' } })
assert.deepEqual(sub.body, { sub: repo.split('/')[1], repo, sha: SHA, branch: 'main', mode: 'auto', displayName: 'Mein Projekt', env: { API_URL: 'https://x.test' }, analytics: null })
await pd.waitForRunFollowers()
const d = aw.get('websiteProjects', id)
assert.equal(d.previewState, 'online')
@@ -366,3 +366,78 @@ test('dev-Ergebnis: PUT /dev/<sub> mit vollständigem Auftrag inkl. Variablen',
const put = rs.calls.find((c) => c.method === 'PUT')
assert.deepEqual(put.body, { sub: repo.split('/')[1], repo, sha: SHA, branch: 'main', mode: 'dev', env: { A: 'wert1234' } })
})
// ---- Analyse-Feld im Build-Auftrag (Task 10) ----
async function analyseProject({ feature = {}, customer = {}, project: pextra = {}, noFeature = false, noCustomer = false } = {}) {
const { createDocument } = await import('../server/services/appwriteAdmin.js')
const cid = `cust-an-${n + 1}`
const p = await project({ customerId: cid, subdomain: `an-${n + 1}`, isPublic: true, ...pextra })
if (!noCustomer) {
await createDocument('customers', { name: 'Max Muster', companyName: 'Muster GmbH', email: 'info@muster.test', street: 'Hauptstr. 1', postalCode: '12345', city: 'Berlin', ...customer }, cid)
}
if (!noFeature) {
await createDocument('portalFeatures', { customerId: cid, projectId: p.id, featureKey: 'analyse', state: 'active', enabled: true, siteKey: 'abcdef0123456789abcd', accentColor: '#ff0066', ...feature }, `f_${p.id}_analyse`)
}
return p
}
async function submitFor(p) {
await pd.runDeploy(p.repo, 'main', cfg(p.repo), { project: p.doc, sha: SHA })
await pd.waitForRunFollowers()
return submits().at(-1).body
}
test('Analyse: aktiv + öffentlich ⇒ analytics mit siteKey, Farbe, Datenschutzangaben', async () => {
const body = await submitFor(await analyseProject())
assert.deepEqual(body.analytics, {
siteKey: 'abcdef0123456789abcd',
color: '#ff0066',
privacy: { company: 'Muster GmbH', address: 'Hauptstr. 1, 12345 Berlin', email: 'info@muster.test' },
})
})
test('Analyse: Standardfarbe, Firma fällt auf Name zurück, Adresse optional', async () => {
const p = await analyseProject({ feature: { accentColor: '' }, customer: { companyName: '', street: '', postalCode: '', city: '' } })
const body = await submitFor(p)
assert.equal(body.analytics.color, '#111111')
assert.equal(body.analytics.privacy.company, 'Max Muster')
assert.equal(body.analytics.privacy.address, '')
})
test('Analyse: aus ⇒ null', async () => {
assert.equal((await submitFor(await analyseProject({ feature: { state: 'off', enabled: false } }))).analytics, null)
assert.equal((await submitFor(await analyseProject({ noFeature: true }))).analytics, null)
})
test('Analyse: nicht öffentlich oder ohne Subdomain ⇒ null', async () => {
assert.equal((await submitFor(await analyseProject({ project: { isPublic: false } }))).analytics, null)
assert.equal((await submitFor(await analyseProject({ project: { subdomain: '' } }))).analytics, null)
})
test('Analyse: fehlende E-Mail oder Firma ⇒ null mit Warnung, Build läuft trotzdem', async (t) => {
const warn = t.mock.method(console, 'warn', () => {})
const a = await analyseProject({ customer: { email: '' } })
assert.equal((await submitFor(a)).analytics, null)
assert.ok(warn.mock.calls.some((c) => String(c.arguments[0]).includes(a.id)))
assert.equal((await submitFor(await analyseProject({ customer: { companyName: '', name: '' } }))).analytics, null)
assert.equal((await submitFor(await analyseProject({ noCustomer: true }))).analytics, null)
})
test('Analyse: Fehler bei der Funktions-Abfrage ⇒ null, Auftrag wird trotzdem gesendet', async (t) => {
t.mock.method(console, 'warn', () => {})
const p = await analyseProject()
aw.failNext({ method: 'GET', pathIncludes: 'portalFeatures', status: 500 })
const before = submits().length
const body = await submitFor(p)
assert.equal(submits().length, before + 1)
assert.equal(body.analytics, null)
})
test('Analyse: Dev-PUT nach erfolgreichem Build (Modus dev) enthält kein analytics', async () => {
rs.script = done({ result: 'dev' })
const p = await analyseProject({ project: { previewMode: 'dev' } })
const body = await submitFor(p)
assert.ok(body.analytics)
const puts = rs.calls.filter((c) => c.method === 'PUT' && c.url.startsWith('/dev/'))
assert.ok(puts.length >= 1)
for (const c of puts) assert.equal('analytics' in c.body, false)
})