dd-trace
Version:
Datadog APM tracing client for JavaScript
73 lines (65 loc) • 2.6 kB
JavaScript
function normalizeRequests (requests) {
const events = []
for (const request of requests) {
if (!request.url || !request.url.endsWith('/api/v2/citestcycle')) continue
const payloadEvents = request.payload && Array.isArray(request.payload.events) ? request.payload.events : []
for (const event of payloadEvents) {
events.push(normalizeEvent(event, request))
}
}
return events
}
function normalizeEvent (event, request) {
const content = event.content || {}
const meta = content.meta || {}
const metrics = content.metrics || {}
return {
type: event.type,
requestUrl: request.url,
name: content.name,
resource: content.resource,
service: content.service,
error: content.error,
meta,
metrics,
testName: meta['test.name'],
testSuite: meta['test.suite'],
testStatus: meta['test.status'],
testSourceFile: meta['test.source.file'],
retryReason: meta['test.retry_reason'],
isNew: meta['test.is_new'] === 'true' || metrics['test.is_new'] === 1,
isRetry: meta['test.is_retry'] === 'true' || metrics['test.is_retry'] === 1,
finalStatus: meta['test.final_status'],
earlyFlakeEnabled: meta['test.early_flake.enabled'] === 'true',
testManagementEnabled: meta['test.test_management.enabled'] === 'true',
isQuarantined: meta['test.test_management.is_quarantined'] === 'true',
isDisabled: meta['test.test_management.is_test_disabled'] === 'true',
isAttemptToFix: meta['test.test_management.is_attempt_to_fix'] === 'true',
attemptToFixPassed: meta['test.test_management.attempt_to_fix_passed'] === 'true',
}
}
function eventsOfType (events, type) {
return events.filter(event => event.type === type)
}
function findTestsByIdentity (events, identities, { ignoreSuite = false } = {}) {
const tests = eventsOfType(events, 'test')
return tests.filter(test => identities.some(identity => matchesIdentity(test, identity, ignoreSuite)))
}
function matchesIdentity (test, identity, ignoreSuite) {
if (identity.name && !sameOrEndsWith(test.testName, identity.name)) return false
if (identity.file && !sameOrEndsWith(test.testSourceFile, identity.file)) return false
if (!ignoreSuite && identity.suite && !sameOrEndsWith(test.testSuite, identity.suite)) return false
return Boolean(identity.name)
}
function sameOrEndsWith (actual, expected) {
if (!actual || !expected) return false
return actual === expected ||
actual.endsWith(expected) ||
expected.endsWith(actual)
}
module.exports = {
normalizeRequests,
eventsOfType,
findTestsByIdentity,
}