Skip to content

Commit ede8fc7

Browse files
authored
feat: make driver to be more flexible and have modularity (#122)
1 parent 2adcfcf commit ede8fc7

File tree

10 files changed

+198
-180
lines changed

10 files changed

+198
-180
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ dist/
22
.DS_Store
33
.env
44
drowser
5+
drowser.json
56
drowser-reports.json
6-
/node_modules
7+
/node_modules

drowser.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"url": "http://localhost:3000"
2+
"url": "http://localhost:3000"
33
}

examples/basic.ts

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,6 @@
11
import { driver } from '../mod.ts'
22

3-
driver({ browser: 'chrome' })
4-
.then(({ service }) => {
5-
service.cases = [
6-
{
7-
name: 'Verify Failed Title',
8-
fn: async ({ builder, assert }) => {
9-
const title = await builder.getTitle()
10-
assert.assertEquals(title, 'Drowsers')
11-
},
12-
},
13-
{
14-
name: 'Verify Title',
15-
fn: async ({ builder, assert }) => {
16-
const title = await builder.getTitle()
17-
assert.assertEquals(title, 'Drowser')
18-
},
19-
},
20-
]
21-
})
22-
.catch((error) => console.log(error))
23-
24-
driver({ browser: 'firefox' })
3+
driver({ browser: 'safari' })
254
.then(({ service }) => {
265
service.cases = [
276
{

mod.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import driver from './src/driver.ts'
1+
import driver from './src/driver/index.ts'
22
import type Types from './src/types.ts'
33

44
export { driver }

src/driver.ts

Lines changed: 0 additions & 144 deletions
This file was deleted.

src/driver/config.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { isEmpty, join } from '../../deps.ts'
2+
import { isValidHttpUrl } from '../utils.ts'
3+
4+
export const getConfig = async (): Promise<{ url: string }> => {
5+
const configPath = join(Deno.cwd(), 'drowser.json')
6+
7+
try {
8+
await Deno.stat(configPath)
9+
10+
const { url } = JSON.parse(await Deno.readTextFile(configPath))
11+
12+
if (isEmpty(url) || !isValidHttpUrl({ url })) {
13+
throw new Error(
14+
'An error occurred, please provide a valid url in drowser config',
15+
)
16+
}
17+
18+
return { url }
19+
} catch (error) {
20+
if (error instanceof Deno.errors.NotFound) {
21+
throw new Error('An error occurred, please create drowser.json file.')
22+
}
23+
24+
throw new Error(
25+
'An error occurred, please provide a valid url drowser.json file.',
26+
)
27+
}
28+
}

src/export.ts renamed to src/driver/export.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,23 @@ import {
66
readJsonSync,
77
writeJson,
88
writeJsonSync,
9-
} from '../deps.ts'
9+
} from '../../deps.ts'
1010
import {
1111
generateFileName,
1212
getAverageDuration,
1313
getCoverage,
1414
getCurrentMonth,
1515
getFlaky,
1616
updateOrCreate,
17-
} from './utils.ts'
17+
} from '../utils.ts'
1818
import {
1919
DataPoint,
2020
DataResult,
2121
DriverBrowser,
2222
MonthCount,
2323
MonthValue,
2424
ReportSchema,
25-
} from './types.ts'
25+
} from '../types.ts'
2626

2727
const exportGeneratedLog = (
2828
{ results }: { results: Array<DataResult> },
@@ -40,8 +40,7 @@ const exportGeneratedLog = (
4040

4141
const writeResult = () =>
4242
results.forEach((r) => {
43-
const logRow =
44-
`[${r.timestamp}] - Test with ${r.name} is ${r.status}`
43+
const logRow = `[${r.timestamp}] - Test with ${r.name} is ${r.status}`
4544
Deno.writeTextFile(logFilePath, `${logRow}\n`, { append: true })
4645
})
4746

@@ -84,12 +83,11 @@ const exportJSONReport = (
8483
}
8584
}
8685

87-
const flatedTotalTests =
88-
jsonData.drowser.metadata.current_month === month
89-
? jsonData.drowser.cases.flatMap((item) => item.cases).filter((
90-
c,
91-
) => c.month_of_test === month)
92-
: []
86+
const flatedTotalTests = jsonData.drowser.metadata.current_month === month
87+
? jsonData.drowser.cases.flatMap((item) => item.cases).filter((
88+
c,
89+
) => c.month_of_test === month)
90+
: []
9391
const totalTests = [
9492
...flatedTotalTests,
9593
...results,

src/driver/index.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { assert, Builder, By, isEmpty, Kia } from '../../deps.ts'
2+
import type {
3+
Data,
4+
DriverParams,
5+
DrowserDriverResponse,
6+
DrowserServiceCase,
7+
DrowserThenableWebDriver,
8+
} from '../types.ts'
9+
import { isValidHttpUrl } from '../utils.ts'
10+
import { driverBrowsers, seleniumExceptions } from '../constants.ts'
11+
import { exportGeneratedLog, exportJSONReport } from './export.ts'
12+
import { getConfig } from './config.ts'
13+
import { validateParams } from './validate.ts'
14+
import { processServiceCase } from './process.ts'
15+
16+
const driver = async ({
17+
browser,
18+
}: DriverParams): Promise<DrowserDriverResponse> => {
19+
const data: Data = { url: '', results: [] }
20+
21+
const config = await getConfig()
22+
data.url = config.url
23+
24+
validateParams({ browser })
25+
26+
return new Promise<DrowserDriverResponse>((resolve, reject) => {
27+
if (isEmpty(data.url) || !isValidHttpUrl({ url: data.url })) reject()
28+
29+
const builder = new Builder()
30+
.forBrowser(driverBrowsers[browser])
31+
.build() as DrowserThenableWebDriver
32+
33+
const service = { cases: [] }
34+
35+
const kia = new Kia('Processing your tests')
36+
kia.start()
37+
38+
builder
39+
.get(data.url)
40+
.then(() => resolve({ service }))
41+
.catch((error: Record<string, string>) => {
42+
kia.fail('An error occurred while running tests')
43+
reject(seleniumExceptions[error.name])
44+
})
45+
.finally(() => {
46+
const methodPromises: Promise<void>[] = []
47+
48+
service.cases.forEach((serviceCase: DrowserServiceCase) => {
49+
if (typeof serviceCase === 'object') {
50+
const methodPromise = processServiceCase(
51+
serviceCase,
52+
builder,
53+
assert,
54+
By,
55+
browser,
56+
data,
57+
)
58+
methodPromises.push(methodPromise)
59+
}
60+
})
61+
62+
const exportGeneratedFiles = () => {
63+
exportGeneratedLog({ results: data.results })
64+
exportJSONReport({
65+
results: data.results,
66+
browser,
67+
})
68+
}
69+
70+
Promise.allSettled(methodPromises)
71+
.catch((error) => reject(error))
72+
.finally(() => {
73+
exportGeneratedFiles()
74+
kia.succeed(`All tests completed on ${browser}`)
75+
builder.quit()
76+
})
77+
})
78+
})
79+
}
80+
81+
export default driver

0 commit comments

Comments
 (0)