UNPKG

codeceptjs

Version:

Supercharged End 2 End Testing Framework for NodeJS

650 lines (593 loc) 16.7 kB
// Project: https://github.com/codeception/codeceptjs/ /// <reference path="./types.d.ts" /> /// <reference path="../lib/mocha/types.d.ts" /> /// <reference path="./promiseBasedTypes.d.ts" /> /// <reference types="webdriverio" /> /// <reference path="./Mocha.d.ts" /> /// <reference types="joi" /> /// <reference types="playwright" /> declare namespace CodeceptJS { type WithTranslation<T> = T & // @ts-ignore import('./utils').Translate<T, Translation.Actions> type Cookie = { name: string value: string | boolean domain?: string path?: string } type RetryConfig = { /** Filter tests by string or regexp pattern */ grep?: string | RegExp /** Number of times to repeat scenarios of a Feature */ Feature?: number /** Number of times to repeat scenarios */ Scenario?: number /** Number of times to repeat Before hook */ Before?: number /** Number of times to repeat After hook */ After?: number /** Number of times to repeat BeforeSuite hook */ BeforeSuite?: number /** Number of times to repeat AfterSuite hook */ AfterSuite?: number } type TimeoutConfig = { /** Filter tests by string or regexp pattern */ grep: string | RegExp /** Set timeout for a scenarios of a Feature */ Feature: number /** Set timeout for scenarios */ Scenario: number } type AiPrompt = { role: string content: string } type AiConfig = { /** request function to send prompts to AI provider */ request: (messages: any) => Promise<string> /** custom prompts */ prompts?: { /** Returns prompt to write CodeceptJS steps inside pause mode */ writeStep?: (html: string, input: string) => Array<AiPrompt> /** Returns prompt to heal step when test fails on CI if healing is on */ healStep?: (html: string, object) => Array<AiPrompt> /** Returns prompt to generate page object inside pause mode */ generatePageObject?: (html: string, extraPrompt?: string, rootLocator?: string) => Array<AiPrompt> } /** max tokens to use */ maxTokens?: number /** configuration for processing HTML for GPT */ html?: { /** max size of HTML to be sent to OpenAI to avoid token limit */ maxLength?: number /** should HTML be changed by removing non-interactive elements */ simplify?: boolean /** should HTML be minified before sending */ minify?: boolean interactiveElements?: Array<string> textElements?: Array<string> allowedAttrs?: Array<string> allowedRoles?: Array<string> } } type MainConfig = { /** Pattern to locate CodeceptJS tests. * Allows to enter glob pattern or an Array<string> of patterns to match tests / test file names. * * For tests in JavaScript: * * ```js * tests: 'tests/**.test.js' * ``` * For tests in TypeScript: * * ```js * tests: 'tests/**.test.ts' * ``` */ tests: string /** * Where to store failure screenshots, artifacts, etc * * ```js * output: './output' * ``` */ output: string /** * empty output folder for next run * * ```js * emptyOutputFolder: true * ``` */ emptyOutputFolder?: boolean /** * mask sensitive data in output logs * * ```js * maskSensitiveData: true * ``` */ maskSensitiveData?: boolean /** * Pattern to filter tests by name. * This option is useful if you plan to use multiple configs for different environments. * * To execute only tests with @firefox tag * * ```js * grep: '@firefox' * ``` */ grep?: string /** * Enable and configure helpers: * * ```js * helpers: { * Playwright: { * url: 'https://mysite.com', * browser: 'firefox' * } * } * ``` */ helpers?: { /** * Run web tests controlling browsers via Playwright engine. * * https://codecept.io/helpers/playwright * * Available commands: * ```js * I.amOnPage('/'); * I.click('Open'); * I.see('Welcome'); * ``` */ Playwright?: PlaywrightConfig /** * Run web tests controlling browsers via Puppeteer engine. * * https://codecept.io/helpers/puppeteer * * Available commands: * ```js * I.amOnPage('/'); * I.click('Open'); * I.see('Welcome'); * ``` */ Puppeteer?: PuppeteerConfig /** * Run web tests controlling browsers via WebDriver engine. * * Available commands: * ```js * I.amOnPage('/'); * I.click('Open'); * I.see('Welcome'); * ``` * * https://codecept.io/helpers/webdriver */ WebDriver?: WebDriverConfig /** * Execute REST API requests for API testing or to assist web testing. * * https://codecept.io/helpers/REST * * Available commands: * ```js * I.sendGetRequest('/'); * ``` */ REST?: RESTConfig /** * Use JSON assertions for API testing. * Can be paired with REST or GraphQL helpers. * * https://codecept.io/helpers/JSONResponse * * Available commands: * ```js * I.seeResponseContainsJson({ user: { email: 'jon@doe.com' } }); * ``` */ JSONResponse?: any /** Enable AI features for development purposes */ AI?: any [key: string]: any } /** * Enable CodeceptJS plugins. * * https://codecept.io/plugins/ * * Plugins listen to test events and extend functionality of CodeceptJS. * * Example: * * ```js * plugins: { * autoDelay: { * enabled: true * } } * ``` */ plugins?: any /** * Include page objects to access them via dependency injection * * ```js * I: "./custom_steps.js", * loginPage: "./pages/Login.js", * User: "./pages/User.js", * ``` * Configured modules can be injected by name in a Scenario: * * ```js * Scenario('test', { I, loginPage, User }) * ``` */ include?: any /** * Set default tests timeout in seconds. * Tests will be killed on no response after timeout. * * ```js * timeout: 20, * ``` * * Can be customized to use different timeouts for a subset of tests: * * ```js * timeout: [ * 10, * { * grep: '@slow', * Scenario: 20 * } * ] * ``` */ timeout?: number | Array<TimeoutConfig> | TimeoutConfig /** * Configure retry strategy for tests * * To retry all tests 3 times: * * ```js * retry: 3 * ``` * * To retry only Before hook 3 times: * * ```js * retry: { * Before: 3 * } * ``` * * To retry tests marked as flaky 3 times, other 1 time: * * ```js * retry: [ * { * Scenario: 1, * Before: 1 * }, * { * grep: '@flaky', * Scenario: 3 * Before: 3 * } * ] * ``` */ retry?: number | Array<RetryConfig> | RetryConfig /** Disable registering global functions (Before, Scenario, etc). Not recommended */ noGlobals?: boolean /** * [Mocha test runner options](https://mochajs.org/#configuring-mocha-nodejs), additional [reporters](https://codecept.io/reports/#xml) can be configured here. * * Example: * * ```js * mocha: { * "mocha-junit-reporter": { * stdout: "./output/console.log", * options: { * mochaFile: "./output/result.xml", * attachments: true //add screenshot for a failed test * } * } * } * ``` */ mocha?: any /** * [Execute code before](https://codecept.io/bootstrap/) tests are run. * * Can be either JS module file or async function: * * ```js * bootstrap: async () => server.launch(), * ``` * or * ```js * bootstrap: 'bootstrap.js', * ``` */ bootstrap?: (() => Promise<void>) | boolean | string /** * [Execute code after tests](https://codecept.io/bootstrap/) finished. * * Can be either JS module file or async function: * * ```js * teardown: async () => server.stop(), * ``` * or * ```js * teardown: 'teardown.js', * ``` */ teardown?: (() => Promise<void>) | boolean | string /** * [Execute code before launching tests in parallel mode](https://codecept.io/bootstrap/#bootstrapall-teardownall) * */ bootstrapAll?: (() => Promise<void>) | boolean | string /** * [Execute JS code after finishing tests in parallel mode](https://codecept.io/bootstrap/#bootstrapall-teardownall) */ teardownAll?: (() => Promise<void>) | boolean | string /** Enable [localized test commands](https://codecept.io/translation/) */ translation?: string /** Additional vocabularies for [localication](https://codecept.io/translation/) */ vocabularies?: Array<string> /** * [Require additional JS modules](https://codecept.io/configuration/#require) * * Example: * ``` * require: ["should"] * ``` */ require?: Array<string> /** * Enable [BDD features](https://codecept.io/bdd/#configuration). * * Sample configuration: * ```js * gherkin: { * features: "./features/*.feature", * steps: ["./step_definitions/steps.js"] * } * ``` */ gherkin?: { /** load feature files by pattern. Multiple patterns can be specified as array */ features: string | Array<string> /** load step definitions from JS files */ steps: string | Array<string> } /** * [AI](https://codecept.io/ai/) features configuration. */ ai?: AiConfig /** * Enable full promise-based helper methods for [TypeScript](https://codecept.io/typescript/) project. * If true, all helper methods are typed as asynchronous; * Otherwise, it remains as it works in versions prior to 3.3.6 */ fullPromiseBased?: boolean [key: string]: any } type MockRequest = { method: 'GET' | 'PUT' | 'POST' | 'PATCH' | 'DELETE' | string path: string queryParams?: object } type MockResponse = { status: number body?: object } type MockInteraction = { request: MockRequest response: MockResponse } interface PageScrollPosition { x: number y: number } // Could get extended by user generated typings interface Methods extends ActorStatic {} interface I {} interface IHook {} interface IScenario {} interface IFeature { (title: string, opts?: { [key: string]: any }): FeatureConfig } interface CallbackOrder extends Array<any> {} interface SupportObject { I: CodeceptJS.I } namespace Translation { interface Actions {} } // Extending JSDoc generated typings // Types who are not be defined by JSDoc type actor = <T extends { [action: string]: (...args: any[]) => void }>(customSteps?: T & ThisType<WithTranslation<Methods & T>>) => WithTranslation<Methods & T> type ILocator = | { id: string } | { xpath: string } | { css: string } | { name: string } | { frame: string } | { android: string } | { ios: string } | { android: string; ios: string } | { react: string } | { vue: string } | { shadow: string[] } | { custom: string } | { pw: string } interface CustomLocators {} interface OtherLocators { props?: object } type LocatorOrString = string | ILocator | Locator | OtherLocators | CustomLocators[keyof CustomLocators] type StringOrSecret = string | CodeceptJS.Secret interface HookCallback { (args: SupportObject): void | Promise<void> } interface Scenario extends IScenario { only: IScenario skip: IScenario todo: IScenario } interface Feature extends IFeature { only: IFeature skip: IFeature } interface IData { Scenario: IScenario only: { Scenario: IScenario } } interface IScenario { // Scenario.todo can be called only with a title. (title: string, callback?: HookCallback): ScenarioConfig (title: string, opts: { [key: string]: any }, callback: HookCallback): ScenarioConfig } interface IHook { (callback: HookCallback): HookConfig } interface Globals { codeceptjs: typeof codeceptjs } interface IParameterTypeDefinition<T> { name: string regexp: readonly RegExp[] | readonly string[] | RegExp | string transformer: (...match: string[]) => T useForSnippets?: boolean preferForRegexpMatch?: boolean } interface HookConfig { retry(retries?: number): HookConfig } } type TryTo = <T>(fn: () => Promise<T> | T) => Promise<T | false>; type HopeThat = <T>(fn: () => Promise<T> | T) => Promise<T | false>; type RetryTo = <T>(fn: () => Promise<T> | T, retries?: number) => Promise<T>; // Globals declare const codecept_dir: string declare const output_dir: string declare const tryTo: TryTo; declare const retryTo: RetryTo; declare const hopeThat: HopeThat; declare const actor: CodeceptJS.actor declare const codecept_actor: CodeceptJS.actor declare const Helper: typeof CodeceptJS.Helper declare const codecept_helper: typeof CodeceptJS.Helper declare const pause: typeof CodeceptJS.pause declare const within: typeof CodeceptJS.within declare const session: typeof CodeceptJS.session declare const DataTable: typeof CodeceptJS.DataTable declare const DataTableArgument: typeof CodeceptJS.DataTableArgument declare const codeceptjs: typeof CodeceptJS.index declare const locate: typeof CodeceptJS.Locator.build declare function inject(): CodeceptJS.SupportObject declare function inject<T extends keyof CodeceptJS.SupportObject>(name: T): CodeceptJS.SupportObject[T] declare const secret: typeof CodeceptJS.Secret.secret // BDD declare const Given: typeof CodeceptJS.addStep declare const When: typeof CodeceptJS.addStep declare const Then: typeof CodeceptJS.addStep declare const Feature: CodeceptJS.Feature declare const Scenario: CodeceptJS.Scenario declare const xScenario: CodeceptJS.IScenario declare const xFeature: CodeceptJS.IFeature declare function Data(data: any): CodeceptJS.IData declare function xData(data: any): CodeceptJS.IData declare function DefineParameterType(options: CodeceptJS.IParameterTypeDefinition<any>): void // Hooks declare const BeforeSuite: CodeceptJS.IHook declare const AfterSuite: CodeceptJS.IHook declare const Background: CodeceptJS.IHook declare const Before: CodeceptJS.IHook declare const After: CodeceptJS.IHook // Plugins declare const __: any interface Window { resq: any } declare namespace NodeJS { interface Process { profile: string } interface Global extends CodeceptJS.Globals { codecept_dir: typeof codecept_dir output_dir: typeof output_dir actor: typeof actor codecept_actor: typeof codecept_actor Helper: typeof Helper codecept_helper: typeof codecept_helper pause: typeof pause within: typeof within session: typeof session DataTable: typeof DataTable DataTableArgument: typeof DataTableArgument locate: typeof locate inject: typeof inject secret: typeof secret // plugins tryTo: typeof tryTo retryTo: typeof retryTo // BDD Given: typeof Given When: typeof When Then: typeof Then DefineParameterType: typeof DefineParameterType } } declare namespace Mocha { interface MochaGlobals { Feature: typeof Feature Scenario: typeof Scenario xFeature: typeof xFeature xScenario: typeof xScenario Data: typeof Data xData: typeof xData BeforeSuite: typeof BeforeSuite AfterSuite: typeof AfterSuite Background: typeof Background Before: typeof Before After: typeof After } interface Suite extends SuiteRunnable { tags: any[] comment: string feature: any } interface Test extends Runnable { artifacts: [] tags: any[] } } declare module 'codeceptjs' { export = codeceptjs } declare module '@codeceptjs/helper' { export = CodeceptJS.Helper } declare module 'codeceptjs/effects' { export const tryTo: TryTo; export const retryTo: RetryTo; export const hopeThat: HopeThat; }