import assert from 'node:assert/strict'
import { test } from 'node:test'
import {
mutationPreview,
requireConfirm,
resolveApiHost,
resolveApiKeySecretName,
resolveApplicationKeySecretName,
resolveSite,
secretSetupUrl,
} from './core.ts'
import { createDashboard, deleteDashboard } from './dashboards.ts'
import { createIncident, deleteIncident } from './incidents.ts'
import { createMonitor, deleteMonitor, muteMonitor } from './monitors.ts'
test('secret names use datadogApiKey and datadogApplicationKey plus account labels', () => {
assert.equal(resolveApiKeySecretName({}), 'datadogApiKey')
assert.equal(resolveApplicationKeySecretName({}), 'datadogApplicationKey')
assert.equal(resolveApiKeySecretName({ account: 'work' }), 'datadogApiKey-work')
assert.equal(
resolveApplicationKeySecretName({ account: 'work' }),
'datadogApplicationKey-work',
)
assert.equal(
resolveApiKeySecretName({ apiKeySecretName: 'datadogApiKey-staging' }),
'datadogApiKey-staging',
)
assert.throws(() => resolveApiKeySecretName({ apiKeySecretName: 'otherKey' }), /datadogApiKey/)
assert.throws(
() => resolveApplicationKeySecretName({ applicationKeySecretName: 'otherKey' }),
/datadogApplicationKey/,
)
})
test('secretSetupUrl stays on the hosted secrets page with Datadog API hosts', () => {
assert.match(secretSetupUrl('datadogApiKey'), /https:\/\/kody\.codes\/account\/secrets\/new\?name=datadogApiKey/)
assert.match(
secretSetupUrl('datadogApplicationKey'),
/name=datadogApplicationKey/,
)
assert.match(secretSetupUrl('datadogApiKey'), /allowedHosts=api\.datadoghq\.com/)
assert.match(secretSetupUrl('datadogApiKey-work'), /name=datadogApiKey-work/)
})
test('resolveSite maps aliases and rejects unknown orgs', () => {
assert.equal(resolveSite({}), 'datadoghq.com')
assert.equal(resolveSite({ site: 'eu' }), 'datadoghq.eu')
assert.equal(resolveSite({ site: 'us3' }), 'us3.datadoghq.com')
assert.equal(resolveApiHost({ site: 'eu' }), 'api.datadoghq.eu')
assert.equal(resolveApiHost({ site: 'api.datadoghq.eu' }), 'api.datadoghq.eu')
assert.throws(() => resolveSite({ site: 'kentcdodds' }), /site must be a Datadog site/)
})
test('requireConfirm blocks live mutations', () => {
assert.throws(() => requireConfirm({}, 'delete monitor 1'), /confirm: true/)
requireConfirm({ confirm: true }, 'delete monitor 1')
})
test('mutationPreview dryRun skips confirm', () => {
const preview = mutationPreview(
{ dryRun: true },
{
action: 'delete monitor 1',
method: 'DELETE',
path: '/api/v1/monitor/1',
},
)
assert.equal(preview?.dryRun, true)
assert.equal(preview?.method, 'DELETE')
assert.equal(preview?.path, '/api/v1/monitor/1')
assert.equal(preview?.host, 'api.datadoghq.com')
})
test('monitor/incident/dashboard dryRun does not require confirm or a network call', async () => {
const create = await createMonitor({
type: 'query alert',
query: 'avg(last_5m):avg:system.cpu.user{*} > 95',
name: 'preview',
dryRun: true,
})
const mute = await muteMonitor({ monitorId: 9, dryRun: true })
const del = await deleteMonitor({ monitorId: 9, dryRun: true })
const incident = await createIncident({ title: 'preview', dryRun: true })
const incidentDelete = await deleteIncident({ incidentId: 'abc', dryRun: true })
const dashboard = await createDashboard({
title: 'preview',
layoutType: 'ordered',
dryRun: true,
})
const dashboardDelete = await deleteDashboard({ dashboardId: 'abc-def', dryRun: true })
assert.equal(create.dryRun, true)
assert.equal(create.method, 'POST')
assert.equal(create.path, '/api/v1/monitor')
assert.equal(mute.path, '/api/v1/monitor/9/mute')
assert.equal(del.method, 'DELETE')
assert.equal(incident.path, '/api/v2/incidents')
assert.equal(incidentDelete.path, '/api/v2/incidents/abc')
assert.equal(dashboard.path, '/api/v1/dashboard')
assert.equal(dashboardDelete.path, '/api/v1/dashboard/abc-def')
})
test('live mutations without confirm or dryRun throw', async () => {
await assert.rejects(
createMonitor({
type: 'query alert',
query: 'avg(last_5m):avg:system.cpu.user{*} > 95',
name: 'live',
}),
/confirm: true/,
)
await assert.rejects(deleteMonitor({ monitorId: 1 }), /confirm: true/)
await assert.rejects(createIncident({ title: 'live' }), /confirm: true/)
await assert.rejects(
createDashboard({ title: 'live', layoutType: 'ordered' }),
/confirm: true/,
)
})