diff --git a/examples/basic.ts b/examples/basic.ts index f8a3561..aea2f64 100644 --- a/examples/basic.ts +++ b/examples/basic.ts @@ -5,7 +5,37 @@ driver({ browser: 'chrome' }).then(({ service }) => { { method: 'getTitle', operator: 'assertEquals', - except: 'Todo App', + except: 'Drowser', + }, + { + method: 'getTitle', + operator: 'assertEquals', + except: 'Drowser', + }, + { + method: 'getTitle', + operator: 'assertEquals', + except: 'Drowsers', + }, + { + method: 'getTitle', + operator: 'assertEquals', + except: 'Drowser', + }, + { + method: 'getTitle', + operator: 'assertEquals', + except: 'Drowsers', + }, + { + method: 'getTitle', + operator: 'assertEquals', + except: 'Drowsers', + }, + { + method: 'getTitle', + operator: 'assertEquals', + except: 'Drowser', }, ] }).catch((error) => { diff --git a/src/constants.ts b/src/constants.ts index ca09926..b03fba4 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -22,8 +22,8 @@ const seleniumExceptions: Record = { } const caseStatus: Record = { - ok: 'ok', - ko: 'ko', + passed: 'passed', + failed: 'failed', } export { caseStatus, driverBrowserList, driverBrowsers, seleniumExceptions } diff --git a/src/driver.ts b/src/driver.ts index 0f87726..f2fd028 100644 --- a/src/driver.ts +++ b/src/driver.ts @@ -85,7 +85,8 @@ const driver = async ( ) const methodPromises: Promise[] = [] const result = ( - { id, name, actual, exceptation, status }: TDataResult, + { id, name, actual, exceptation, status, duration, timestamp }: + TDataResult, ) => { return { id, @@ -93,11 +94,14 @@ const driver = async ( actual, exceptation, status, - timestamp: new Date(), + timestamp, + duration, } } service.cases.forEach((c: TDrowserServiceCase) => { + const start = performance.now() + if (typeof c === 'object') { const method = (builder as unknown as Record)[c.method] @@ -110,24 +114,33 @@ const driver = async ( const assertFunction = assert[c.operator] as TAssertFunction actualValue = v assertFunction(actualValue, c.except) + + const end = performance.now() + data.results.push( result({ id: nanoid(), name: c.method, actual: actualValue, exceptation: c.except, - status: caseStatus.ok, + status: caseStatus.passed, + timestamp: new Date(), + duration: end - start, }), ) }) .catch(() => { + const end = performance.now() + data.results.push( result({ id: nanoid(), name: c.method, actual: actualValue, exceptation: c.except, - status: caseStatus.ko, + status: caseStatus.failed, + timestamp: new Date(), + duration: end - start, }), ) }) diff --git a/src/export.ts b/src/export.ts index 2c326e9..46e5f43 100644 --- a/src/export.ts +++ b/src/export.ts @@ -7,7 +7,7 @@ import { writeJson, writeJsonSync, } from '@deps' -import { generateFileName } from '@pkg/utils.ts' +import { generateFileName, humanizeDuration } from '@pkg/utils.ts' import { TDataResult, TJSON } from '@pkg/types.ts' const exportGeneratedLog = ( @@ -96,10 +96,13 @@ const exportJSONReport = ( if (Array.isArray(results) && results.length > 0) { const jsonData = readJsonSync(filePath) as TJSON + const totalDuration = results.reduce((sum, r) => sum + r.duration, 0) + const averageDuration = totalDuration / results.length jsonData.drowser.cases.push({ id: nanoid(), time: new Date().toISOString(), + avg_duration: humanizeDuration(averageDuration), cases: results, }) diff --git a/src/types.ts b/src/types.ts index 5934b49..b4200da 100644 --- a/src/types.ts +++ b/src/types.ts @@ -22,7 +22,8 @@ export type TDataResult = { actual: unknown exceptation: unknown status: string - timestamp?: Date + timestamp: Date + duration: number } export type TData = { @@ -71,6 +72,7 @@ export type TJSON = { { id: string time: string + avg_duration: string cases: Array }, ] diff --git a/src/utils.ts b/src/utils.ts index aa9fe9a..4d0fb93 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -27,4 +27,24 @@ const generateFileName = (prefix: string, ext: 'log' | 'pdf'): string => { return `${prefix}_${timestamp}.${ext}` } -export { generateFileName, getTimestamp, isValidHttpUrl } +const humanizeDuration = (durationMs: number): string => { + const secondsTotal = Math.round(durationMs / 1000) + const seconds = secondsTotal % 60 + const minutesTotal = Math.floor(secondsTotal / 60) + const minutes = minutesTotal % 60 + const hoursTotal = Math.floor(minutesTotal / 60) + const hours = hoursTotal % 24 + const days = Math.floor(hoursTotal / 24) + + let humanized = '' + if (days > 0) humanized += `${days}d ` + if (hours > 0) humanized += `${hours}h ` + if (minutes > 0) humanized += `${minutes}m ` + if (seconds > 0 || (days === 0 && hours === 0 && minutes === 0)) { + humanized += `${seconds}s` + } + + return humanized.trim() +} + +export { generateFileName, getTimestamp, humanizeDuration, isValidHttpUrl }