system-testing 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "system-testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "System testing with Selenium and browsers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"system",
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
+
"awaitery": "^1.0.1",
|
|
27
28
|
"diggerize": "^1.0.9",
|
|
28
29
|
"htmlfy": "^0.8.1",
|
|
29
30
|
"mime": "^4.0.7",
|
|
@@ -124,6 +124,10 @@ export default class SystemTestBrowserHelper {
|
|
|
124
124
|
if (data.type == "initialize") {
|
|
125
125
|
this.events.emit("initialize")
|
|
126
126
|
|
|
127
|
+
if (this._onInitializeCallback) {
|
|
128
|
+
await this._onInitializeCallback()
|
|
129
|
+
}
|
|
130
|
+
|
|
127
131
|
return {result: "initialized"}
|
|
128
132
|
} else if (data.type == "visit") {
|
|
129
133
|
this.events.emit("navigate", {path: data.path})
|
|
@@ -132,6 +136,10 @@ export default class SystemTestBrowserHelper {
|
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
138
|
|
|
139
|
+
onInitialize(callback) {
|
|
140
|
+
this._onInitializeCallback = callback
|
|
141
|
+
}
|
|
142
|
+
|
|
135
143
|
overrideConsoleLog() {
|
|
136
144
|
if (this.originalConsoleError || this.originalConsoleLog) {
|
|
137
145
|
throw new Error("Console methods has already been overridden!")
|
|
@@ -10,7 +10,7 @@ export default class SystemTestHttpServer {
|
|
|
10
10
|
|
|
11
11
|
onHttpServerRequest = async (request, response) => {
|
|
12
12
|
const parsedUrl = url.parse(request.url)
|
|
13
|
-
let filePath = `${
|
|
13
|
+
let filePath = `${process.cwd()}/dist${parsedUrl.pathname}`
|
|
14
14
|
|
|
15
15
|
if (filePath.endsWith("/")) {
|
|
16
16
|
filePath += "index.html"
|
|
@@ -26,11 +26,11 @@ export default class SystemTestHttpServer {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
if (!fileExists) {
|
|
29
|
-
filePath = `${
|
|
29
|
+
filePath = `${process.cwd()}/dist/index.html`
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
const fileContent = await fs.readFile(filePath)
|
|
33
|
-
const mimeType = mime.
|
|
33
|
+
const mimeType = mime.getType(filePath)
|
|
34
34
|
|
|
35
35
|
response.statusCode = 200
|
|
36
36
|
response.setHeader("Content-Type", mimeType)
|
package/src/system-test.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {Builder, By} from "selenium-webdriver"
|
|
2
|
-
import chrome from "selenium-webdriver/chrome"
|
|
2
|
+
import chrome from "selenium-webdriver/chrome.js"
|
|
3
3
|
import {digg} from "diggerize"
|
|
4
4
|
import fs from "node:fs/promises"
|
|
5
|
-
import logging from "selenium-webdriver/lib/logging"
|
|
5
|
+
import logging from "selenium-webdriver/lib/logging.js"
|
|
6
6
|
import moment from "moment"
|
|
7
7
|
import {prettify} from "htmlfy"
|
|
8
|
-
import SystemTestCommunicator from "./system-test-communicator"
|
|
9
|
-
import SystemTestHttpServer from "./system-test-http-server"
|
|
8
|
+
import SystemTestCommunicator from "./system-test-communicator.js"
|
|
9
|
+
import SystemTestHttpServer from "./system-test-http-server.js"
|
|
10
|
+
import {wait} from "awaitery"
|
|
10
11
|
import {WebSocketServer} from "ws"
|
|
11
12
|
|
|
12
13
|
class ElementNotFoundError extends Error { }
|
|
@@ -37,7 +38,7 @@ export default class SystemTest {
|
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
constructor() {
|
|
40
|
-
this.communicator = new SystemTestCommunicator({onCommand: this.
|
|
41
|
+
this.communicator = new SystemTestCommunicator({onCommand: this.onCommandReceived})
|
|
41
42
|
this._responses = {}
|
|
42
43
|
this._sendCount = 0
|
|
43
44
|
}
|
|
@@ -185,10 +186,19 @@ export default class SystemTest {
|
|
|
185
186
|
// Web socket server to communicate with browser
|
|
186
187
|
await this.startWebSocketServer()
|
|
187
188
|
|
|
189
|
+
// await wait(360000)
|
|
190
|
+
|
|
188
191
|
// Visit the root page and wait for Expo to be loaded and the app to appear
|
|
189
192
|
await this.driverVisit("/?systemTest=true")
|
|
190
|
-
|
|
191
|
-
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
await this.find("body > #root")
|
|
196
|
+
await this.find("[data-testid='systemTestingComponent']", {visible: null})
|
|
197
|
+
} catch (error) {
|
|
198
|
+
await systemTest.takeScreenshot()
|
|
199
|
+
|
|
200
|
+
throw error
|
|
201
|
+
}
|
|
192
202
|
|
|
193
203
|
// Wait for client to connect
|
|
194
204
|
await this.waitForClientWebSocket()
|
|
@@ -229,7 +239,11 @@ export default class SystemTest {
|
|
|
229
239
|
this.wss.on("close", this.onWebSocketClose)
|
|
230
240
|
}
|
|
231
241
|
|
|
232
|
-
onCommand
|
|
242
|
+
onCommand(callback) {
|
|
243
|
+
this._onCommandCallback = callback
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
onCommandReceived = async ({data}) => {
|
|
233
247
|
const type = data.type
|
|
234
248
|
let result
|
|
235
249
|
|
|
@@ -248,10 +262,8 @@ export default class SystemTest {
|
|
|
248
262
|
console.log("Browser log", ...data.value)
|
|
249
263
|
} else if (type == "error" || data.type == "unhandledrejection") {
|
|
250
264
|
this.handleError(data)
|
|
251
|
-
} else if (
|
|
252
|
-
await
|
|
253
|
-
result = await db.query(data.sql)
|
|
254
|
-
})
|
|
265
|
+
} else if (this._onCommandCallback) {
|
|
266
|
+
result = await this._onCommandCallback({data, type})
|
|
255
267
|
} else {
|
|
256
268
|
console.error(`onWebSocketClientMessage unknown data (type ${type})`, data)
|
|
257
269
|
}
|
|
@@ -283,17 +295,15 @@ export default class SystemTest {
|
|
|
283
295
|
return
|
|
284
296
|
}
|
|
285
297
|
|
|
286
|
-
|
|
287
|
-
const error = new Error(`Browser error: ${data.message}`)
|
|
298
|
+
const error = new Error(`Browser error: ${data.message}`)
|
|
288
299
|
|
|
289
|
-
|
|
290
|
-
|
|
300
|
+
if (data.trace) {
|
|
301
|
+
const errorTrace = error.trace
|
|
291
302
|
|
|
292
|
-
|
|
293
|
-
|
|
303
|
+
error.trace = `${data.trace}${errorTrace}`
|
|
304
|
+
}
|
|
294
305
|
|
|
295
|
-
|
|
296
|
-
}, 0)
|
|
306
|
+
console.error(error)
|
|
297
307
|
}
|
|
298
308
|
|
|
299
309
|
async stop() {
|
|
@@ -309,8 +319,7 @@ export default class SystemTest {
|
|
|
309
319
|
}
|
|
310
320
|
|
|
311
321
|
async takeScreenshot() {
|
|
312
|
-
const
|
|
313
|
-
const path = `${basePath}/tmp/screenshots`
|
|
322
|
+
const path = `${process.cwd()}/tmp/screenshots`
|
|
314
323
|
|
|
315
324
|
await fs.mkdir(path, {recursive: true})
|
|
316
325
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import qs from "qs"
|
|
2
|
+
import SystemTestBrowserHelper from "./system-test-browser-helper"
|
|
3
|
+
import {useCallback, useEffect, useMemo, useState} from "react"
|
|
4
|
+
import useEventEmitter from "@kaspernj/api-maker/build/use-event-emitter.js"
|
|
5
|
+
import {useRouter} from "expo-router"
|
|
6
|
+
|
|
7
|
+
export default function useSystemTest({onInitialize, ...restArgs} = {}) {
|
|
8
|
+
const router = useRouter()
|
|
9
|
+
const shared = useMemo(() => ({}), [])
|
|
10
|
+
const [enabled, setEnabled] = useState(undefined)
|
|
11
|
+
const [systemTestBrowserHelper, setSystemTestBrowserHelper] = useState()
|
|
12
|
+
|
|
13
|
+
const calculateEnabled = useCallback(() => {
|
|
14
|
+
const initialUrl = globalThis.location?.href
|
|
15
|
+
let enabled = false
|
|
16
|
+
|
|
17
|
+
if (initialUrl) {
|
|
18
|
+
const queryString = initialUrl.substring(initialUrl.indexOf("?") + 1, initialUrl.length)
|
|
19
|
+
const queryParams = qs.parse(queryString)
|
|
20
|
+
|
|
21
|
+
if (queryParams.systemTest == "true") {
|
|
22
|
+
if (!shared.systemTestBrowserHelper) {
|
|
23
|
+
console.log("Spawn SystemTestBrowserHelper")
|
|
24
|
+
|
|
25
|
+
shared.systemTestBrowserHelper = new SystemTestBrowserHelper()
|
|
26
|
+
shared.systemTestBrowserHelper.enableOnBrowser()
|
|
27
|
+
|
|
28
|
+
setSystemTestBrowserHelper(shared.systemTestBrowserHelper)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
enabled = true
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
shared.enabled = enabled
|
|
36
|
+
setEnabled(enabled)
|
|
37
|
+
}, [])
|
|
38
|
+
|
|
39
|
+
const result = useMemo(() => ({
|
|
40
|
+
enabled,
|
|
41
|
+
systemTestBrowserHelper: systemTestBrowserHelper
|
|
42
|
+
}), [enabled, systemTestBrowserHelper])
|
|
43
|
+
|
|
44
|
+
const onSystemTestBrowserHelperNavigate = useCallback(({path}) => {
|
|
45
|
+
if (shared.enabled) {
|
|
46
|
+
router.navigate(path)
|
|
47
|
+
}
|
|
48
|
+
}, [])
|
|
49
|
+
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
calculateEnabled()
|
|
52
|
+
}, [])
|
|
53
|
+
|
|
54
|
+
useEventEmitter(shared.systemTestBrowserHelper?.getEvents(), "navigate", onSystemTestBrowserHelperNavigate)
|
|
55
|
+
|
|
56
|
+
useMemo(() => {
|
|
57
|
+
shared.systemTestBrowserHelper?.onInitialize(onInitialize)
|
|
58
|
+
}, [onInitialize, shared.systemTestBrowserHelper])
|
|
59
|
+
|
|
60
|
+
const restArgsKeys = Object.keys(restArgs)
|
|
61
|
+
|
|
62
|
+
if (restArgsKeys.length > 0) throw new Error(`Unknown arguments given to useSystemTest: ${restArgsKeys.join(", ")}`)
|
|
63
|
+
|
|
64
|
+
return result
|
|
65
|
+
}
|