UNPKG

suitest-js-api

Version:

Suitest is a test automation and device manipulation tool for living room devices and web browsers.

486 lines (450 loc) 16.8 kB
import {LocationChain} from './typeDefinition/LocationChain'; import {ApplicationChain} from './typeDefinition/ApplicationChain'; import {ClearAppDataChain} from './typeDefinition/ClearAppData'; import {CookieChain} from './typeDefinition/CookieChain'; import {ElementChain} from './typeDefinition/ElementChain'; import * as elementTypes from './typeDefinition/constants/Element'; import {ExecuteCommandChain} from './typeDefinition/ExecuteCommandChain'; // import {ExecuteBrightScriptChain} from './typeDefinition/ExecuteBrightScriptChain'; import {JsExpressionChain} from './typeDefinition/JavascriptExpression'; // import {BrightScriptExpressionChain} from './typeDefinition/BrightScriptExpression'; import {OpenAppChain} from './typeDefinition/OpenAppChain'; import {NetworkRequestChain} from './typeDefinition/NetworkRequest'; import {OpenUrlChain} from './typeDefinition/OpenUrl'; import {PollUrlChain} from './typeDefinition/PollUrl'; import {PositionChain} from './typeDefinition/PositionChain'; import {PressButtonChain} from './typeDefinition/PressButton'; import {VrcConstants} from './typeDefinition/constants/Vrc'; import {RunTestChain} from './typeDefinition/RunTestChain'; import {SleepChain} from './typeDefinition/SleepChain'; import {VideoChain} from './typeDefinition/VideoChain'; import {WindowChain} from './typeDefinition/WindowChain'; import {VideoState} from './typeDefinition/constants/VideoState'; import {VisibilityState} from './typeDefinition/constants/VisibilityState'; import {Keys} from './typeDefinition/constants/Keys'; import {NetworkMethod, NetworkProp} from './typeDefinition/constants/NetworkRequest'; import {ContentMode} from './typeDefinition/constants/ContentMode'; import {ElementState} from './typeDefinition/constants/ElementState'; import {TextAlignment} from './typeDefinition/constants/TextAlignment'; import {BorderStyle} from './typeDefinition/constants/BorderStyle'; import {Directions} from './typeDefinition/constants/directions'; import {TapTypes} from './typeDefinition/constants/tapTypes'; import {ReplOptions} from './typeDefinition/InteractiveCommandChain'; import {ImageLoadState} from './typeDefinition/constants/ImageLoadState'; import {PlayStationVideoChain} from './typeDefinition/PlayStationVideoChain'; import {HadNoError} from './typeDefinition/constants/HadNoError'; import {TakeScreenshotChain} from './typeDefinition/TakeScreenshotChain'; import {SetScreenOrientationChain} from './typeDefinition/SetScreenOrientationChain'; import {ScreenOrientation} from './typeDefinition/constants/ScreenOrientation'; import {CloseAppChain} from './typeDefinition/CloseAppChain'; import {SuspendAppChain} from './typeDefinition/SuspendAppChain'; import {RelativePosition} from './typeDefinition/RelativePositionChain'; import {LaunchMode} from './typeDefinition/constants/LaunchMode'; import {OpenDeepLinkChain} from './typeDefinition/OpenDeepLink'; import {CookieProp} from './typeDefinition/constants/CookieProp'; import {OcrChain} from './typeDefinition/OcrChain'; import {OcrReadAs} from './typeDefinition/constants/OcrReadAs'; import {StringPropComparators} from './typeDefinition/constants/PropComparators'; import {ValueOf} from './typeDefinition/utils'; import {OcrColor} from './typeDefinition/constants/OcrColor'; import {ImageChain} from './typeDefinition/ImageChain'; import {Accuracy} from './typeDefinition/constants/Accuracy'; import {Lang} from './typeDefinition/constants/Langs'; import {GetLastVTScreenshotChain} from './typeDefinition/GetLastVTScreenshotChain'; // --------------- Suitest Interface ---------------------- // declare var suitest: suitest.ISuitest; export = suitest; declare namespace suitest { export interface ISuitestBase extends NodeJS.EventEmitter { /** * @throws {SuitestError} */ openSession(options: OpenSessionOptions): Promise<OpenSessionResult>; /** * @throws {SuitestError} */ closeSession(): Promise<void>; /** * @throws {SuitestError} */ setAppConfig(configId: string, options?: ConfigOverride): Promise<void>; /** * @throws {SuitestError} */ pairDevice(deviceId: string, recordingSettings?: {recording?: 'autostart' | 'manualstart' | 'none', webhookUrl?: string}): Promise<DeviceData>; /** * @throws {SuitestError} */ releaseDevice(): Promise<void>; startREPL(options?: ReplOptions): Promise<void>; /** * @throws {SuitestError} */ getAppConfig(): Promise<AppConfiguration>; /** * @throws {SuitestError} */ startRecording({webhookUrl}?: {webhookUrl: string}): Promise<string | undefined>; /** * @throws {SuitestError} */ stopRecording({discard}?: {discard: boolean}): Promise<void>; // config getConfig(): ConfigureOptions; setDefaultTimeout(timeout: ConfigureOptions['defaultTimeout']): void; setContinueOnFatalError(continueOnFatalError: ConfigureOptions['continueOnFatalError']): void; setDisallowCrashReports(disallowCrashReports: ConfigureOptions['disallowCrashReports']): void; setLogLevel(logLevel: ConfigureOptions['logLevel']): void; setRecordingOption(recordingOption: ConfigureOptions['recordingOption']): void; setWebhookUrl(webhookUrl: ConfigureOptions['webhookUrl']): void; // subjects location(): LocationChain; application(): ApplicationChain; clearAppData(): ClearAppDataChain; cookie(cookieName: string): CookieChain; element(elementSelector: ElementSelector[] | ElementSelector | string): ElementChain; video(): VideoChain; psVideo(): PlayStationVideoChain; executeCommand(jsCode: string): ExecuteCommandChain; executeCommand(jsCode: Function): ExecuteCommandChain; jsExpression(expression: string): JsExpressionChain; jsExpression(expression: Function): JsExpressionChain; // executeBrightScript(brsCode: string): ExecuteBrightScriptChain; // brightScriptExpression(expression: string): BrightScriptExpressionChain; openApp(relativeUrl?: string): OpenAppChain; closeApp(): CloseAppChain; suspendApp(): SuspendAppChain; networkRequest(): NetworkRequestChain; openUrl(absoluteUrl: string): OpenUrlChain; pollUrl(url: string, response: string): PollUrlChain; position(x: number, y: number): PositionChain; relativePosition(x: number, y: number): RelativePosition; press(key: string, options?: { longPressMs?: string | number }): PressButtonChain; press(keys: string[], options?: { longPressMs?: string | number }): PressButtonChain; sleep(milliseconds: number): SleepChain; window(): WindowChain; setScreenOrientation(orientation: ScreenOrientationValues): SetScreenOrientationChain; /** * @description return PromiseLike object with Buffer as value which represents latest screenshot made for visual testing/assertions */ takeScreenshot(dataFormat?: 'raw'): TakeScreenshotChain<Buffer>; /** * @description return PromiseLike object with base64 string as value which represents latest screenshot made for visual testing/assertions */ takeScreenshot(dataFormat: 'base64'): TakeScreenshotChain<string>; /** * @description the complete path to the file name where the screenshot should be saved. * Can be defined as string with placeholders, for example default path * to screenshots folder looks like {screenshotDir}/{dateTime}-{currentFile}-l{currentLine}.png. * Available placeholders: * - screenshotDir - default value is "screenshots" * - dateTime - time when saving screenshot happens in YYYY-MM-DD-HH-mm-ss-SSS format * - currentFile - file where saving screenshot requested * - currentLine - line of code where saving screenshot requested * @example * suitest.saveScreenshot('/path/to/file.png'); * suitest.saveScreenshot('{screenshotDir}/{dateTime}-{currentFile}-l{currentLine}.png'); */ saveScreenshot(fileName?: string): TakeScreenshotChain<void>; /** * @description returns a screenshot taken with a previous visual testing assertion (OCR or image assertions). Screenshot data will be provided as a Buffer. */ getLastVTScreenshot(dataFormat?: 'raw'): GetLastVTScreenshotChain<Buffer>; /** * @description returns a screenshot taken with a previous visual testing assertion (OCR or image assertions). Screenshot data will be provided as a base64 encoded string. */ getLastVTScreenshot(dataFormat: 'base64'): GetLastVTScreenshotChain<string>; openDeepLink(deepLink?: string): OpenDeepLinkChain; ocr(comparators: OcrCommonItem[]): OcrChain; image(imageData: ImageData): ImageChain; image(apiId: string): ImageChain; getPairedDevice(): null | { deviceId: string, manufacturer: string, model: string, owner: string, firmware: string, osVersion?: string, modelId: string, platforms: string[], customName: string, ipAddress: string, controlUnitIds: string[], inactivityTimeout?: number, status: string, displayName?: string, shortDisplayName?: string, customUserInfo?: { location?: string, team?: string, responsibleUser?: string, osInfo?: string, otherInfo?: string, }, inUseBy?: { description?: string, email?: string, orgName?: string, tokenName?: string, }, } // constants PROP: elementTypes.ElementPropTypes; COMP: elementTypes.PropComparators; VALUE: elementTypes.ValueTypes; VRC: VrcConstants; VIDEO_STATE: VideoState; VISIBILITY_STATE: VisibilityState; CONTENT_MODE: ContentMode; ELEMENT_STATE: ElementState; TEXT_ALIGNMENT: TextAlignment; IMAGE_LOAD_STATE: ImageLoadState; BORDER_STYLE: BorderStyle; KEY: Keys; NETWORK_PROP: NetworkProp; NETWORK_METHOD: NetworkMethod; HAD_NO_ERROR: HadNoError; TAP_TYPES: TapTypes; DIRECTIONS: Directions; SCREEN_ORIENTATION: ScreenOrientation; LAUNCH_MODE: LaunchMode; COOKIE_PROP: CookieProp; OCR_READ_AS: OcrReadAs; OCR_COLOR: OcrColor; ACCURACY: Accuracy; LANG: Lang; authContext: AuthContext; appContext: Context; pairedDeviceContext: Context; on(eventName: 'consoleLog', listener: (consoleLog: ConsoleLogEvent) => void): this; on(eventName: 'networkLog', listener: (networkLog: NetworkLogEvent) => void): this; once(eventName: 'consoleLog', listener: (consoleLog: ConsoleLogEvent) => void): this; once(eventName: 'networkLog', listener: (networkLog: NetworkLogEvent) => void): this; off(eventName: 'consoleLog', listener: (consoleLog: ConsoleLogEvent) => void): this; off(eventName: 'networkLog', listener: (networkLog: NetworkLogEvent) => void): this; } export interface ISuitest extends ISuitestBase { assert: AssertChains; } interface AssertChains { location(): LocationChain; application(): ApplicationChain; clearAppData(): ClearAppDataChain; cookie(cookieName: string): CookieChain; element(elementSelector: ElementSelector[] | ElementSelector | string): Omit<ElementChain, 'getCssProperties' | 'handle' | 'getAttributes'>; video(): VideoChain; psVideo(): PlayStationVideoChain; executeCommand(jsCode: string): ExecuteCommandChain; executeCommand(jsCode: Function): ExecuteCommandChain; jsExpression(expression: string): JsExpressionChain; jsExpression(expression: Function): JsExpressionChain; // executeBrightScript(brsCode: string): ExecuteBrightScriptChain; // brightScriptExpression(expression: string): BrightScriptExpressionChain; openApp(relativeUrl?: string): OpenAppChain; closeApp(): CloseAppChain; suspendApp(): SuspendAppChain; networkRequest(): NetworkRequestChain; openUrl(absoluteUrl: string): OpenUrlChain; pollUrl(url: string, response: string): PollUrlChain; position(x: number, y: number): PositionChain; relativePosition(x: number, y: number): RelativePosition; press(key: string, options?: { longPressMs?: string | number }): PressButtonChain; press(keys: string[], options?: { longPressMs?: string | number }): PressButtonChain; runTest(testId: string): RunTestChain; sleep(milliseconds: number): SleepChain; window(): WindowChain; setScreenOrientation(orientation: ScreenOrientationValues): SetScreenOrientationChain; openDeepLink(deepLink?: string): OpenDeepLinkChain; ocr(comparators: OcrCommonItem[]): OcrChain; image(imageData: ImageData): ImageChain; image(apiId: string): ImageChain; } type NetworkLogEvent = { type: 'networkLog', requestId: string, section: 'request', request: { headers: {[key: string]: string[]}, method: 'GET' | 'HEAD' |'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH', time: number, uri: string, }, } | { type: 'networkLog', requestId: string, section: 'response', response: { headers: {[key: string]: string[]}, statusCode: number, startTime: number, finishTime: number, responseSize: number, frozen: boolean, requestBody: string, responseBody: string, }, } type ConsoleLogEvent = { type: 'consoleLog', level: string, data: any[], } interface DeviceData { id: string; firmware: string; modelId: string; recordingUrl?: string; } interface ConfigOverride { url?: string; suitestify?: boolean; domainList?: string[]; mapRules?: Array<{ methods: string[]; url: string; type: string; toUrl: string; }>; codeOverrides?: object; configVariables?: Array<{ key: string; value: string; }>; openAppOverrideTest?: string; [key: string]: any; // user should have ability to pass any property to config object } type OpenSessionOptions = { tokenId: string; tokenPassword: string; } interface OpenSessionResult { accessToken: string; } interface AppConfiguration { name: string; url: string; suitestify: boolean; domainList: string[]; variables: Record<string, string>; platform: string; isHtmlBased: boolean; } type DeviceId = string; type PresetDevice = DeviceId | { deviceId: DeviceId; }; type ConfigId = string; type PresetConfig = ConfigId | (ConfigOverride & { configId: ConfigId; }); type PresetsMap = Record<string, { device: PresetDevice; config: PresetConfig; }>; interface SuitestLauncherConfiguration { extends?: string; tokenId?: string; tokenPassword?: string; concurrency?: number; preset?: string[]; presets?: PresetsMap; deviceId?: string; appConfigId?: string; inspect?: number | boolean | string; inspectBrk?: number | boolean | string; logLevel?: ConfigureOptions['logLevel']; logDir?: string; timestamp?: string; configFile?: string; overrideConfigFile?: string; disallowCrashReports?: boolean; defaultTimeout?: number; screenshotDir?: string; includeChangelist?: boolean; recordingOption?: ConfigureOptions['recordingOption']; webhookUrl?: string; } interface ConfigureOptions { logLevel: 'silent'|'normal'|'verbose'|'debug'|'silly'; recordingOption: 'autostart'|'manualstart'|'none'; webhookUrl: string; disallowCrashReports: boolean; continueOnFatalError: boolean; defaultTimeout: number; } interface Context { context: unknown; setContext(context: unknown): void; clear(): void; } interface AuthContext { headers: Record<string, string>; tokenKey: string; setContext(newContext: symbol, tokenId: string|undefined, tokenPassword: string|undefined): void; clear(): void; /** * @throws {SuitestError} */ authorizeHttp<T extends object>(requestkey: string, requestObject: T, errorOptions?: SuitestErrorOptions): Promise<WithHeaders<T>>; /** * @throws {SuitestError} */ authorizeWs<T extends object>(contentObject: T, commandName: string): Promise<T>; /** * @throws {SuitestError} */ authorizeWsConnection<T extends object>(connectObject: T, commandName: string): Promise<WithHeaders<T>>; getToken(): string; } type WithHeaders<T extends object> = T & { headers: Record<string, string> } interface SuitestErrorOptions { commandName?: string; type?: string; } interface SuitestError extends Error {} interface ElementSelector { apiId?: string; css?: string, xpath?: string, handle?: string, attributes?: string, text?: string, linkText?: string, partialLinkText?: string, position?: string, size?: string, color?: string, index?: number, active?: true, } type ScreenOrientationValues = | 'portrait' | 'portraitReversed' | 'landscape' | 'landscapeReversed'; type OcrCommonItem = { val: string, type?: StringPropComparators, readAs?: ValueOf<OcrReadAs>, align?: boolean, color?: ValueOf<OcrColor>, whitelist?: string, blacklist?: string, region?: [left: number, top: number, width: number, height: number], } type ImageData = | { // image api id from suitest image repository apiId: string, } | { // url to image somewhere in internet url: string, } | { // os path to image somewhere on a disc filepath: string, } }