system-testing 1.0.0 → 1.0.1

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.0",
3
+ "version": "1.0.1",
4
4
  "description": "System testing with Selenium and browsers.",
5
5
  "keywords": [
6
6
  "system",
@@ -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!")
@@ -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.onCommand})
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
- await this.find("body > #root")
191
- await this.find("[data-component='flash-notifications-container']", {visible: null})
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 = async ({data}) => {
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 (type == "query") {
252
- await Configuration.current().getDatabasePool().withConnection(async (db) => {
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
- setTimeout(() => { // eslint-disable-line no-undef
287
- const error = new Error(`Browser error: ${data.message}`)
298
+ const error = new Error(`Browser error: ${data.message}`)
288
299
 
289
- if (data.trace) {
290
- const errorTrace = error.trace
300
+ if (data.trace) {
301
+ const errorTrace = error.trace
291
302
 
292
- error.trace = `${data.trace}${errorTrace}`
293
- }
303
+ error.trace = `${data.trace}${errorTrace}`
304
+ }
294
305
 
295
- throw error
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 basePath = await fs.realpath(`${__dirname}/../..`) // eslint-disable-line no-undef
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
+ }