@sap_oss/wdio-qmate-service
Version:
[](https://api.reuse.software/info/github.com/SAP/wdio-qmate-service)[](http
84 lines (58 loc) • 4.41 kB
Markdown
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## What This Repository Is
`@sap_oss/wdio-qmate-service` is a WebdriverIO plugin that extends WebdriverIO with domain-specific testing modules for SAP UI5 applications, non-UI5 web apps, mobile testing, and API/service testing. It compiles to CommonJS (`./lib/`) and is consumed as a WebdriverIO service.
## Commands
```bash
# Build (required before running integration tests)
npm run build # locator build + tsc
npm run build:dev # watch mode (tsc --watch)
# Lint / Format
npm run lint # ESLint
npm run lint:fix # ESLint with auto-fix
npm run prettier # Check formatting
npm run prettier:fix # Auto-fix formatting
# Unit tests (Vitest — fast, no browser needed)
npm run test:unit
npm run test:unit:watch
# Integration tests (require Chrome + built lib/)
npx wdio ./test/reuse/util/data/test.data.conf.js # example: run a single module's tests
npm run test:reuse:util # all util module tests
npm run test:reuse:ui5 # all UI5 module tests
npm run test:reuse # all reuse module tests
# Docs
npm run serve-docs # generate and serve locally (requires mkdocs)
```
## Architecture
### Service Lifecycle
`src/index.ts` is the WebdriverIO service entry point. It implements WebdriverIO's service hooks (`onPrepare`, `beforeSession`, `before`, `after`, `onComplete`) and delegates to scripts under `src/scripts/hooks/`. The `before` hook is the main one — it initialises the global namespaces by calling `src/reuse/index.ts`.
### Global Namespaces
`src/reuse/index.ts` (the `ReuseLibrary` class) instantiates every module and assigns them to `global.*`. Test specs access everything through these globals — no imports required:
| Global | Source directory | Purpose |
|--------|-----------------|---------|
| `global.common` | `src/reuse/modules/common/` | Cross-platform: assertion, date, navigation, userInteraction |
| `global.util` | `src/reuse/modules/util/` | browser, console, data, file, formatter, function, system, component, userSettings |
| `global.ui5` | `src/reuse/modules/ui5/` | SAP UI5 controls: assertion, control, element, session, table, navigation, confirmationDialog, errorDialog, navigationBar, footerBar, mockserver, qunit |
| `global.nonUi5` | `src/reuse/modules/nonUi5/` | Standard web: assertion, element, navigation, userInteraction, session |
| `global.service` | `src/reuse/modules/service/` | API clients: odata, rest |
| `global.mobile` | `src/reuse/modules/mobile/` | element, userInteraction, gestures, device, android, ios |
| `global.flp` | `src/reuse/modules/flp/` | Fiori Launchpad: userSettings, userLocks |
| `global.cit` | `src/reuse/runner/` | Test runner utilities |
ESLint is configured to recognise all these as globals (see `.eslintrc.yml`), so `no-undef` won't fire on them.
### Build Pipeline
1. `src/scripts/locators/qmateLocatorSrc/build.js` — bundles the locator script (esbuild)
2. `tsc` — compiles all `src/**/*.ts` to `./lib/` (ES2024 target, CommonJS, strict)
Always run `npm run build` before running integration tests; the tests load from `./lib/`.
### Test Layout
- `test/unit/` — Vitest unit tests (minimal coverage, very fast)
- `test/reuse/<namespace>/<module>/` — Each module has its own wdio config (`test.*.conf.js`) and spec files. Run a single module in isolation with `npx wdio ./test/reuse/<namespace>/<module>/test.*.conf.js`.
- `test/core/` — Data exchange, functional chaining, locator, and watch-mode tests
- `test/authenticator/` — Authentication flow tests (staticLogin / systemLogin variants)
### Local Package
`packages/qcrypt/` is a local `file:` dependency providing the encryption/decryption primitives used by `util.data.decrypt` and the secure-data flow in `src/reuse/modules/util/data.ts`.
## Code Conventions
- **2-space indentation**, **double quotes**, **semicolons** (enforced by ESLint + Prettier)
- Prettier `printWidth` is 300 — long lines are acceptable
- Every module class is instantiated and exported as a singleton (`export default new Foo()`)
- JSDoc comments on public methods feed the doc generator (`npm run generate-docs`)
- `VerboseLoggerFactory` and `ErrorHandler` are the standard logging/error patterns — use `this.vlf.initLog(this.methodName)` at the top of every method