├── .env ├── .eslintrc.json ├── .gitattributes ├── .github └── workflows │ └── playwright.yml ├── .gitignore ├── .prettierrc.json ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── core ├── api │ ├── authentication-api.ts │ └── questions-api.ts └── context │ ├── auth-context.ts │ └── default-context.ts ├── docs ├── app.js ├── data │ ├── behaviors.csv │ ├── behaviors.json │ ├── categories.csv │ ├── categories.json │ ├── packages.json │ ├── suites.csv │ ├── suites.json │ ├── test-cases │ │ ├── 68e03d051ddb4e1c.json │ │ ├── 8567092b366540be.json │ │ ├── a3c42aceeeb62563.json │ │ ├── f3351b7df63da083.json │ │ └── f9fd5792e6989c0a.json │ └── timeline.json ├── export │ ├── influxDbData.txt │ ├── mail.html │ └── prometheusData.txt ├── favicon.ico ├── history │ ├── categories-trend.json │ ├── duration-trend.json │ ├── history-trend.json │ ├── history.json │ └── retry-trend.json ├── index.html ├── plugins │ ├── behaviors │ │ └── index.js │ ├── packages │ │ └── index.js │ └── screen-diff │ │ ├── index.js │ │ └── styles.css ├── styles.css └── widgets │ ├── behaviors.json │ ├── categories-trend.json │ ├── categories.json │ ├── duration-trend.json │ ├── duration.json │ ├── environment.json │ ├── executors.json │ ├── history-trend.json │ ├── launch.json │ ├── retry-trend.json │ ├── severity.json │ ├── status-chart.json │ ├── suites.json │ └── summary.json ├── environment.d.ts ├── fixtures ├── questions.ts └── users.ts ├── package.json ├── playwright.config.ts ├── tests ├── questions-test.ts └── questions.spec.ts ├── utils ├── api │ └── questions.ts ├── assertions │ ├── api │ │ └── questions.ts │ └── solutions.ts ├── config │ └── global-teardown.ts ├── constants │ └── routes.ts ├── fakers.ts ├── fixtures.ts ├── reporters │ └── allure.ts ├── schema │ ├── api │ │ └── questions-schema.ts │ └── validator.ts └── types │ └── api │ ├── authentication.ts │ ├── client.ts │ └── questions.ts └── yarn.lock /.env: -------------------------------------------------------------------------------- 1 | CI=1 # For playwright 2 | 3 | ENV_NAME="Local" # Name of our env just for example, can be "Dev", "Staging" etc. 4 | 5 | ALLURE_RESULTS_FOLDER="allure-results" # Folder where allure results are stored 6 | 7 | BASE_URL="https://api.sampleapis.com" # API endpoint 8 | TEST_USER_EMAIL="some@gmail.com" # Some random user just for example 9 | TEST_USER_PASSWORD="some" # Some random password just for example -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true, 5 | "jest": true 6 | }, 7 | "extends": [ 8 | "eslint:recommended", 9 | "plugin:react/recommended", 10 | "plugin:prettier/recommended", 11 | "plugin:@typescript-eslint/recommended" 12 | ], 13 | "parser": "@typescript-eslint/parser", 14 | "parserOptions": { 15 | "ecmaFeatures": { 16 | "jsx": true 17 | }, 18 | "ecmaVersion": "latest", 19 | "sourceType": "module" 20 | }, 21 | "plugins": ["react", "@typescript-eslint"], 22 | "rules": { 23 | "react/react-in-jsx-scope": "off", 24 | "prettier/prettier": [ 25 | "error", 26 | { 27 | "endOfLine": "auto" 28 | } 29 | ] 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/playwright.yml: -------------------------------------------------------------------------------- 1 | name: Playwright Tests 2 | on: 3 | push: 4 | branches: [main, master] 5 | pull_request: 6 | branches: [main, master] 7 | jobs: 8 | test: 9 | timeout-minutes: 60 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - uses: actions/setup-node@v3 14 | with: 15 | node-version: 16 16 | - name: Install dependencies 17 | run: yarn 18 | - name: Run Playwright tests 19 | run: yarn playwright test 20 | - uses: actions/upload-artifact@v3 21 | if: always() 22 | with: 23 | name: playwright-report 24 | path: playwright-report/ 25 | retention-days: 30 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | playwright-report 13 | allure-results 14 | allure-report 15 | test-results 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Snowpack dependency directory (https://snowpack.dev/) 50 | web_modules/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional stylelint cache 62 | .stylelintcache 63 | 64 | # Microbundle cache 65 | .rpt2_cache/ 66 | .rts2_cache_cjs/ 67 | .rts2_cache_es/ 68 | .rts2_cache_umd/ 69 | 70 | # Optional REPL history 71 | .node_repl_history 72 | 73 | # Output of 'npm pack' 74 | *.tgz 75 | 76 | # Yarn Integrity file 77 | .yarn-integrity 78 | 79 | # dotenv environment variable files 80 | .env.development.local 81 | .env.test.local 82 | .env.production.local 83 | .env.local 84 | 85 | # parcel-bundler cache (https://parceljs.org/) 86 | .cache 87 | .parcel-cache 88 | 89 | # Next.js build output 90 | .next 91 | out 92 | 93 | # Nuxt.js build / generate output 94 | .nuxt 95 | dist 96 | 97 | # Gatsby files 98 | .cache/ 99 | # Comment in the public line in if your project uses Gatsby and not Next.js 100 | # https://nextjs.org/blog/next-9-1#public-directory-support 101 | # public 102 | 103 | # vuepress build output 104 | .vuepress/dist 105 | 106 | # vuepress v2.x temp and cache directory 107 | .temp 108 | .cache 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "jsxSingleQuote": false, 8 | "trailingComma": "none", 9 | "bracketSpacing": true, 10 | "jsxBracketSameLine": true, 11 | "arrowParens": "always", 12 | "endOfLine": "auto" 13 | } 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "prettier.configPath": "C:\\Development\\playwright_typescript\\.prettierrc.json", 3 | "editor.formatOnSave": true 4 | } 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Playwright Typescript API 2 | 3 | [Demo allure report](https://nikita-filonov.github.io/playwright_typescript_api/) 4 | 5 | **Project setup** 6 | 7 | ``` 8 | git clone https://github.com/Nikita-Filonov/playwright_typescript_api.git 9 | cd playwright_typescript_api 10 | 11 | yarn install 12 | yarn playwright install 13 | ``` 14 | 15 | **Starting auto tests** 16 | 17 | ``` 18 | npx playwright test 19 | ``` 20 | -------------------------------------------------------------------------------- /core/api/authentication-api.ts: -------------------------------------------------------------------------------- 1 | import test, { APIRequestContext, APIResponse } from '@playwright/test'; 2 | import { APIRoutes } from '../../utils/constants/routes'; 3 | import { APIClient } from '../../utils/types/api/client'; 4 | import { AuthUser } from '../../utils/types/api/authentication'; 5 | import { getDefaultAPIContext } from '../context/default-context'; 6 | 7 | class AuthAPIClient implements APIClient { 8 | constructor(public context: APIRequestContext) {} 9 | 10 | async getAuthTokenApi(data: AuthUser): Promise { 11 | const stepName = `Getting token for user with email "${data.email}" and password "${data.password}"`; 12 | 13 | return await test.step(stepName, async () => { 14 | return await this.context.post(APIRoutes.Auth, { data }); 15 | }); 16 | } 17 | 18 | async getAuthToken(data: AuthUser): Promise { 19 | // Should be used like this: 20 | 21 | // const response = await this.getAuthTokenApi(data); 22 | // const json = await response.json(); 23 | 24 | // expect(response.status()).toBe(200); 25 | 26 | // return json.token; 27 | 28 | return 'token'; 29 | } 30 | } 31 | 32 | export const getAuthAPIClient = async (): Promise => { 33 | const defaultContext = await getDefaultAPIContext(); 34 | return new AuthAPIClient(defaultContext); 35 | }; 36 | -------------------------------------------------------------------------------- /core/api/questions-api.ts: -------------------------------------------------------------------------------- 1 | import test, { APIRequestContext, APIResponse } from '@playwright/test'; 2 | import { expectStatusCode } from '../../utils/assertions/solutions'; 3 | import { APIRoutes } from '../../utils/constants/routes'; 4 | import { APIClient } from '../../utils/types/api/client'; 5 | import { Question, UpdateQuestion } from '../../utils/types/api/questions'; 6 | 7 | export class QuestionsAPIClient implements APIClient { 8 | constructor(public context: APIRequestContext) {} 9 | 10 | async getQuestionAPI(questionId: number): Promise { 11 | return await test.step(`Getting question with id "${questionId}"`, async () => { 12 | return await this.context.get(`${APIRoutes.Questions}/${questionId}`); 13 | }); 14 | } 15 | 16 | async getQuestionsAPI(): Promise { 17 | return await test.step('Getting questions', async () => { 18 | return await this.context.get(APIRoutes.Questions); 19 | }); 20 | } 21 | 22 | async createQuestionAPI(data: Question): Promise { 23 | return await test.step(`Creating question with id "${data.id}"`, async () => { 24 | return await this.context.post(APIRoutes.Questions, { data }); 25 | }); 26 | } 27 | 28 | async updateQuestionAPI(questionId: number, data: UpdateQuestion): Promise { 29 | return await test.step(`Updating question with id "${questionId}"`, async () => { 30 | return await this.context.patch(`${APIRoutes.Questions}/${questionId}`, { data }); 31 | }); 32 | } 33 | 34 | async deleteQuestionAPI(questionId: number): Promise { 35 | return await test.step(`Deleting question with id "${questionId}"`, async () => { 36 | return await this.context.delete(`${APIRoutes.Questions}/${questionId}`); 37 | }); 38 | } 39 | 40 | async createQuestion(data: Question): Promise { 41 | const response = await this.createQuestionAPI(data); 42 | await expectStatusCode({ actual: response.status(), expected: 201, api: response.url() }); 43 | 44 | return await response.json(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /core/context/auth-context.ts: -------------------------------------------------------------------------------- 1 | import { APIRequestContext, request } from '@playwright/test'; 2 | import { APIAuth } from '../../utils/types/api/authentication'; 3 | import { getAuthAPIClient } from '../api/authentication-api'; 4 | 5 | export const getAuthAPIContext = async ({ user, authToken }: APIAuth): Promise => { 6 | let extraHTTPHeaders: { [key: string]: string } = { 7 | accept: '*/*', 8 | 'Content-Type': 'application/json' 9 | }; 10 | 11 | if (!user && !authToken) { 12 | throw Error('Provide "user" or "authToken"'); 13 | } 14 | 15 | if (user && !authToken) { 16 | const authClient = await getAuthAPIClient(); 17 | const token = await authClient.getAuthToken(user); 18 | 19 | extraHTTPHeaders = { ...extraHTTPHeaders, Authorization: `Token ${token}` }; 20 | } 21 | if (authToken && !user) { 22 | extraHTTPHeaders = { ...extraHTTPHeaders, Authorization: `Token ${authToken}` }; 23 | } 24 | 25 | return await request.newContext({ 26 | baseURL: process.env.BASE_URL, 27 | extraHTTPHeaders 28 | }); 29 | }; 30 | -------------------------------------------------------------------------------- /core/context/default-context.ts: -------------------------------------------------------------------------------- 1 | import { request } from '@playwright/test'; 2 | 3 | export const getDefaultAPIContext = async () => { 4 | return await request.newContext({ 5 | baseURL: process.env.BASE_URL 6 | }); 7 | }; 8 | -------------------------------------------------------------------------------- /docs/data/behaviors.csv: -------------------------------------------------------------------------------- 1 | "Epic","Feature","Story","FAILED","BROKEN","PASSED","SKIPPED","UNKNOWN" 2 | "","","","0","0","5","0","0" 3 | -------------------------------------------------------------------------------- /docs/data/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "b1a8273437954620fa374b796ffaacdd", 3 | "name" : "behaviors", 4 | "children" : [ { 5 | "name" : "Get question", 6 | "uid" : "a3c42aceeeb62563", 7 | "parentUid" : "b1a8273437954620fa374b796ffaacdd", 8 | "status" : "passed", 9 | "time" : { 10 | "start" : 1677233429658, 11 | "stop" : 1677233431242, 12 | "duration" : 1584 13 | }, 14 | "flaky" : false, 15 | "newFailed" : false, 16 | "parameters" : [ ] 17 | }, { 18 | "name" : "Get questions", 19 | "uid" : "8567092b366540be", 20 | "parentUid" : "b1a8273437954620fa374b796ffaacdd", 21 | "status" : "passed", 22 | "time" : { 23 | "start" : 1677233431248, 24 | "stop" : 1677233431724, 25 | "duration" : 476 26 | }, 27 | "flaky" : false, 28 | "newFailed" : false, 29 | "parameters" : [ ] 30 | }, { 31 | "name" : "Create question", 32 | "uid" : "68e03d051ddb4e1c", 33 | "parentUid" : "b1a8273437954620fa374b796ffaacdd", 34 | "status" : "passed", 35 | "time" : { 36 | "start" : 1677233431726, 37 | "stop" : 1677233432225, 38 | "duration" : 499 39 | }, 40 | "flaky" : false, 41 | "newFailed" : false, 42 | "parameters" : [ ] 43 | }, { 44 | "name" : "Update question", 45 | "uid" : "f9fd5792e6989c0a", 46 | "parentUid" : "b1a8273437954620fa374b796ffaacdd", 47 | "status" : "passed", 48 | "time" : { 49 | "start" : 1677233432227, 50 | "stop" : 1677233433652, 51 | "duration" : 1425 52 | }, 53 | "flaky" : false, 54 | "newFailed" : false, 55 | "parameters" : [ ] 56 | }, { 57 | "name" : "Delete question", 58 | "uid" : "f3351b7df63da083", 59 | "parentUid" : "b1a8273437954620fa374b796ffaacdd", 60 | "status" : "passed", 61 | "time" : { 62 | "start" : 1677233433656, 63 | "stop" : 1677233435549, 64 | "duration" : 1893 65 | }, 66 | "flaky" : false, 67 | "newFailed" : false, 68 | "parameters" : [ ] 69 | } ] 70 | } -------------------------------------------------------------------------------- /docs/data/categories.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Nikita-Filonov/playwright_typescript_api/9c62e54951b019ab6abf8c8e52c2cea34799f6ce/docs/data/categories.csv -------------------------------------------------------------------------------- /docs/data/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "4b4757e66a1912dae1a509f688f20b0f", 3 | "name" : "categories", 4 | "children" : [ ] 5 | } -------------------------------------------------------------------------------- /docs/data/packages.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 3 | "name" : "packages", 4 | "children" : [ { 5 | "name" : "Get question", 6 | "uid" : "a3c42aceeeb62563", 7 | "parentUid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 8 | "status" : "passed", 9 | "time" : { 10 | "start" : 1677233429658, 11 | "stop" : 1677233431242, 12 | "duration" : 1584 13 | }, 14 | "flaky" : false, 15 | "newFailed" : false, 16 | "parameters" : [ ] 17 | }, { 18 | "name" : "Get questions", 19 | "uid" : "8567092b366540be", 20 | "parentUid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 21 | "status" : "passed", 22 | "time" : { 23 | "start" : 1677233431248, 24 | "stop" : 1677233431724, 25 | "duration" : 476 26 | }, 27 | "flaky" : false, 28 | "newFailed" : false, 29 | "parameters" : [ ] 30 | }, { 31 | "name" : "Create question", 32 | "uid" : "68e03d051ddb4e1c", 33 | "parentUid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 34 | "status" : "passed", 35 | "time" : { 36 | "start" : 1677233431726, 37 | "stop" : 1677233432225, 38 | "duration" : 499 39 | }, 40 | "flaky" : false, 41 | "newFailed" : false, 42 | "parameters" : [ ] 43 | }, { 44 | "name" : "Update question", 45 | "uid" : "f9fd5792e6989c0a", 46 | "parentUid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 47 | "status" : "passed", 48 | "time" : { 49 | "start" : 1677233432227, 50 | "stop" : 1677233433652, 51 | "duration" : 1425 52 | }, 53 | "flaky" : false, 54 | "newFailed" : false, 55 | "parameters" : [ ] 56 | }, { 57 | "name" : "Delete question", 58 | "uid" : "f3351b7df63da083", 59 | "parentUid" : "83edc06c07f9ae9e47eb6dd1b683e4e2", 60 | "status" : "passed", 61 | "time" : { 62 | "start" : 1677233433656, 63 | "stop" : 1677233435549, 64 | "duration" : 1893 65 | }, 66 | "flaky" : false, 67 | "newFailed" : false, 68 | "parameters" : [ ] 69 | } ] 70 | } -------------------------------------------------------------------------------- /docs/data/suites.csv: -------------------------------------------------------------------------------- 1 | "Status","Start Time","Stop Time","Duration in ms","Parent Suite","Suite","Sub Suite","Test Class","Test Method","Name","Description" 2 | "passed","Fri Feb 24 13:10:29 MSK 2023","Fri Feb 24 13:10:31 MSK 2023","1584","","questions.spec.ts","Questions","","","Get question","" 3 | "passed","Fri Feb 24 13:10:32 MSK 2023","Fri Feb 24 13:10:33 MSK 2023","1425","","questions.spec.ts","Questions","","","Update question","" 4 | "passed","Fri Feb 24 13:10:33 MSK 2023","Fri Feb 24 13:10:35 MSK 2023","1893","","questions.spec.ts","Questions","","","Delete question","" 5 | "passed","Fri Feb 24 13:10:31 MSK 2023","Fri Feb 24 13:10:32 MSK 2023","499","","questions.spec.ts","Questions","","","Create question","" 6 | "passed","Fri Feb 24 13:10:31 MSK 2023","Fri Feb 24 13:10:31 MSK 2023","476","","questions.spec.ts","Questions","","","Get questions","" 7 | -------------------------------------------------------------------------------- /docs/data/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "98d3104e051c652961429bf95fa0b5d6", 3 | "name" : "suites", 4 | "children" : [ { 5 | "name" : "questions.spec.ts", 6 | "children" : [ { 7 | "name" : "Questions", 8 | "children" : [ { 9 | "name" : "Get question", 10 | "uid" : "a3c42aceeeb62563", 11 | "parentUid" : "5ece7bdcd00e5281d992eeeeb5042c6f", 12 | "status" : "passed", 13 | "time" : { 14 | "start" : 1677233429658, 15 | "stop" : 1677233431242, 16 | "duration" : 1584 17 | }, 18 | "flaky" : false, 19 | "newFailed" : false, 20 | "parameters" : [ ] 21 | }, { 22 | "name" : "Get questions", 23 | "uid" : "8567092b366540be", 24 | "parentUid" : "5ece7bdcd00e5281d992eeeeb5042c6f", 25 | "status" : "passed", 26 | "time" : { 27 | "start" : 1677233431248, 28 | "stop" : 1677233431724, 29 | "duration" : 476 30 | }, 31 | "flaky" : false, 32 | "newFailed" : false, 33 | "parameters" : [ ] 34 | }, { 35 | "name" : "Create question", 36 | "uid" : "68e03d051ddb4e1c", 37 | "parentUid" : "5ece7bdcd00e5281d992eeeeb5042c6f", 38 | "status" : "passed", 39 | "time" : { 40 | "start" : 1677233431726, 41 | "stop" : 1677233432225, 42 | "duration" : 499 43 | }, 44 | "flaky" : false, 45 | "newFailed" : false, 46 | "parameters" : [ ] 47 | }, { 48 | "name" : "Update question", 49 | "uid" : "f9fd5792e6989c0a", 50 | "parentUid" : "5ece7bdcd00e5281d992eeeeb5042c6f", 51 | "status" : "passed", 52 | "time" : { 53 | "start" : 1677233432227, 54 | "stop" : 1677233433652, 55 | "duration" : 1425 56 | }, 57 | "flaky" : false, 58 | "newFailed" : false, 59 | "parameters" : [ ] 60 | }, { 61 | "name" : "Delete question", 62 | "uid" : "f3351b7df63da083", 63 | "parentUid" : "5ece7bdcd00e5281d992eeeeb5042c6f", 64 | "status" : "passed", 65 | "time" : { 66 | "start" : 1677233433656, 67 | "stop" : 1677233435549, 68 | "duration" : 1893 69 | }, 70 | "flaky" : false, 71 | "newFailed" : false, 72 | "parameters" : [ ] 73 | } ], 74 | "uid" : "5ece7bdcd00e5281d992eeeeb5042c6f" 75 | } ], 76 | "uid" : "7ad689d111db14a4212f26197eb3753b" 77 | } ] 78 | } -------------------------------------------------------------------------------- /docs/data/test-cases/68e03d051ddb4e1c.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "68e03d051ddb4e1c", 3 | "name" : "Create question", 4 | "fullName" : "questions.spec.ts#Questions Create question", 5 | "historyId" : "32f9d31b5740072756997893a28ada1d", 6 | "time" : { 7 | "start" : 1677233431726, 8 | "stop" : 1677233432225, 9 | "duration" : 499 10 | }, 11 | "status" : "passed", 12 | "flaky" : false, 13 | "newFailed" : false, 14 | "beforeStages" : [ ], 15 | "testStage" : { 16 | "status" : "passed", 17 | "steps" : [ { 18 | "name" : "Before Hooks", 19 | "time" : { 20 | "start" : 1677233431726, 21 | "stop" : 1677233431731, 22 | "duration" : 5 23 | }, 24 | "status" : "passed", 25 | "steps" : [ ], 26 | "attachments" : [ ], 27 | "parameters" : [ ], 28 | "stepsCount" : 0, 29 | "hasContent" : false, 30 | "shouldDisplayMessage" : false, 31 | "attachmentsCount" : 0 32 | }, { 33 | "name" : "Creating question with id \"3180\"", 34 | "time" : { 35 | "start" : 1677233431731, 36 | "stop" : 1677233432217, 37 | "duration" : 486 38 | }, 39 | "status" : "passed", 40 | "steps" : [ { 41 | "name" : "apiRequestContext.post(/futurama/questions)", 42 | "time" : { 43 | "start" : 1677233431733, 44 | "stop" : 1677233432216, 45 | "duration" : 483 46 | }, 47 | "status" : "passed", 48 | "steps" : [ ], 49 | "attachments" : [ ], 50 | "parameters" : [ ], 51 | "stepsCount" : 0, 52 | "hasContent" : false, 53 | "shouldDisplayMessage" : false, 54 | "attachmentsCount" : 0 55 | } ], 56 | "attachments" : [ ], 57 | "parameters" : [ ], 58 | "stepsCount" : 1, 59 | "hasContent" : true, 60 | "shouldDisplayMessage" : false, 61 | "attachmentsCount" : 0 62 | }, { 63 | "name" : "apiResponse.json", 64 | "time" : { 65 | "start" : 1677233432217, 66 | "stop" : 1677233432218, 67 | "duration" : 1 68 | }, 69 | "status" : "passed", 70 | "steps" : [ ], 71 | "attachments" : [ ], 72 | "parameters" : [ ], 73 | "stepsCount" : 0, 74 | "hasContent" : false, 75 | "shouldDisplayMessage" : false, 76 | "attachmentsCount" : 0 77 | }, { 78 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions\" equal to 201", 79 | "time" : { 80 | "start" : 1677233432218, 81 | "stop" : 1677233432219, 82 | "duration" : 1 83 | }, 84 | "status" : "passed", 85 | "steps" : [ { 86 | "name" : "Checking that \"Response Status code\" is equal to \"201\"", 87 | "time" : { 88 | "start" : 1677233432218, 89 | "stop" : 1677233432219, 90 | "duration" : 1 91 | }, 92 | "status" : "passed", 93 | "steps" : [ { 94 | "name" : "expect.toEqual", 95 | "time" : { 96 | "start" : 1677233432219, 97 | "stop" : 1677233432219, 98 | "duration" : 0 99 | }, 100 | "status" : "passed", 101 | "steps" : [ ], 102 | "attachments" : [ ], 103 | "parameters" : [ ], 104 | "stepsCount" : 0, 105 | "hasContent" : false, 106 | "shouldDisplayMessage" : false, 107 | "attachmentsCount" : 0 108 | } ], 109 | "attachments" : [ ], 110 | "parameters" : [ ], 111 | "stepsCount" : 1, 112 | "hasContent" : true, 113 | "shouldDisplayMessage" : false, 114 | "attachmentsCount" : 0 115 | } ], 116 | "attachments" : [ ], 117 | "parameters" : [ ], 118 | "stepsCount" : 2, 119 | "hasContent" : true, 120 | "shouldDisplayMessage" : false, 121 | "attachmentsCount" : 0 122 | }, { 123 | "name" : "Checking that \"Question \"id\"\" is equal to \"3180\"", 124 | "time" : { 125 | "start" : 1677233432219, 126 | "stop" : 1677233432220, 127 | "duration" : 1 128 | }, 129 | "status" : "passed", 130 | "steps" : [ { 131 | "name" : "expect.toEqual", 132 | "time" : { 133 | "start" : 1677233432220, 134 | "stop" : 1677233432220, 135 | "duration" : 0 136 | }, 137 | "status" : "passed", 138 | "steps" : [ ], 139 | "attachments" : [ ], 140 | "parameters" : [ ], 141 | "stepsCount" : 0, 142 | "hasContent" : false, 143 | "shouldDisplayMessage" : false, 144 | "attachmentsCount" : 0 145 | } ], 146 | "attachments" : [ ], 147 | "parameters" : [ ], 148 | "stepsCount" : 1, 149 | "hasContent" : true, 150 | "shouldDisplayMessage" : false, 151 | "attachmentsCount" : 0 152 | }, { 153 | "name" : "Checking that \"Question \"question\"\" is equal to \"yfL7avzWVbvQJkaqTIAyXBDd\"", 154 | "time" : { 155 | "start" : 1677233432220, 156 | "stop" : 1677233432222, 157 | "duration" : 2 158 | }, 159 | "status" : "passed", 160 | "steps" : [ { 161 | "name" : "expect.toEqual", 162 | "time" : { 163 | "start" : 1677233432221, 164 | "stop" : 1677233432222, 165 | "duration" : 1 166 | }, 167 | "status" : "passed", 168 | "steps" : [ ], 169 | "attachments" : [ ], 170 | "parameters" : [ ], 171 | "stepsCount" : 0, 172 | "hasContent" : false, 173 | "shouldDisplayMessage" : false, 174 | "attachmentsCount" : 0 175 | } ], 176 | "attachments" : [ ], 177 | "parameters" : [ ], 178 | "stepsCount" : 1, 179 | "hasContent" : true, 180 | "shouldDisplayMessage" : false, 181 | "attachmentsCount" : 0 182 | }, { 183 | "name" : "Checking that \"Question \"correctAnswer\"\" is equal to \"h0nGvqPvMyY2V0nSWjMxTpZO\"", 184 | "time" : { 185 | "start" : 1677233432222, 186 | "stop" : 1677233432223, 187 | "duration" : 1 188 | }, 189 | "status" : "passed", 190 | "steps" : [ { 191 | "name" : "expect.toEqual", 192 | "time" : { 193 | "start" : 1677233432223, 194 | "stop" : 1677233432223, 195 | "duration" : 0 196 | }, 197 | "status" : "passed", 198 | "steps" : [ ], 199 | "attachments" : [ ], 200 | "parameters" : [ ], 201 | "stepsCount" : 0, 202 | "hasContent" : false, 203 | "shouldDisplayMessage" : false, 204 | "attachmentsCount" : 0 205 | } ], 206 | "attachments" : [ ], 207 | "parameters" : [ ], 208 | "stepsCount" : 1, 209 | "hasContent" : true, 210 | "shouldDisplayMessage" : false, 211 | "attachmentsCount" : 0 212 | }, { 213 | "name" : "Checking that \"Question \"possibleAnswers\"\" is equal to \"jfwhII6Uph7XiEgxiqomN,x8MUhWkzWtiw1Ud1MKX2idNyb8s,HQiHXXrumM4KEVFQPEMMc2uKt,SXDsQfYi5yXX3vx3hfjGJ,m8iCRFXnUolsNxPWeTjgCz,t8WfJ7n20ZDGedAvCpvf2Vt,7NjX1sj5HUIDnwzZ7nRax,xltHRUtI3MUNQn8kblkaff,ktexGjqRpnBq20di7JVtU,Y0ZPLMHQ5JVHGN6vabW7hXW,38WrD8pgtPmKBTSES4jMT,f2d8GdGF5LOYxBFVBdLeL5sri,NKd4EaDnjFb2ysKoSc1IwXe,SlNZ9vezjgL6jR6PUFx5x,iLEB9ayB6sjf69OwW0hJ,7ocRQO4ZtCmV5aujtda1y7,Wdx7YliwWqvx85e1cO1gpkHG,W5XfdBqvtN8UzrXO0u4brrX0,sRyucMAWlrWes9L3PyF3T,SrBqrS21ENEpIasMY9K545M,gtrNy2ckgeOh18H0wC66lTy,2YPBS66MEt9O6f76VDPo,PGxGsZnveaXhpryyToqGb0C\"", 214 | "time" : { 215 | "start" : 1677233432224, 216 | "stop" : 1677233432224, 217 | "duration" : 0 218 | }, 219 | "status" : "passed", 220 | "steps" : [ { 221 | "name" : "expect.toEqual", 222 | "time" : { 223 | "start" : 1677233432224, 224 | "stop" : 1677233432224, 225 | "duration" : 0 226 | }, 227 | "status" : "passed", 228 | "steps" : [ ], 229 | "attachments" : [ ], 230 | "parameters" : [ ], 231 | "stepsCount" : 0, 232 | "hasContent" : false, 233 | "shouldDisplayMessage" : false, 234 | "attachmentsCount" : 0 235 | } ], 236 | "attachments" : [ ], 237 | "parameters" : [ ], 238 | "stepsCount" : 1, 239 | "hasContent" : true, 240 | "shouldDisplayMessage" : false, 241 | "attachmentsCount" : 0 242 | }, { 243 | "name" : "Validating json schema", 244 | "time" : { 245 | "start" : 1677233432225, 246 | "stop" : 1677233432225, 247 | "duration" : 0 248 | }, 249 | "status" : "passed", 250 | "steps" : [ ], 251 | "attachments" : [ ], 252 | "parameters" : [ ], 253 | "stepsCount" : 0, 254 | "hasContent" : false, 255 | "shouldDisplayMessage" : false, 256 | "attachmentsCount" : 0 257 | }, { 258 | "name" : "After Hooks", 259 | "time" : { 260 | "start" : 1677233432225, 261 | "stop" : 1677233432225, 262 | "duration" : 0 263 | }, 264 | "status" : "passed", 265 | "steps" : [ ], 266 | "attachments" : [ ], 267 | "parameters" : [ ], 268 | "stepsCount" : 0, 269 | "hasContent" : false, 270 | "shouldDisplayMessage" : false, 271 | "attachmentsCount" : 0 272 | } ], 273 | "attachments" : [ ], 274 | "parameters" : [ ], 275 | "stepsCount" : 17, 276 | "hasContent" : true, 277 | "shouldDisplayMessage" : false, 278 | "attachmentsCount" : 0 279 | }, 280 | "afterStages" : [ ], 281 | "labels" : [ { 282 | "name" : "language", 283 | "value" : "JavaScript" 284 | }, { 285 | "name" : "framework", 286 | "value" : "Playwright" 287 | }, { 288 | "name" : "suite", 289 | "value" : "questions.spec.ts" 290 | }, { 291 | "name" : "subSuite", 292 | "value" : "Questions" 293 | }, { 294 | "name" : "host", 295 | "value" : "LAPTOP-VDKHCJMI" 296 | }, { 297 | "name" : "thread", 298 | "value" : "LAPTOP-VDKHCJMI-11508-playwright-worker-0" 299 | }, { 300 | "name" : "resultFormat", 301 | "value" : "allure2" 302 | } ], 303 | "parameters" : [ ], 304 | "links" : [ ], 305 | "hidden" : false, 306 | "retry" : false, 307 | "extra" : { 308 | "severity" : "normal", 309 | "retries" : [ ], 310 | "categories" : [ ], 311 | "tags" : [ ] 312 | }, 313 | "source" : "68e03d051ddb4e1c.json", 314 | "parameterValues" : [ ] 315 | } -------------------------------------------------------------------------------- /docs/data/test-cases/8567092b366540be.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "8567092b366540be", 3 | "name" : "Get questions", 4 | "fullName" : "questions.spec.ts#Questions Get questions", 5 | "historyId" : "828076ce7ca29289e4c9d4190c015e3c", 6 | "time" : { 7 | "start" : 1677233431248, 8 | "stop" : 1677233431724, 9 | "duration" : 476 10 | }, 11 | "status" : "passed", 12 | "flaky" : false, 13 | "newFailed" : false, 14 | "beforeStages" : [ ], 15 | "testStage" : { 16 | "status" : "passed", 17 | "steps" : [ { 18 | "name" : "Before Hooks", 19 | "time" : { 20 | "start" : 1677233431248, 21 | "stop" : 1677233431251, 22 | "duration" : 3 23 | }, 24 | "status" : "passed", 25 | "steps" : [ ], 26 | "attachments" : [ ], 27 | "parameters" : [ ], 28 | "stepsCount" : 0, 29 | "hasContent" : false, 30 | "shouldDisplayMessage" : false, 31 | "attachmentsCount" : 0 32 | }, { 33 | "name" : "Getting questions", 34 | "time" : { 35 | "start" : 1677233431251, 36 | "stop" : 1677233431717, 37 | "duration" : 466 38 | }, 39 | "status" : "passed", 40 | "steps" : [ { 41 | "name" : "apiRequestContext.get(/futurama/questions)", 42 | "time" : { 43 | "start" : 1677233431253, 44 | "stop" : 1677233431717, 45 | "duration" : 464 46 | }, 47 | "status" : "passed", 48 | "steps" : [ ], 49 | "attachments" : [ ], 50 | "parameters" : [ ], 51 | "stepsCount" : 0, 52 | "hasContent" : false, 53 | "shouldDisplayMessage" : false, 54 | "attachmentsCount" : 0 55 | } ], 56 | "attachments" : [ ], 57 | "parameters" : [ ], 58 | "stepsCount" : 1, 59 | "hasContent" : true, 60 | "shouldDisplayMessage" : false, 61 | "attachmentsCount" : 0 62 | }, { 63 | "name" : "apiResponse.json", 64 | "time" : { 65 | "start" : 1677233431718, 66 | "stop" : 1677233431718, 67 | "duration" : 0 68 | }, 69 | "status" : "passed", 70 | "steps" : [ ], 71 | "attachments" : [ ], 72 | "parameters" : [ ], 73 | "stepsCount" : 0, 74 | "hasContent" : false, 75 | "shouldDisplayMessage" : false, 76 | "attachmentsCount" : 0 77 | }, { 78 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions\" equal to 200", 79 | "time" : { 80 | "start" : 1677233431718, 81 | "stop" : 1677233431720, 82 | "duration" : 2 83 | }, 84 | "status" : "passed", 85 | "steps" : [ { 86 | "name" : "Checking that \"Response Status code\" is equal to \"200\"", 87 | "time" : { 88 | "start" : 1677233431718, 89 | "stop" : 1677233431720, 90 | "duration" : 2 91 | }, 92 | "status" : "passed", 93 | "steps" : [ { 94 | "name" : "expect.toEqual", 95 | "time" : { 96 | "start" : 1677233431719, 97 | "stop" : 1677233431720, 98 | "duration" : 1 99 | }, 100 | "status" : "passed", 101 | "steps" : [ ], 102 | "attachments" : [ ], 103 | "parameters" : [ ], 104 | "stepsCount" : 0, 105 | "hasContent" : false, 106 | "shouldDisplayMessage" : false, 107 | "attachmentsCount" : 0 108 | } ], 109 | "attachments" : [ ], 110 | "parameters" : [ ], 111 | "stepsCount" : 1, 112 | "hasContent" : true, 113 | "shouldDisplayMessage" : false, 114 | "attachmentsCount" : 0 115 | } ], 116 | "attachments" : [ ], 117 | "parameters" : [ ], 118 | "stepsCount" : 2, 119 | "hasContent" : true, 120 | "shouldDisplayMessage" : false, 121 | "attachmentsCount" : 0 122 | }, { 123 | "name" : "Validating json schema", 124 | "time" : { 125 | "start" : 1677233431720, 126 | "stop" : 1677233431723, 127 | "duration" : 3 128 | }, 129 | "status" : "passed", 130 | "steps" : [ ], 131 | "attachments" : [ ], 132 | "parameters" : [ ], 133 | "stepsCount" : 0, 134 | "hasContent" : false, 135 | "shouldDisplayMessage" : false, 136 | "attachmentsCount" : 0 137 | }, { 138 | "name" : "After Hooks", 139 | "time" : { 140 | "start" : 1677233431723, 141 | "stop" : 1677233431724, 142 | "duration" : 1 143 | }, 144 | "status" : "passed", 145 | "steps" : [ ], 146 | "attachments" : [ ], 147 | "parameters" : [ ], 148 | "stepsCount" : 0, 149 | "hasContent" : false, 150 | "shouldDisplayMessage" : false, 151 | "attachmentsCount" : 0 152 | } ], 153 | "attachments" : [ ], 154 | "parameters" : [ ], 155 | "stepsCount" : 9, 156 | "hasContent" : true, 157 | "shouldDisplayMessage" : false, 158 | "attachmentsCount" : 0 159 | }, 160 | "afterStages" : [ ], 161 | "labels" : [ { 162 | "name" : "language", 163 | "value" : "JavaScript" 164 | }, { 165 | "name" : "framework", 166 | "value" : "Playwright" 167 | }, { 168 | "name" : "suite", 169 | "value" : "questions.spec.ts" 170 | }, { 171 | "name" : "subSuite", 172 | "value" : "Questions" 173 | }, { 174 | "name" : "host", 175 | "value" : "LAPTOP-VDKHCJMI" 176 | }, { 177 | "name" : "thread", 178 | "value" : "LAPTOP-VDKHCJMI-11508-playwright-worker-0" 179 | }, { 180 | "name" : "resultFormat", 181 | "value" : "allure2" 182 | } ], 183 | "parameters" : [ ], 184 | "links" : [ ], 185 | "hidden" : false, 186 | "retry" : false, 187 | "extra" : { 188 | "severity" : "normal", 189 | "retries" : [ ], 190 | "categories" : [ ], 191 | "tags" : [ ] 192 | }, 193 | "source" : "8567092b366540be.json", 194 | "parameterValues" : [ ] 195 | } -------------------------------------------------------------------------------- /docs/data/test-cases/a3c42aceeeb62563.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "a3c42aceeeb62563", 3 | "name" : "Get question", 4 | "fullName" : "questions.spec.ts#Questions Get question", 5 | "historyId" : "68d7a393444fff5d1761958301b8a903", 6 | "time" : { 7 | "start" : 1677233429658, 8 | "stop" : 1677233431242, 9 | "duration" : 1584 10 | }, 11 | "status" : "passed", 12 | "flaky" : false, 13 | "newFailed" : false, 14 | "beforeStages" : [ ], 15 | "testStage" : { 16 | "status" : "passed", 17 | "steps" : [ { 18 | "name" : "Before Hooks", 19 | "time" : { 20 | "start" : 1677233429659, 21 | "stop" : 1677233430241, 22 | "duration" : 582 23 | }, 24 | "status" : "passed", 25 | "steps" : [ { 26 | "name" : "Creating question with id \"3195\"", 27 | "time" : { 28 | "start" : 1677233429680, 29 | "stop" : 1677233430236, 30 | "duration" : 556 31 | }, 32 | "status" : "passed", 33 | "steps" : [ { 34 | "name" : "apiRequestContext.post(/futurama/questions)", 35 | "time" : { 36 | "start" : 1677233429687, 37 | "stop" : 1677233430236, 38 | "duration" : 549 39 | }, 40 | "status" : "passed", 41 | "steps" : [ ], 42 | "attachments" : [ ], 43 | "parameters" : [ ], 44 | "stepsCount" : 0, 45 | "hasContent" : false, 46 | "shouldDisplayMessage" : false, 47 | "attachmentsCount" : 0 48 | } ], 49 | "attachments" : [ ], 50 | "parameters" : [ ], 51 | "stepsCount" : 1, 52 | "hasContent" : true, 53 | "shouldDisplayMessage" : false, 54 | "attachmentsCount" : 0 55 | }, { 56 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions\" equal to 201", 57 | "time" : { 58 | "start" : 1677233430236, 59 | "stop" : 1677233430240, 60 | "duration" : 4 61 | }, 62 | "status" : "passed", 63 | "steps" : [ { 64 | "name" : "Checking that \"Response Status code\" is equal to \"201\"", 65 | "time" : { 66 | "start" : 1677233430237, 67 | "stop" : 1677233430240, 68 | "duration" : 3 69 | }, 70 | "status" : "passed", 71 | "steps" : [ { 72 | "name" : "expect.toEqual", 73 | "time" : { 74 | "start" : 1677233430239, 75 | "stop" : 1677233430239, 76 | "duration" : 0 77 | }, 78 | "status" : "passed", 79 | "steps" : [ ], 80 | "attachments" : [ ], 81 | "parameters" : [ ], 82 | "stepsCount" : 0, 83 | "hasContent" : false, 84 | "shouldDisplayMessage" : false, 85 | "attachmentsCount" : 0 86 | } ], 87 | "attachments" : [ ], 88 | "parameters" : [ ], 89 | "stepsCount" : 1, 90 | "hasContent" : true, 91 | "shouldDisplayMessage" : false, 92 | "attachmentsCount" : 0 93 | } ], 94 | "attachments" : [ ], 95 | "parameters" : [ ], 96 | "stepsCount" : 2, 97 | "hasContent" : true, 98 | "shouldDisplayMessage" : false, 99 | "attachmentsCount" : 0 100 | }, { 101 | "name" : "apiResponse.json", 102 | "time" : { 103 | "start" : 1677233430240, 104 | "stop" : 1677233430241, 105 | "duration" : 1 106 | }, 107 | "status" : "passed", 108 | "steps" : [ ], 109 | "attachments" : [ ], 110 | "parameters" : [ ], 111 | "stepsCount" : 0, 112 | "hasContent" : false, 113 | "shouldDisplayMessage" : false, 114 | "attachmentsCount" : 0 115 | } ], 116 | "attachments" : [ ], 117 | "parameters" : [ ], 118 | "stepsCount" : 6, 119 | "hasContent" : true, 120 | "shouldDisplayMessage" : false, 121 | "attachmentsCount" : 0 122 | }, { 123 | "name" : "Getting question with id \"3195\"", 124 | "time" : { 125 | "start" : 1677233430241, 126 | "stop" : 1677233430706, 127 | "duration" : 465 128 | }, 129 | "status" : "passed", 130 | "steps" : [ { 131 | "name" : "apiRequestContext.get(/futurama/questions/3195)", 132 | "time" : { 133 | "start" : 1677233430244, 134 | "stop" : 1677233430705, 135 | "duration" : 461 136 | }, 137 | "status" : "passed", 138 | "steps" : [ ], 139 | "attachments" : [ ], 140 | "parameters" : [ ], 141 | "stepsCount" : 0, 142 | "hasContent" : false, 143 | "shouldDisplayMessage" : false, 144 | "attachmentsCount" : 0 145 | } ], 146 | "attachments" : [ ], 147 | "parameters" : [ ], 148 | "stepsCount" : 1, 149 | "hasContent" : true, 150 | "shouldDisplayMessage" : false, 151 | "attachmentsCount" : 0 152 | }, { 153 | "name" : "apiResponse.json", 154 | "time" : { 155 | "start" : 1677233430710, 156 | "stop" : 1677233430712, 157 | "duration" : 2 158 | }, 159 | "status" : "passed", 160 | "steps" : [ ], 161 | "attachments" : [ ], 162 | "parameters" : [ ], 163 | "stepsCount" : 0, 164 | "hasContent" : false, 165 | "shouldDisplayMessage" : false, 166 | "attachmentsCount" : 0 167 | }, { 168 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions/3195\" equal to 200", 169 | "time" : { 170 | "start" : 1677233430713, 171 | "stop" : 1677233430717, 172 | "duration" : 4 173 | }, 174 | "status" : "passed", 175 | "steps" : [ { 176 | "name" : "Checking that \"Response Status code\" is equal to \"200\"", 177 | "time" : { 178 | "start" : 1677233430713, 179 | "stop" : 1677233430717, 180 | "duration" : 4 181 | }, 182 | "status" : "passed", 183 | "steps" : [ { 184 | "name" : "expect.toEqual", 185 | "time" : { 186 | "start" : 1677233430716, 187 | "stop" : 1677233430716, 188 | "duration" : 0 189 | }, 190 | "status" : "passed", 191 | "steps" : [ ], 192 | "attachments" : [ ], 193 | "parameters" : [ ], 194 | "stepsCount" : 0, 195 | "hasContent" : false, 196 | "shouldDisplayMessage" : false, 197 | "attachmentsCount" : 0 198 | } ], 199 | "attachments" : [ ], 200 | "parameters" : [ ], 201 | "stepsCount" : 1, 202 | "hasContent" : true, 203 | "shouldDisplayMessage" : false, 204 | "attachmentsCount" : 0 205 | } ], 206 | "attachments" : [ ], 207 | "parameters" : [ ], 208 | "stepsCount" : 2, 209 | "hasContent" : true, 210 | "shouldDisplayMessage" : false, 211 | "attachmentsCount" : 0 212 | }, { 213 | "name" : "Checking that \"Question \"id\"\" is equal to \"3195\"", 214 | "time" : { 215 | "start" : 1677233430718, 216 | "stop" : 1677233430721, 217 | "duration" : 3 218 | }, 219 | "status" : "passed", 220 | "steps" : [ { 221 | "name" : "expect.toEqual", 222 | "time" : { 223 | "start" : 1677233430721, 224 | "stop" : 1677233430721, 225 | "duration" : 0 226 | }, 227 | "status" : "passed", 228 | "steps" : [ ], 229 | "attachments" : [ ], 230 | "parameters" : [ ], 231 | "stepsCount" : 0, 232 | "hasContent" : false, 233 | "shouldDisplayMessage" : false, 234 | "attachmentsCount" : 0 235 | } ], 236 | "attachments" : [ ], 237 | "parameters" : [ ], 238 | "stepsCount" : 1, 239 | "hasContent" : true, 240 | "shouldDisplayMessage" : false, 241 | "attachmentsCount" : 0 242 | }, { 243 | "name" : "Checking that \"Question \"question\"\" is equal to \"gVoHIcPSgz8YyqTVzPZs56Nw\"", 244 | "time" : { 245 | "start" : 1677233430722, 246 | "stop" : 1677233430723, 247 | "duration" : 1 248 | }, 249 | "status" : "passed", 250 | "steps" : [ { 251 | "name" : "expect.toEqual", 252 | "time" : { 253 | "start" : 1677233430723, 254 | "stop" : 1677233430723, 255 | "duration" : 0 256 | }, 257 | "status" : "passed", 258 | "steps" : [ ], 259 | "attachments" : [ ], 260 | "parameters" : [ ], 261 | "stepsCount" : 0, 262 | "hasContent" : false, 263 | "shouldDisplayMessage" : false, 264 | "attachmentsCount" : 0 265 | } ], 266 | "attachments" : [ ], 267 | "parameters" : [ ], 268 | "stepsCount" : 1, 269 | "hasContent" : true, 270 | "shouldDisplayMessage" : false, 271 | "attachmentsCount" : 0 272 | }, { 273 | "name" : "Checking that \"Question \"correctAnswer\"\" is equal to \"ILfdI6vI4QBLb1iWs04QhzB\"", 274 | "time" : { 275 | "start" : 1677233430724, 276 | "stop" : 1677233430725, 277 | "duration" : 1 278 | }, 279 | "status" : "passed", 280 | "steps" : [ { 281 | "name" : "expect.toEqual", 282 | "time" : { 283 | "start" : 1677233430724, 284 | "stop" : 1677233430725, 285 | "duration" : 1 286 | }, 287 | "status" : "passed", 288 | "steps" : [ ], 289 | "attachments" : [ ], 290 | "parameters" : [ ], 291 | "stepsCount" : 0, 292 | "hasContent" : false, 293 | "shouldDisplayMessage" : false, 294 | "attachmentsCount" : 0 295 | } ], 296 | "attachments" : [ ], 297 | "parameters" : [ ], 298 | "stepsCount" : 1, 299 | "hasContent" : true, 300 | "shouldDisplayMessage" : false, 301 | "attachmentsCount" : 0 302 | }, { 303 | "name" : "Checking that \"Question \"possibleAnswers\"\" is equal to \"6Y2KlZaGvH9rv15awjJFI21,T3WnjswdmthT5W1xXGGXHDK,InJMEXvuwRw0Hyakz4YIjBKPcmE,OZcSJHZJ8stnIyJbXsgIeRx6z,tSdbBavvKkhD91nhbj9u1z,WKjlaWYRQf2bPuznipcsVnOI0d,OaMbrKqJNhdxh9O4dYKAzREwRmpFb,K5E05A9ULXI024h6BzmOJnY,jX5HdgVhMYJxzSR2cSSP0v,9lGZ4HDTr80v79gN47kE5,XAY8jF5pclfLsD0EVD3PREf,m06f5AgkNCIMXglIQNXaWpD6RP,kM0IrS6tJI4Uq3grUlHy58YY,q7WnVihAfUDK1cm7wtLRWL1p,ZmVM9ikRUtOSgtw7GtTRgqKUjeg,aL6mRuQDYcVUKj3ZmVPtDRYX,PXS6A0BRrJTEmBY8QVZw,mc73zhERYuREt0YTj2m5M,xU82KJXbIjPW57xloeUDqdq,4Hbv64XzH8p77Rhb7NDi6A,sH1q19p9V5OCkospJMluPG3z,haTKdDoI8suNV4lJy3EM,IjJrVYVsxvIrc3zKC1EmV0e,U70e8m04wlRkmFeWlpJS3,pIvsHJIh9N4wlvRrRvQddyp\"", 304 | "time" : { 305 | "start" : 1677233430725, 306 | "stop" : 1677233430727, 307 | "duration" : 2 308 | }, 309 | "status" : "passed", 310 | "steps" : [ { 311 | "name" : "expect.toEqual", 312 | "time" : { 313 | "start" : 1677233430726, 314 | "stop" : 1677233430727, 315 | "duration" : 1 316 | }, 317 | "status" : "passed", 318 | "steps" : [ ], 319 | "attachments" : [ ], 320 | "parameters" : [ ], 321 | "stepsCount" : 0, 322 | "hasContent" : false, 323 | "shouldDisplayMessage" : false, 324 | "attachmentsCount" : 0 325 | } ], 326 | "attachments" : [ ], 327 | "parameters" : [ ], 328 | "stepsCount" : 1, 329 | "hasContent" : true, 330 | "shouldDisplayMessage" : false, 331 | "attachmentsCount" : 0 332 | }, { 333 | "name" : "Validating json schema", 334 | "time" : { 335 | "start" : 1677233430728, 336 | "stop" : 1677233430764, 337 | "duration" : 36 338 | }, 339 | "status" : "passed", 340 | "steps" : [ ], 341 | "attachments" : [ ], 342 | "parameters" : [ ], 343 | "stepsCount" : 0, 344 | "hasContent" : false, 345 | "shouldDisplayMessage" : false, 346 | "attachmentsCount" : 0 347 | }, { 348 | "name" : "After Hooks", 349 | "time" : { 350 | "start" : 1677233430765, 351 | "stop" : 1677233431241, 352 | "duration" : 476 353 | }, 354 | "status" : "passed", 355 | "steps" : [ { 356 | "name" : "Deleting question with id \"3195\"", 357 | "time" : { 358 | "start" : 1677233430768, 359 | "stop" : 1677233431239, 360 | "duration" : 471 361 | }, 362 | "status" : "passed", 363 | "steps" : [ { 364 | "name" : "apiRequestContext.delete(/futurama/questions/3195)", 365 | "time" : { 366 | "start" : 1677233430770, 367 | "stop" : 1677233431239, 368 | "duration" : 469 369 | }, 370 | "status" : "passed", 371 | "steps" : [ ], 372 | "attachments" : [ ], 373 | "parameters" : [ ], 374 | "stepsCount" : 0, 375 | "hasContent" : false, 376 | "shouldDisplayMessage" : false, 377 | "attachmentsCount" : 0 378 | } ], 379 | "attachments" : [ ], 380 | "parameters" : [ ], 381 | "stepsCount" : 1, 382 | "hasContent" : true, 383 | "shouldDisplayMessage" : false, 384 | "attachmentsCount" : 0 385 | } ], 386 | "attachments" : [ ], 387 | "parameters" : [ ], 388 | "stepsCount" : 2, 389 | "hasContent" : true, 390 | "shouldDisplayMessage" : false, 391 | "attachmentsCount" : 0 392 | } ], 393 | "attachments" : [ ], 394 | "parameters" : [ ], 395 | "stepsCount" : 25, 396 | "hasContent" : true, 397 | "shouldDisplayMessage" : false, 398 | "attachmentsCount" : 0 399 | }, 400 | "afterStages" : [ ], 401 | "labels" : [ { 402 | "name" : "language", 403 | "value" : "JavaScript" 404 | }, { 405 | "name" : "framework", 406 | "value" : "Playwright" 407 | }, { 408 | "name" : "suite", 409 | "value" : "questions.spec.ts" 410 | }, { 411 | "name" : "subSuite", 412 | "value" : "Questions" 413 | }, { 414 | "name" : "host", 415 | "value" : "LAPTOP-VDKHCJMI" 416 | }, { 417 | "name" : "thread", 418 | "value" : "LAPTOP-VDKHCJMI-11508-playwright-worker-0" 419 | }, { 420 | "name" : "resultFormat", 421 | "value" : "allure2" 422 | } ], 423 | "parameters" : [ ], 424 | "links" : [ ], 425 | "hidden" : false, 426 | "retry" : false, 427 | "extra" : { 428 | "severity" : "normal", 429 | "retries" : [ ], 430 | "categories" : [ ], 431 | "tags" : [ ] 432 | }, 433 | "source" : "a3c42aceeeb62563.json", 434 | "parameterValues" : [ ] 435 | } -------------------------------------------------------------------------------- /docs/data/test-cases/f3351b7df63da083.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "f3351b7df63da083", 3 | "name" : "Delete question", 4 | "fullName" : "questions.spec.ts#Questions Delete question", 5 | "historyId" : "6bce9d0d784c5a3499066099e187bcf1", 6 | "time" : { 7 | "start" : 1677233433656, 8 | "stop" : 1677233435549, 9 | "duration" : 1893 10 | }, 11 | "status" : "passed", 12 | "flaky" : false, 13 | "newFailed" : false, 14 | "beforeStages" : [ ], 15 | "testStage" : { 16 | "status" : "passed", 17 | "steps" : [ { 18 | "name" : "Before Hooks", 19 | "time" : { 20 | "start" : 1677233433657, 21 | "stop" : 1677233434122, 22 | "duration" : 465 23 | }, 24 | "status" : "passed", 25 | "steps" : [ { 26 | "name" : "Creating question with id \"3324\"", 27 | "time" : { 28 | "start" : 1677233433662, 29 | "stop" : 1677233434115, 30 | "duration" : 453 31 | }, 32 | "status" : "passed", 33 | "steps" : [ { 34 | "name" : "apiRequestContext.post(/futurama/questions)", 35 | "time" : { 36 | "start" : 1677233433663, 37 | "stop" : 1677233434114, 38 | "duration" : 451 39 | }, 40 | "status" : "passed", 41 | "steps" : [ ], 42 | "attachments" : [ ], 43 | "parameters" : [ ], 44 | "stepsCount" : 0, 45 | "hasContent" : false, 46 | "shouldDisplayMessage" : false, 47 | "attachmentsCount" : 0 48 | } ], 49 | "attachments" : [ ], 50 | "parameters" : [ ], 51 | "stepsCount" : 1, 52 | "hasContent" : true, 53 | "shouldDisplayMessage" : false, 54 | "attachmentsCount" : 0 55 | }, { 56 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions\" equal to 201", 57 | "time" : { 58 | "start" : 1677233434116, 59 | "stop" : 1677233434121, 60 | "duration" : 5 61 | }, 62 | "status" : "passed", 63 | "steps" : [ { 64 | "name" : "Checking that \"Response Status code\" is equal to \"201\"", 65 | "time" : { 66 | "start" : 1677233434116, 67 | "stop" : 1677233434120, 68 | "duration" : 4 69 | }, 70 | "status" : "passed", 71 | "steps" : [ { 72 | "name" : "expect.toEqual", 73 | "time" : { 74 | "start" : 1677233434119, 75 | "stop" : 1677233434120, 76 | "duration" : 1 77 | }, 78 | "status" : "passed", 79 | "steps" : [ ], 80 | "attachments" : [ ], 81 | "parameters" : [ ], 82 | "stepsCount" : 0, 83 | "hasContent" : false, 84 | "shouldDisplayMessage" : false, 85 | "attachmentsCount" : 0 86 | } ], 87 | "attachments" : [ ], 88 | "parameters" : [ ], 89 | "stepsCount" : 1, 90 | "hasContent" : true, 91 | "shouldDisplayMessage" : false, 92 | "attachmentsCount" : 0 93 | } ], 94 | "attachments" : [ ], 95 | "parameters" : [ ], 96 | "stepsCount" : 2, 97 | "hasContent" : true, 98 | "shouldDisplayMessage" : false, 99 | "attachmentsCount" : 0 100 | }, { 101 | "name" : "apiResponse.json", 102 | "time" : { 103 | "start" : 1677233434121, 104 | "stop" : 1677233434122, 105 | "duration" : 1 106 | }, 107 | "status" : "passed", 108 | "steps" : [ ], 109 | "attachments" : [ ], 110 | "parameters" : [ ], 111 | "stepsCount" : 0, 112 | "hasContent" : false, 113 | "shouldDisplayMessage" : false, 114 | "attachmentsCount" : 0 115 | } ], 116 | "attachments" : [ ], 117 | "parameters" : [ ], 118 | "stepsCount" : 6, 119 | "hasContent" : true, 120 | "shouldDisplayMessage" : false, 121 | "attachmentsCount" : 0 122 | }, { 123 | "name" : "Deleting question with id \"3324\"", 124 | "time" : { 125 | "start" : 1677233434122, 126 | "stop" : 1677233434588, 127 | "duration" : 466 128 | }, 129 | "status" : "passed", 130 | "steps" : [ { 131 | "name" : "apiRequestContext.delete(/futurama/questions/3324)", 132 | "time" : { 133 | "start" : 1677233434124, 134 | "stop" : 1677233434588, 135 | "duration" : 464 136 | }, 137 | "status" : "passed", 138 | "steps" : [ ], 139 | "attachments" : [ ], 140 | "parameters" : [ ], 141 | "stepsCount" : 0, 142 | "hasContent" : false, 143 | "shouldDisplayMessage" : false, 144 | "attachmentsCount" : 0 145 | } ], 146 | "attachments" : [ ], 147 | "parameters" : [ ], 148 | "stepsCount" : 1, 149 | "hasContent" : true, 150 | "shouldDisplayMessage" : false, 151 | "attachmentsCount" : 0 152 | }, { 153 | "name" : "Getting question with id \"3324\"", 154 | "time" : { 155 | "start" : 1677233434589, 156 | "stop" : 1677233435061, 157 | "duration" : 472 158 | }, 159 | "status" : "passed", 160 | "steps" : [ { 161 | "name" : "apiRequestContext.get(/futurama/questions/3324)", 162 | "time" : { 163 | "start" : 1677233434595, 164 | "stop" : 1677233435060, 165 | "duration" : 465 166 | }, 167 | "status" : "passed", 168 | "steps" : [ ], 169 | "attachments" : [ ], 170 | "parameters" : [ ], 171 | "stepsCount" : 0, 172 | "hasContent" : false, 173 | "shouldDisplayMessage" : false, 174 | "attachmentsCount" : 0 175 | } ], 176 | "attachments" : [ ], 177 | "parameters" : [ ], 178 | "stepsCount" : 1, 179 | "hasContent" : true, 180 | "shouldDisplayMessage" : false, 181 | "attachmentsCount" : 0 182 | }, { 183 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions/3324\" equal to 404", 184 | "time" : { 185 | "start" : 1677233435061, 186 | "stop" : 1677233435067, 187 | "duration" : 6 188 | }, 189 | "status" : "passed", 190 | "steps" : [ { 191 | "name" : "Checking that \"Response Status code\" is equal to \"404\"", 192 | "time" : { 193 | "start" : 1677233435062, 194 | "stop" : 1677233435067, 195 | "duration" : 5 196 | }, 197 | "status" : "passed", 198 | "steps" : [ { 199 | "name" : "expect.toEqual", 200 | "time" : { 201 | "start" : 1677233435066, 202 | "stop" : 1677233435066, 203 | "duration" : 0 204 | }, 205 | "status" : "passed", 206 | "steps" : [ ], 207 | "attachments" : [ ], 208 | "parameters" : [ ], 209 | "stepsCount" : 0, 210 | "hasContent" : false, 211 | "shouldDisplayMessage" : false, 212 | "attachmentsCount" : 0 213 | } ], 214 | "attachments" : [ ], 215 | "parameters" : [ ], 216 | "stepsCount" : 1, 217 | "hasContent" : true, 218 | "shouldDisplayMessage" : false, 219 | "attachmentsCount" : 0 220 | } ], 221 | "attachments" : [ ], 222 | "parameters" : [ ], 223 | "stepsCount" : 2, 224 | "hasContent" : true, 225 | "shouldDisplayMessage" : false, 226 | "attachmentsCount" : 0 227 | }, { 228 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions/3324\" equal to 200", 229 | "time" : { 230 | "start" : 1677233435068, 231 | "stop" : 1677233435074, 232 | "duration" : 6 233 | }, 234 | "status" : "passed", 235 | "steps" : [ { 236 | "name" : "Checking that \"Response Status code\" is equal to \"200\"", 237 | "time" : { 238 | "start" : 1677233435068, 239 | "stop" : 1677233435073, 240 | "duration" : 5 241 | }, 242 | "status" : "passed", 243 | "steps" : [ { 244 | "name" : "expect.toEqual", 245 | "time" : { 246 | "start" : 1677233435072, 247 | "stop" : 1677233435073, 248 | "duration" : 1 249 | }, 250 | "status" : "passed", 251 | "steps" : [ ], 252 | "attachments" : [ ], 253 | "parameters" : [ ], 254 | "stepsCount" : 0, 255 | "hasContent" : false, 256 | "shouldDisplayMessage" : false, 257 | "attachmentsCount" : 0 258 | } ], 259 | "attachments" : [ ], 260 | "parameters" : [ ], 261 | "stepsCount" : 1, 262 | "hasContent" : true, 263 | "shouldDisplayMessage" : false, 264 | "attachmentsCount" : 0 265 | } ], 266 | "attachments" : [ ], 267 | "parameters" : [ ], 268 | "stepsCount" : 2, 269 | "hasContent" : true, 270 | "shouldDisplayMessage" : false, 271 | "attachmentsCount" : 0 272 | }, { 273 | "name" : "After Hooks", 274 | "time" : { 275 | "start" : 1677233435074, 276 | "stop" : 1677233435548, 277 | "duration" : 474 278 | }, 279 | "status" : "passed", 280 | "steps" : [ { 281 | "name" : "Deleting question with id \"3324\"", 282 | "time" : { 283 | "start" : 1677233435075, 284 | "stop" : 1677233435547, 285 | "duration" : 472 286 | }, 287 | "status" : "passed", 288 | "steps" : [ { 289 | "name" : "apiRequestContext.delete(/futurama/questions/3324)", 290 | "time" : { 291 | "start" : 1677233435079, 292 | "stop" : 1677233435546, 293 | "duration" : 467 294 | }, 295 | "status" : "passed", 296 | "steps" : [ ], 297 | "attachments" : [ ], 298 | "parameters" : [ ], 299 | "stepsCount" : 0, 300 | "hasContent" : false, 301 | "shouldDisplayMessage" : false, 302 | "attachmentsCount" : 0 303 | } ], 304 | "attachments" : [ ], 305 | "parameters" : [ ], 306 | "stepsCount" : 1, 307 | "hasContent" : true, 308 | "shouldDisplayMessage" : false, 309 | "attachmentsCount" : 0 310 | } ], 311 | "attachments" : [ ], 312 | "parameters" : [ ], 313 | "stepsCount" : 2, 314 | "hasContent" : true, 315 | "shouldDisplayMessage" : false, 316 | "attachmentsCount" : 0 317 | } ], 318 | "attachments" : [ ], 319 | "parameters" : [ ], 320 | "stepsCount" : 20, 321 | "hasContent" : true, 322 | "shouldDisplayMessage" : false, 323 | "attachmentsCount" : 0 324 | }, 325 | "afterStages" : [ ], 326 | "labels" : [ { 327 | "name" : "language", 328 | "value" : "JavaScript" 329 | }, { 330 | "name" : "framework", 331 | "value" : "Playwright" 332 | }, { 333 | "name" : "suite", 334 | "value" : "questions.spec.ts" 335 | }, { 336 | "name" : "subSuite", 337 | "value" : "Questions" 338 | }, { 339 | "name" : "host", 340 | "value" : "LAPTOP-VDKHCJMI" 341 | }, { 342 | "name" : "thread", 343 | "value" : "LAPTOP-VDKHCJMI-11508-playwright-worker-0" 344 | }, { 345 | "name" : "resultFormat", 346 | "value" : "allure2" 347 | } ], 348 | "parameters" : [ ], 349 | "links" : [ ], 350 | "hidden" : false, 351 | "retry" : false, 352 | "extra" : { 353 | "severity" : "normal", 354 | "retries" : [ ], 355 | "categories" : [ ], 356 | "tags" : [ ] 357 | }, 358 | "source" : "f3351b7df63da083.json", 359 | "parameterValues" : [ ] 360 | } -------------------------------------------------------------------------------- /docs/data/test-cases/f9fd5792e6989c0a.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "f9fd5792e6989c0a", 3 | "name" : "Update question", 4 | "fullName" : "questions.spec.ts#Questions Update question", 5 | "historyId" : "3d26f904d8441550bf9463575fd538cd", 6 | "time" : { 7 | "start" : 1677233432227, 8 | "stop" : 1677233433652, 9 | "duration" : 1425 10 | }, 11 | "status" : "passed", 12 | "flaky" : false, 13 | "newFailed" : false, 14 | "beforeStages" : [ ], 15 | "testStage" : { 16 | "status" : "passed", 17 | "steps" : [ { 18 | "name" : "Before Hooks", 19 | "time" : { 20 | "start" : 1677233432228, 21 | "stop" : 1677233432703, 22 | "duration" : 475 23 | }, 24 | "status" : "passed", 25 | "steps" : [ { 26 | "name" : "Creating question with id \"2022\"", 27 | "time" : { 28 | "start" : 1677233432230, 29 | "stop" : 1677233432700, 30 | "duration" : 470 31 | }, 32 | "status" : "passed", 33 | "steps" : [ { 34 | "name" : "apiRequestContext.post(/futurama/questions)", 35 | "time" : { 36 | "start" : 1677233432231, 37 | "stop" : 1677233432699, 38 | "duration" : 468 39 | }, 40 | "status" : "passed", 41 | "steps" : [ ], 42 | "attachments" : [ ], 43 | "parameters" : [ ], 44 | "stepsCount" : 0, 45 | "hasContent" : false, 46 | "shouldDisplayMessage" : false, 47 | "attachmentsCount" : 0 48 | } ], 49 | "attachments" : [ ], 50 | "parameters" : [ ], 51 | "stepsCount" : 1, 52 | "hasContent" : true, 53 | "shouldDisplayMessage" : false, 54 | "attachmentsCount" : 0 55 | }, { 56 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions\" equal to 201", 57 | "time" : { 58 | "start" : 1677233432700, 59 | "stop" : 1677233432703, 60 | "duration" : 3 61 | }, 62 | "status" : "passed", 63 | "steps" : [ { 64 | "name" : "Checking that \"Response Status code\" is equal to \"201\"", 65 | "time" : { 66 | "start" : 1677233432700, 67 | "stop" : 1677233432702, 68 | "duration" : 2 69 | }, 70 | "status" : "passed", 71 | "steps" : [ { 72 | "name" : "expect.toEqual", 73 | "time" : { 74 | "start" : 1677233432702, 75 | "stop" : 1677233432702, 76 | "duration" : 0 77 | }, 78 | "status" : "passed", 79 | "steps" : [ ], 80 | "attachments" : [ ], 81 | "parameters" : [ ], 82 | "stepsCount" : 0, 83 | "hasContent" : false, 84 | "shouldDisplayMessage" : false, 85 | "attachmentsCount" : 0 86 | } ], 87 | "attachments" : [ ], 88 | "parameters" : [ ], 89 | "stepsCount" : 1, 90 | "hasContent" : true, 91 | "shouldDisplayMessage" : false, 92 | "attachmentsCount" : 0 93 | } ], 94 | "attachments" : [ ], 95 | "parameters" : [ ], 96 | "stepsCount" : 2, 97 | "hasContent" : true, 98 | "shouldDisplayMessage" : false, 99 | "attachmentsCount" : 0 100 | }, { 101 | "name" : "apiResponse.json", 102 | "time" : { 103 | "start" : 1677233432703, 104 | "stop" : 1677233432703, 105 | "duration" : 0 106 | }, 107 | "status" : "passed", 108 | "steps" : [ ], 109 | "attachments" : [ ], 110 | "parameters" : [ ], 111 | "stepsCount" : 0, 112 | "hasContent" : false, 113 | "shouldDisplayMessage" : false, 114 | "attachmentsCount" : 0 115 | } ], 116 | "attachments" : [ ], 117 | "parameters" : [ ], 118 | "stepsCount" : 6, 119 | "hasContent" : true, 120 | "shouldDisplayMessage" : false, 121 | "attachmentsCount" : 0 122 | }, { 123 | "name" : "Updating question with id \"2022\"", 124 | "time" : { 125 | "start" : 1677233432704, 126 | "stop" : 1677233433170, 127 | "duration" : 466 128 | }, 129 | "status" : "passed", 130 | "steps" : [ { 131 | "name" : "apiRequestContext.patch(/futurama/questions/2022)", 132 | "time" : { 133 | "start" : 1677233432706, 134 | "stop" : 1677233433170, 135 | "duration" : 464 136 | }, 137 | "status" : "passed", 138 | "steps" : [ ], 139 | "attachments" : [ ], 140 | "parameters" : [ ], 141 | "stepsCount" : 0, 142 | "hasContent" : false, 143 | "shouldDisplayMessage" : false, 144 | "attachmentsCount" : 0 145 | } ], 146 | "attachments" : [ ], 147 | "parameters" : [ ], 148 | "stepsCount" : 1, 149 | "hasContent" : true, 150 | "shouldDisplayMessage" : false, 151 | "attachmentsCount" : 0 152 | }, { 153 | "name" : "apiResponse.json", 154 | "time" : { 155 | "start" : 1677233433171, 156 | "stop" : 1677233433172, 157 | "duration" : 1 158 | }, 159 | "status" : "passed", 160 | "steps" : [ ], 161 | "attachments" : [ ], 162 | "parameters" : [ ], 163 | "stepsCount" : 0, 164 | "hasContent" : false, 165 | "shouldDisplayMessage" : false, 166 | "attachmentsCount" : 0 167 | }, { 168 | "name" : "Checking that response status code for API \"https://api.sampleapis.com/futurama/questions/2022\" equal to 200", 169 | "time" : { 170 | "start" : 1677233433172, 171 | "stop" : 1677233433173, 172 | "duration" : 1 173 | }, 174 | "status" : "passed", 175 | "steps" : [ { 176 | "name" : "Checking that \"Response Status code\" is equal to \"200\"", 177 | "time" : { 178 | "start" : 1677233433172, 179 | "stop" : 1677233433173, 180 | "duration" : 1 181 | }, 182 | "status" : "passed", 183 | "steps" : [ { 184 | "name" : "expect.toEqual", 185 | "time" : { 186 | "start" : 1677233433173, 187 | "stop" : 1677233433173, 188 | "duration" : 0 189 | }, 190 | "status" : "passed", 191 | "steps" : [ ], 192 | "attachments" : [ ], 193 | "parameters" : [ ], 194 | "stepsCount" : 0, 195 | "hasContent" : false, 196 | "shouldDisplayMessage" : false, 197 | "attachmentsCount" : 0 198 | } ], 199 | "attachments" : [ ], 200 | "parameters" : [ ], 201 | "stepsCount" : 1, 202 | "hasContent" : true, 203 | "shouldDisplayMessage" : false, 204 | "attachmentsCount" : 0 205 | } ], 206 | "attachments" : [ ], 207 | "parameters" : [ ], 208 | "stepsCount" : 2, 209 | "hasContent" : true, 210 | "shouldDisplayMessage" : false, 211 | "attachmentsCount" : 0 212 | }, { 213 | "name" : "Checking that \"Question \"question\"\" is equal to \"d5eHAOKWPoVwo12DqxYoMs5\"", 214 | "time" : { 215 | "start" : 1677233433173, 216 | "stop" : 1677233433175, 217 | "duration" : 2 218 | }, 219 | "status" : "passed", 220 | "steps" : [ { 221 | "name" : "expect.toEqual", 222 | "time" : { 223 | "start" : 1677233433174, 224 | "stop" : 1677233433174, 225 | "duration" : 0 226 | }, 227 | "status" : "passed", 228 | "steps" : [ ], 229 | "attachments" : [ ], 230 | "parameters" : [ ], 231 | "stepsCount" : 0, 232 | "hasContent" : false, 233 | "shouldDisplayMessage" : false, 234 | "attachmentsCount" : 0 235 | } ], 236 | "attachments" : [ ], 237 | "parameters" : [ ], 238 | "stepsCount" : 1, 239 | "hasContent" : true, 240 | "shouldDisplayMessage" : false, 241 | "attachmentsCount" : 0 242 | }, { 243 | "name" : "Checking that \"Question \"correctAnswer\"\" is equal to \"BVGMKuQudTm5irypy00lbW\"", 244 | "time" : { 245 | "start" : 1677233433175, 246 | "stop" : 1677233433176, 247 | "duration" : 1 248 | }, 249 | "status" : "passed", 250 | "steps" : [ { 251 | "name" : "expect.toEqual", 252 | "time" : { 253 | "start" : 1677233433176, 254 | "stop" : 1677233433176, 255 | "duration" : 0 256 | }, 257 | "status" : "passed", 258 | "steps" : [ ], 259 | "attachments" : [ ], 260 | "parameters" : [ ], 261 | "stepsCount" : 0, 262 | "hasContent" : false, 263 | "shouldDisplayMessage" : false, 264 | "attachmentsCount" : 0 265 | } ], 266 | "attachments" : [ ], 267 | "parameters" : [ ], 268 | "stepsCount" : 1, 269 | "hasContent" : true, 270 | "shouldDisplayMessage" : false, 271 | "attachmentsCount" : 0 272 | }, { 273 | "name" : "Checking that \"Question \"possibleAnswers\"\" is equal to \"uYapQTIZGGcDE0y6dawooF4,8QXONjmcGPxGszvEq19vua,4XeZNfM9D3WFWELNG9jt4zg0,GbwfdF5lHPfkGbBQMuTZxCbe,rnY0iKoJk5bmrvSKNle07mP,tykNy54h0AtoaNevp78BmAm,KvCbUstpjt3KSggOUJj8yf,82iZqVE0E2zQpGhdJIX9FHFhD,Oz1bGpQS1hvLqxub6hpU14qwJ,JJIuyDPbQ4VNO9r2NirvHv,JBRKm8NLwpK7gBc9LUogK59mk,8WYLkY3Jxi3UX9PGp1b9Ppe,c12Ldix2SV3o08Z3hPjfQd,zEYKFT94P8yQ9ocXn1OPDw,iFHXAabb8uGFmlCbf5uF9,E66mMmSIdc2PrX6wYJ5F20bPE8,1b9fheK571lSmmaTrg6lbpo,t4ZAQHrbaQpXDPwcwiDTR81,FplUavnt5qPsBuBaodkuL,lI67OLVkk3ijKc7oDzD0NAR6,SyHOsX0QDkq4vsPYHwzO9XCCFm,vpajJYO6w2q7C8fsljVXZ2xPRscv,49Z7pQZB94HDfkkOpLKED,8jFXyrFNVJdUZgm2VFzLhpyRZf,cjltWwSsoA0FlaD4bqiRVC,yOqcI9JrZSPnKD3Lzly3X4,W4Qt0Zyepm90qJCbyBf7N,7ugujIg4cy6X9mQPmLISNL59,MkCiLUbWa5qoWvXvcxNIbSuW,6ekKSRBEg5bBCF8G2yZYDeF5\"", 274 | "time" : { 275 | "start" : 1677233433176, 276 | "stop" : 1677233433177, 277 | "duration" : 1 278 | }, 279 | "status" : "passed", 280 | "steps" : [ { 281 | "name" : "expect.toEqual", 282 | "time" : { 283 | "start" : 1677233433177, 284 | "stop" : 1677233433177, 285 | "duration" : 0 286 | }, 287 | "status" : "passed", 288 | "steps" : [ ], 289 | "attachments" : [ ], 290 | "parameters" : [ ], 291 | "stepsCount" : 0, 292 | "hasContent" : false, 293 | "shouldDisplayMessage" : false, 294 | "attachmentsCount" : 0 295 | } ], 296 | "attachments" : [ ], 297 | "parameters" : [ ], 298 | "stepsCount" : 1, 299 | "hasContent" : true, 300 | "shouldDisplayMessage" : false, 301 | "attachmentsCount" : 0 302 | }, { 303 | "name" : "Validating json schema", 304 | "time" : { 305 | "start" : 1677233433177, 306 | "stop" : 1677233433179, 307 | "duration" : 2 308 | }, 309 | "status" : "passed", 310 | "steps" : [ ], 311 | "attachments" : [ ], 312 | "parameters" : [ ], 313 | "stepsCount" : 0, 314 | "hasContent" : false, 315 | "shouldDisplayMessage" : false, 316 | "attachmentsCount" : 0 317 | }, { 318 | "name" : "After Hooks", 319 | "time" : { 320 | "start" : 1677233433179, 321 | "stop" : 1677233433652, 322 | "duration" : 473 323 | }, 324 | "status" : "passed", 325 | "steps" : [ { 326 | "name" : "Deleting question with id \"2022\"", 327 | "time" : { 328 | "start" : 1677233433179, 329 | "stop" : 1677233433650, 330 | "duration" : 471 331 | }, 332 | "status" : "passed", 333 | "steps" : [ { 334 | "name" : "apiRequestContext.delete(/futurama/questions/2022)", 335 | "time" : { 336 | "start" : 1677233433181, 337 | "stop" : 1677233433649, 338 | "duration" : 468 339 | }, 340 | "status" : "passed", 341 | "steps" : [ ], 342 | "attachments" : [ ], 343 | "parameters" : [ ], 344 | "stepsCount" : 0, 345 | "hasContent" : false, 346 | "shouldDisplayMessage" : false, 347 | "attachmentsCount" : 0 348 | } ], 349 | "attachments" : [ ], 350 | "parameters" : [ ], 351 | "stepsCount" : 1, 352 | "hasContent" : true, 353 | "shouldDisplayMessage" : false, 354 | "attachmentsCount" : 0 355 | } ], 356 | "attachments" : [ ], 357 | "parameters" : [ ], 358 | "stepsCount" : 2, 359 | "hasContent" : true, 360 | "shouldDisplayMessage" : false, 361 | "attachmentsCount" : 0 362 | } ], 363 | "attachments" : [ ], 364 | "parameters" : [ ], 365 | "stepsCount" : 23, 366 | "hasContent" : true, 367 | "shouldDisplayMessage" : false, 368 | "attachmentsCount" : 0 369 | }, 370 | "afterStages" : [ ], 371 | "labels" : [ { 372 | "name" : "language", 373 | "value" : "JavaScript" 374 | }, { 375 | "name" : "framework", 376 | "value" : "Playwright" 377 | }, { 378 | "name" : "suite", 379 | "value" : "questions.spec.ts" 380 | }, { 381 | "name" : "subSuite", 382 | "value" : "Questions" 383 | }, { 384 | "name" : "host", 385 | "value" : "LAPTOP-VDKHCJMI" 386 | }, { 387 | "name" : "thread", 388 | "value" : "LAPTOP-VDKHCJMI-11508-playwright-worker-0" 389 | }, { 390 | "name" : "resultFormat", 391 | "value" : "allure2" 392 | } ], 393 | "parameters" : [ ], 394 | "links" : [ ], 395 | "hidden" : false, 396 | "retry" : false, 397 | "extra" : { 398 | "severity" : "normal", 399 | "retries" : [ ], 400 | "categories" : [ ], 401 | "tags" : [ ] 402 | }, 403 | "source" : "f9fd5792e6989c0a.json", 404 | "parameterValues" : [ ] 405 | } -------------------------------------------------------------------------------- /docs/data/timeline.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid" : "ab17fc5a4eb3bca4b216b548c7f9fcbc", 3 | "name" : "timeline", 4 | "children" : [ { 5 | "name" : "LAPTOP-VDKHCJMI", 6 | "children" : [ { 7 | "name" : "LAPTOP-VDKHCJMI-11508-playwright-worker-0", 8 | "children" : [ { 9 | "name" : "Get question", 10 | "uid" : "a3c42aceeeb62563", 11 | "parentUid" : "757095bce05edc332669a3b1f5a11c79", 12 | "status" : "passed", 13 | "time" : { 14 | "start" : 1677233429658, 15 | "stop" : 1677233431242, 16 | "duration" : 1584 17 | }, 18 | "flaky" : false, 19 | "newFailed" : false, 20 | "parameters" : [ ] 21 | }, { 22 | "name" : "Create question", 23 | "uid" : "68e03d051ddb4e1c", 24 | "parentUid" : "757095bce05edc332669a3b1f5a11c79", 25 | "status" : "passed", 26 | "time" : { 27 | "start" : 1677233431726, 28 | "stop" : 1677233432225, 29 | "duration" : 499 30 | }, 31 | "flaky" : false, 32 | "newFailed" : false, 33 | "parameters" : [ ] 34 | }, { 35 | "name" : "Get questions", 36 | "uid" : "8567092b366540be", 37 | "parentUid" : "757095bce05edc332669a3b1f5a11c79", 38 | "status" : "passed", 39 | "time" : { 40 | "start" : 1677233431248, 41 | "stop" : 1677233431724, 42 | "duration" : 476 43 | }, 44 | "flaky" : false, 45 | "newFailed" : false, 46 | "parameters" : [ ] 47 | }, { 48 | "name" : "Update question", 49 | "uid" : "f9fd5792e6989c0a", 50 | "parentUid" : "757095bce05edc332669a3b1f5a11c79", 51 | "status" : "passed", 52 | "time" : { 53 | "start" : 1677233432227, 54 | "stop" : 1677233433652, 55 | "duration" : 1425 56 | }, 57 | "flaky" : false, 58 | "newFailed" : false, 59 | "parameters" : [ ] 60 | }, { 61 | "name" : "Delete question", 62 | "uid" : "f3351b7df63da083", 63 | "parentUid" : "757095bce05edc332669a3b1f5a11c79", 64 | "status" : "passed", 65 | "time" : { 66 | "start" : 1677233433656, 67 | "stop" : 1677233435549, 68 | "duration" : 1893 69 | }, 70 | "flaky" : false, 71 | "newFailed" : false, 72 | "parameters" : [ ] 73 | } ], 74 | "uid" : "757095bce05edc332669a3b1f5a11c79" 75 | } ], 76 | "uid" : "817c70284293979ce2ceda7b8105bd14" 77 | } ] 78 | } -------------------------------------------------------------------------------- /docs/export/influxDbData.txt: -------------------------------------------------------------------------------- 1 | launch_status failed=0 1677233630000000000 2 | launch_status broken=0 1677233630000000000 3 | launch_status passed=5 1677233630000000000 4 | launch_status skipped=0 1677233630000000000 5 | launch_status unknown=0 1677233630000000000 6 | launch_time duration=5891 1677233630000000000 7 | launch_time min_duration=476 1677233630000000000 8 | launch_time max_duration=1893 1677233630000000000 9 | launch_time sum_duration=5877 1677233630000000000 10 | launch_retries retries=0 1677233630000000000 11 | launch_retries run=5 1677233630000000000 12 | -------------------------------------------------------------------------------- /docs/export/mail.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report summary mail 6 | 7 | 8 | Mail body 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/export/prometheusData.txt: -------------------------------------------------------------------------------- 1 | launch_status_failed 0 2 | launch_status_broken 0 3 | launch_status_passed 5 4 | launch_status_skipped 0 5 | launch_status_unknown 0 6 | launch_time_duration 5891 7 | launch_time_min_duration 476 8 | launch_time_max_duration 1893 9 | launch_time_sum_duration 5877 10 | launch_retries_retries 0 11 | launch_retries_run 5 12 | -------------------------------------------------------------------------------- /docs/favicon.ico: -------------------------------------------------------------------------------- 1 | module.exports = __webpack_public_path__ + "favicon.ico"; -------------------------------------------------------------------------------- /docs/history/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { } 3 | } ] -------------------------------------------------------------------------------- /docs/history/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "duration" : 5891 4 | } 5 | } ] -------------------------------------------------------------------------------- /docs/history/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "failed" : 0, 4 | "broken" : 0, 5 | "skipped" : 0, 6 | "passed" : 5, 7 | "unknown" : 0, 8 | "total" : 5 9 | } 10 | } ] -------------------------------------------------------------------------------- /docs/history/history.json: -------------------------------------------------------------------------------- 1 | { 2 | "68d7a393444fff5d1761958301b8a903" : { 3 | "statistic" : { 4 | "failed" : 0, 5 | "broken" : 0, 6 | "skipped" : 0, 7 | "passed" : 1, 8 | "unknown" : 0, 9 | "total" : 1 10 | }, 11 | "items" : [ { 12 | "uid" : "a3c42aceeeb62563", 13 | "status" : "passed", 14 | "time" : { 15 | "start" : 1677233429658, 16 | "stop" : 1677233431242, 17 | "duration" : 1584 18 | } 19 | } ] 20 | }, 21 | "3d26f904d8441550bf9463575fd538cd" : { 22 | "statistic" : { 23 | "failed" : 0, 24 | "broken" : 0, 25 | "skipped" : 0, 26 | "passed" : 1, 27 | "unknown" : 0, 28 | "total" : 1 29 | }, 30 | "items" : [ { 31 | "uid" : "f9fd5792e6989c0a", 32 | "status" : "passed", 33 | "time" : { 34 | "start" : 1677233432227, 35 | "stop" : 1677233433652, 36 | "duration" : 1425 37 | } 38 | } ] 39 | }, 40 | "32f9d31b5740072756997893a28ada1d" : { 41 | "statistic" : { 42 | "failed" : 0, 43 | "broken" : 0, 44 | "skipped" : 0, 45 | "passed" : 1, 46 | "unknown" : 0, 47 | "total" : 1 48 | }, 49 | "items" : [ { 50 | "uid" : "68e03d051ddb4e1c", 51 | "status" : "passed", 52 | "time" : { 53 | "start" : 1677233431726, 54 | "stop" : 1677233432225, 55 | "duration" : 499 56 | } 57 | } ] 58 | }, 59 | "6bce9d0d784c5a3499066099e187bcf1" : { 60 | "statistic" : { 61 | "failed" : 0, 62 | "broken" : 0, 63 | "skipped" : 0, 64 | "passed" : 1, 65 | "unknown" : 0, 66 | "total" : 1 67 | }, 68 | "items" : [ { 69 | "uid" : "f3351b7df63da083", 70 | "status" : "passed", 71 | "time" : { 72 | "start" : 1677233433656, 73 | "stop" : 1677233435549, 74 | "duration" : 1893 75 | } 76 | } ] 77 | }, 78 | "828076ce7ca29289e4c9d4190c015e3c" : { 79 | "statistic" : { 80 | "failed" : 0, 81 | "broken" : 0, 82 | "skipped" : 0, 83 | "passed" : 1, 84 | "unknown" : 0, 85 | "total" : 1 86 | }, 87 | "items" : [ { 88 | "uid" : "8567092b366540be", 89 | "status" : "passed", 90 | "time" : { 91 | "start" : 1677233431248, 92 | "stop" : 1677233431724, 93 | "duration" : 476 94 | } 95 | } ] 96 | } 97 | } -------------------------------------------------------------------------------- /docs/history/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "run" : 5, 4 | "retry" : 0 5 | } 6 | } ] -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Allure Report 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/plugins/behaviors/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | behaviors: { 6 | name: 'Behaviors' 7 | } 8 | }, 9 | widget: { 10 | behaviors: { 11 | name: 'Features by stories', 12 | showAll: 'show all' 13 | } 14 | } 15 | }); 16 | 17 | allure.api.addTranslation('ru', { 18 | tab: { 19 | behaviors: { 20 | name: 'Функциональность' 21 | } 22 | }, 23 | widget: { 24 | behaviors: { 25 | name: 'Функциональность', 26 | showAll: 'показать все' 27 | } 28 | } 29 | }); 30 | 31 | allure.api.addTranslation('zh', { 32 | tab: { 33 | behaviors: { 34 | name: '功能' 35 | } 36 | }, 37 | widget: { 38 | behaviors: { 39 | name: '特性场景', 40 | showAll: '显示所有' 41 | } 42 | } 43 | }); 44 | 45 | allure.api.addTranslation('de', { 46 | tab: { 47 | behaviors: { 48 | name: 'Verhalten' 49 | } 50 | }, 51 | widget: { 52 | behaviors: { 53 | name: 'Features nach Stories', 54 | showAll: 'Zeige alle' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('nl', { 60 | tab: { 61 | behaviors: { 62 | name: 'Functionaliteit' 63 | } 64 | }, 65 | widget: { 66 | behaviors: { 67 | name: 'Features en story’s', 68 | showAll: 'Toon alle' 69 | } 70 | } 71 | }); 72 | 73 | allure.api.addTranslation('he', { 74 | tab: { 75 | behaviors: { 76 | name: 'התנהגויות' 77 | } 78 | }, 79 | widget: { 80 | behaviors: { 81 | name: 'תכונות לפי סיפורי משתמש', 82 | showAll: 'הצג הכול' 83 | } 84 | } 85 | }); 86 | 87 | allure.api.addTranslation('br', { 88 | tab: { 89 | behaviors: { 90 | name: 'Comportamentos' 91 | } 92 | }, 93 | widget: { 94 | behaviors: { 95 | name: 'Funcionalidades por história', 96 | showAll: 'Mostrar tudo' 97 | } 98 | } 99 | }); 100 | 101 | allure.api.addTranslation('ja', { 102 | tab: { 103 | behaviors: { 104 | name: '振る舞い' 105 | } 106 | }, 107 | widget: { 108 | behaviors: { 109 | name: 'ストーリー別の機能', 110 | showAll: '全て表示' 111 | } 112 | } 113 | }); 114 | 115 | allure.api.addTranslation('es', { 116 | tab: { 117 | behaviors: { 118 | name: 'Funcionalidades' 119 | } 120 | }, 121 | widget: { 122 | behaviors: { 123 | name: 'Funcionalidades por Historias de Usuario', 124 | showAll: 'mostrar todo' 125 | } 126 | } 127 | }); 128 | 129 | allure.api.addTranslation('kr', { 130 | tab: { 131 | behaviors: { 132 | name: '동작' 133 | } 134 | }, 135 | widget: { 136 | behaviors: { 137 | name: '스토리별 기능', 138 | showAll: '전체 보기' 139 | } 140 | } 141 | }); 142 | 143 | allure.api.addTranslation('fr', { 144 | tab: { 145 | behaviors: { 146 | name: 'Comportements' 147 | } 148 | }, 149 | widget: { 150 | behaviors: { 151 | name: 'Thèmes par histoires', 152 | showAll: 'Montrer tout' 153 | } 154 | } 155 | }); 156 | 157 | allure.api.addTab('behaviors', { 158 | title: 'tab.behaviors.name', icon: 'fa fa-list', 159 | route: 'behaviors(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 160 | onEnter: (function (testGroup, testResult, testResultTab) { 161 | return new allure.components.TreeLayout({ 162 | testGroup: testGroup, 163 | testResult: testResult, 164 | testResultTab: testResultTab, 165 | tabName: 'tab.behaviors.name', 166 | baseUrl: 'behaviors', 167 | url: 'data/behaviors.json', 168 | csvUrl: 'data/behaviors.csv' 169 | }); 170 | }) 171 | }); 172 | 173 | allure.api.addWidget('widgets', 'behaviors', allure.components.WidgetStatusView.extend({ 174 | rowTag: 'a', 175 | title: 'widget.behaviors.name', 176 | baseUrl: 'behaviors', 177 | showLinks: true 178 | })); 179 | -------------------------------------------------------------------------------- /docs/plugins/packages/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | allure.api.addTranslation('en', { 4 | tab: { 5 | packages: { 6 | name: 'Packages' 7 | } 8 | } 9 | }); 10 | 11 | allure.api.addTranslation('ru', { 12 | tab: { 13 | packages: { 14 | name: 'Пакеты' 15 | } 16 | } 17 | }); 18 | 19 | allure.api.addTranslation('zh', { 20 | tab: { 21 | packages: { 22 | name: '包' 23 | } 24 | } 25 | }); 26 | 27 | allure.api.addTranslation('de', { 28 | tab: { 29 | packages: { 30 | name: 'Pakete' 31 | } 32 | } 33 | }); 34 | 35 | allure.api.addTranslation('nl', { 36 | tab: { 37 | packages: { 38 | name: 'Packages' 39 | } 40 | } 41 | }); 42 | 43 | allure.api.addTranslation('he', { 44 | tab: { 45 | packages: { 46 | name: 'חבילות' 47 | } 48 | } 49 | }); 50 | 51 | allure.api.addTranslation('br', { 52 | tab: { 53 | packages: { 54 | name: 'Pacotes' 55 | } 56 | } 57 | }); 58 | 59 | allure.api.addTranslation('ja', { 60 | tab: { 61 | packages: { 62 | name: 'パッケージ' 63 | } 64 | } 65 | }); 66 | 67 | allure.api.addTranslation('es', { 68 | tab: { 69 | packages: { 70 | name: 'Paquetes' 71 | } 72 | } 73 | }); 74 | 75 | allure.api.addTranslation('kr', { 76 | tab: { 77 | packages: { 78 | name: '패키지' 79 | } 80 | } 81 | }); 82 | 83 | allure.api.addTranslation('fr', { 84 | tab: { 85 | packages: { 86 | name: 'Paquets' 87 | } 88 | } 89 | }); 90 | 91 | allure.api.addTab('packages', { 92 | title: 'tab.packages.name', icon: 'fa fa-align-left', 93 | route: 'packages(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)', 94 | onEnter: (function (testGroup, testResult, testResultTab) { 95 | return new allure.components.TreeLayout({ 96 | testGroup: testGroup, 97 | testResult: testResult, 98 | testResultTab: testResultTab, 99 | tabName: 'tab.packages.name', 100 | baseUrl: 'packages', 101 | url: 'data/packages.json' 102 | }); 103 | }) 104 | }); 105 | -------------------------------------------------------------------------------- /docs/plugins/screen-diff/index.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var settings = allure.getPluginSettings('screen-diff', { diffType: 'diff' }); 3 | 4 | function renderImage(src) { 5 | return ( 6 | '
' + 7 | '' + 10 | '
' 11 | ); 12 | } 13 | 14 | function findImage(data, name) { 15 | if (data.testStage && data.testStage.attachments) { 16 | var matchedImage = data.testStage.attachments.filter(function (attachment) { 17 | return attachment.name === name; 18 | })[0]; 19 | if (matchedImage) { 20 | return 'data/attachments/' + matchedImage.source; 21 | } 22 | } 23 | return null; 24 | } 25 | 26 | function renderDiffContent(type, diffImage, actualImage, expectedImage) { 27 | if (type === 'diff') { 28 | if (diffImage) { 29 | return renderImage(diffImage); 30 | } 31 | } 32 | if (type === 'overlay' && expectedImage) { 33 | return ( 34 | '
' + 35 | '' + 38 | '
' + 39 | '' + 42 | '
' + 43 | '
' 44 | ); 45 | } 46 | if (actualImage) { 47 | return renderImage(actualImage); 48 | } 49 | return 'No diff data provided'; 50 | } 51 | 52 | var TestResultView = Backbone.Marionette.View.extend({ 53 | regions: { 54 | subView: '.screen-diff-view', 55 | }, 56 | template: function () { 57 | return '
'; 58 | }, 59 | onRender: function () { 60 | var data = this.model.toJSON(); 61 | var testType = data.labels.filter(function (label) { 62 | return label.name === 'testType'; 63 | })[0]; 64 | var diffImage = findImage(data, 'diff'); 65 | var actualImage = findImage(data, 'actual'); 66 | var expectedImage = findImage(data, 'expected'); 67 | if (!testType || testType.value !== 'screenshotDiff') { 68 | return; 69 | } 70 | this.showChildView( 71 | 'subView', 72 | new ScreenDiffView({ 73 | diffImage: diffImage, 74 | actualImage: actualImage, 75 | expectedImage: expectedImage, 76 | }), 77 | ); 78 | }, 79 | }); 80 | var ErrorView = Backbone.Marionette.View.extend({ 81 | templateContext: function () { 82 | return this.options; 83 | }, 84 | template: function (data) { 85 | return '
' + data.error + '
'; 86 | }, 87 | }); 88 | var AttachmentView = Backbone.Marionette.View.extend({ 89 | regions: { 90 | subView: '.screen-diff-view', 91 | }, 92 | template: function () { 93 | return '
'; 94 | }, 95 | onRender: function () { 96 | jQuery 97 | .getJSON(this.options.sourceUrl) 98 | .then(this.renderScreenDiffView.bind(this), this.renderErrorView.bind(this)); 99 | }, 100 | renderErrorView: function (error) { 101 | console.log(error); 102 | this.showChildView( 103 | 'subView', 104 | new ErrorView({ 105 | error: error.statusText, 106 | }), 107 | ); 108 | }, 109 | renderScreenDiffView: function (data) { 110 | this.showChildView( 111 | 'subView', 112 | new ScreenDiffView({ 113 | diffImage: data.diff, 114 | actualImage: data.actual, 115 | expectedImage: data.expected, 116 | }), 117 | ); 118 | }, 119 | }); 120 | 121 | var ScreenDiffView = Backbone.Marionette.View.extend({ 122 | className: 'pane__section', 123 | events: function () { 124 | return { 125 | ['click [name="screen-diff-type-' + this.cid + '"]']: 'onDiffTypeChange', 126 | 'mousemove .screen-diff__overlay': 'onOverlayMove', 127 | }; 128 | }, 129 | initialize: function (options) { 130 | this.diffImage = options.diffImage; 131 | this.actualImage = options.actualImage; 132 | this.expectedImage = options.expectedImage; 133 | this.radioName = 'screen-diff-type-' + this.cid; 134 | }, 135 | templateContext: function () { 136 | return { 137 | diffType: settings.get('diffType'), 138 | diffImage: this.diffImage, 139 | actualImage: this.actualImage, 140 | expectedImage: this.expectedImage, 141 | radioName: this.radioName, 142 | }; 143 | }, 144 | template: function (data) { 145 | if (!data.diffImage && !data.actualImage && !data.expectedImage) { 146 | return ''; 147 | } 148 | 149 | return ( 150 | '

Screen Diff

' + 151 | '
' + 152 | '
' + 153 | '' + 156 | '' + 159 | '
' + 160 | renderDiffContent( 161 | data.diffType, 162 | data.diffImage, 163 | data.actualImage, 164 | data.expectedImage, 165 | ) + 166 | '
' 167 | ); 168 | }, 169 | adjustImageSize: function (event) { 170 | var overImage = this.$(event.target); 171 | overImage.width(overImage.width()); 172 | }, 173 | onRender: function () { 174 | const diffType = settings.get('diffType'); 175 | this.$('[name="' + this.radioName + '"][value="' + diffType + '"]').prop( 176 | 'checked', 177 | true, 178 | ); 179 | if (diffType === 'overlay') { 180 | this.$('.screen-diff__image-over img').on('load', this.adjustImageSize.bind(this)); 181 | } 182 | }, 183 | onOverlayMove: function (event) { 184 | var pageX = event.pageX; 185 | var containerScroll = this.$('.screen-diff__container').scrollLeft(); 186 | var elementX = event.currentTarget.getBoundingClientRect().left; 187 | var delta = pageX - elementX + containerScroll; 188 | this.$('.screen-diff__image-over').width(delta); 189 | }, 190 | onDiffTypeChange: function (event) { 191 | settings.save('diffType', event.target.value); 192 | this.render(); 193 | }, 194 | }); 195 | allure.api.addTestResultBlock(TestResultView, { position: 'before' }); 196 | allure.api.addAttachmentViewer('application/vnd.allure.image.diff', { 197 | View: AttachmentView, 198 | icon: 'fa fa-exchange', 199 | }); 200 | })(); 201 | -------------------------------------------------------------------------------- /docs/plugins/screen-diff/styles.css: -------------------------------------------------------------------------------- 1 | .screen-diff__switchers { 2 | margin-bottom: 1em; 3 | } 4 | 5 | .screen-diff__switchers label + label { 6 | margin-left: 1em; 7 | } 8 | 9 | .screen-diff__overlay { 10 | position: relative; 11 | cursor: col-resize; 12 | } 13 | 14 | .screen-diff__container { 15 | overflow-x: auto; 16 | } 17 | 18 | .screen-diff__image-over { 19 | top: 0; 20 | left: 0; 21 | bottom: 0; 22 | background: #fff; 23 | position: absolute; 24 | overflow: hidden; 25 | box-shadow: 2px 0 1px -1px #aaa; 26 | } 27 | 28 | .screen-diff-error { 29 | color: #fd5a3e; 30 | } 31 | -------------------------------------------------------------------------------- /docs/widgets/behaviors.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 5, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /docs/widgets/categories-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { } 3 | } ] -------------------------------------------------------------------------------- /docs/widgets/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 0, 3 | "items" : [ ] 4 | } -------------------------------------------------------------------------------- /docs/widgets/duration-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "duration" : 5891 4 | } 5 | } ] -------------------------------------------------------------------------------- /docs/widgets/duration.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "uid" : "a3c42aceeeb62563", 3 | "name" : "Get question", 4 | "time" : { 5 | "start" : 1677233429658, 6 | "stop" : 1677233431242, 7 | "duration" : 1584 8 | }, 9 | "status" : "passed", 10 | "severity" : "normal" 11 | }, { 12 | "uid" : "f9fd5792e6989c0a", 13 | "name" : "Update question", 14 | "time" : { 15 | "start" : 1677233432227, 16 | "stop" : 1677233433652, 17 | "duration" : 1425 18 | }, 19 | "status" : "passed", 20 | "severity" : "normal" 21 | }, { 22 | "uid" : "f3351b7df63da083", 23 | "name" : "Delete question", 24 | "time" : { 25 | "start" : 1677233433656, 26 | "stop" : 1677233435549, 27 | "duration" : 1893 28 | }, 29 | "status" : "passed", 30 | "severity" : "normal" 31 | }, { 32 | "uid" : "68e03d051ddb4e1c", 33 | "name" : "Create question", 34 | "time" : { 35 | "start" : 1677233431726, 36 | "stop" : 1677233432225, 37 | "duration" : 499 38 | }, 39 | "status" : "passed", 40 | "severity" : "normal" 41 | }, { 42 | "uid" : "8567092b366540be", 43 | "name" : "Get questions", 44 | "time" : { 45 | "start" : 1677233431248, 46 | "stop" : 1677233431724, 47 | "duration" : 476 48 | }, 49 | "status" : "passed", 50 | "severity" : "normal" 51 | } ] -------------------------------------------------------------------------------- /docs/widgets/environment.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "values" : [ "allure-results" ], 3 | "name" : "ALLURE_RESULTS_FOLDER" 4 | }, { 5 | "values" : [ "https://api.sampleapis.com" ], 6 | "name" : "BASE_URL" 7 | }, { 8 | "values" : [ "1" ], 9 | "name" : "CI" 10 | }, { 11 | "values" : [ "Local" ], 12 | "name" : "ENV_NAME" 13 | }, { 14 | "values" : [ "some@gmail.com" ], 15 | "name" : "TEST_USER_EMAIL" 16 | }, { 17 | "values" : [ "some" ], 18 | "name" : "TEST_USER_PASSWORD" 19 | } ] -------------------------------------------------------------------------------- /docs/widgets/executors.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /docs/widgets/history-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "failed" : 0, 4 | "broken" : 0, 5 | "skipped" : 0, 6 | "passed" : 5, 7 | "unknown" : 0, 8 | "total" : 5 9 | } 10 | } ] -------------------------------------------------------------------------------- /docs/widgets/launch.json: -------------------------------------------------------------------------------- 1 | [ ] -------------------------------------------------------------------------------- /docs/widgets/retry-trend.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "data" : { 3 | "run" : 5, 4 | "retry" : 0 5 | } 6 | } ] -------------------------------------------------------------------------------- /docs/widgets/severity.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "uid" : "f3351b7df63da083", 3 | "name" : "Delete question", 4 | "time" : { 5 | "start" : 1677233433656, 6 | "stop" : 1677233435549, 7 | "duration" : 1893 8 | }, 9 | "status" : "passed", 10 | "severity" : "normal" 11 | }, { 12 | "uid" : "a3c42aceeeb62563", 13 | "name" : "Get question", 14 | "time" : { 15 | "start" : 1677233429658, 16 | "stop" : 1677233431242, 17 | "duration" : 1584 18 | }, 19 | "status" : "passed", 20 | "severity" : "normal" 21 | }, { 22 | "uid" : "68e03d051ddb4e1c", 23 | "name" : "Create question", 24 | "time" : { 25 | "start" : 1677233431726, 26 | "stop" : 1677233432225, 27 | "duration" : 499 28 | }, 29 | "status" : "passed", 30 | "severity" : "normal" 31 | }, { 32 | "uid" : "8567092b366540be", 33 | "name" : "Get questions", 34 | "time" : { 35 | "start" : 1677233431248, 36 | "stop" : 1677233431724, 37 | "duration" : 476 38 | }, 39 | "status" : "passed", 40 | "severity" : "normal" 41 | }, { 42 | "uid" : "f9fd5792e6989c0a", 43 | "name" : "Update question", 44 | "time" : { 45 | "start" : 1677233432227, 46 | "stop" : 1677233433652, 47 | "duration" : 1425 48 | }, 49 | "status" : "passed", 50 | "severity" : "normal" 51 | } ] -------------------------------------------------------------------------------- /docs/widgets/status-chart.json: -------------------------------------------------------------------------------- 1 | [ { 2 | "uid" : "a3c42aceeeb62563", 3 | "name" : "Get question", 4 | "time" : { 5 | "start" : 1677233429658, 6 | "stop" : 1677233431242, 7 | "duration" : 1584 8 | }, 9 | "status" : "passed", 10 | "severity" : "normal" 11 | }, { 12 | "uid" : "f9fd5792e6989c0a", 13 | "name" : "Update question", 14 | "time" : { 15 | "start" : 1677233432227, 16 | "stop" : 1677233433652, 17 | "duration" : 1425 18 | }, 19 | "status" : "passed", 20 | "severity" : "normal" 21 | }, { 22 | "uid" : "f3351b7df63da083", 23 | "name" : "Delete question", 24 | "time" : { 25 | "start" : 1677233433656, 26 | "stop" : 1677233435549, 27 | "duration" : 1893 28 | }, 29 | "status" : "passed", 30 | "severity" : "normal" 31 | }, { 32 | "uid" : "68e03d051ddb4e1c", 33 | "name" : "Create question", 34 | "time" : { 35 | "start" : 1677233431726, 36 | "stop" : 1677233432225, 37 | "duration" : 499 38 | }, 39 | "status" : "passed", 40 | "severity" : "normal" 41 | }, { 42 | "uid" : "8567092b366540be", 43 | "name" : "Get questions", 44 | "time" : { 45 | "start" : 1677233431248, 46 | "stop" : 1677233431724, 47 | "duration" : 476 48 | }, 49 | "status" : "passed", 50 | "severity" : "normal" 51 | } ] -------------------------------------------------------------------------------- /docs/widgets/suites.json: -------------------------------------------------------------------------------- 1 | { 2 | "total" : 1, 3 | "items" : [ { 4 | "uid" : "7ad689d111db14a4212f26197eb3753b", 5 | "name" : "questions.spec.ts", 6 | "statistic" : { 7 | "failed" : 0, 8 | "broken" : 0, 9 | "skipped" : 0, 10 | "passed" : 5, 11 | "unknown" : 0, 12 | "total" : 5 13 | } 14 | } ] 15 | } -------------------------------------------------------------------------------- /docs/widgets/summary.json: -------------------------------------------------------------------------------- 1 | { 2 | "reportName" : "Allure Report", 3 | "testRuns" : [ ], 4 | "statistic" : { 5 | "failed" : 0, 6 | "broken" : 0, 7 | "skipped" : 0, 8 | "passed" : 5, 9 | "unknown" : 0, 10 | "total" : 5 11 | }, 12 | "time" : { 13 | "start" : 1677233429658, 14 | "stop" : 1677233435549, 15 | "duration" : 5891, 16 | "minDuration" : 476, 17 | "maxDuration" : 1893, 18 | "sumDuration" : 5877 19 | } 20 | } -------------------------------------------------------------------------------- /environment.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | namespace NodeJS { 3 | interface ProcessEnv { 4 | CI: string; 5 | ENV_NAME: string; 6 | BASE_URL: string; 7 | TEST_USER_EMAIL: string; 8 | TEST_USER_PASSWORD: string; 9 | ALLURE_RESULTS_FOLDER: string; 10 | } 11 | } 12 | } 13 | 14 | export {}; 15 | -------------------------------------------------------------------------------- /fixtures/questions.ts: -------------------------------------------------------------------------------- 1 | import { Fixtures } from '@playwright/test'; 2 | import { QuestionsAPIClient } from '../core/api/questions-api'; 3 | import { getAuthAPIContext } from '../core/context/auth-context'; 4 | import { getRandomQuestion } from '../utils/api/questions'; 5 | import { Question } from '../utils/types/api/questions'; 6 | import { UsersFixture } from './users'; 7 | 8 | export type QuestionsFixture = { 9 | questionsClient: QuestionsAPIClient; 10 | question: Question; 11 | }; 12 | 13 | export const questionsFixture: Fixtures = { 14 | questionsClient: async ({ testUser }, use) => { 15 | const authContext = await getAuthAPIContext({ user: testUser }); 16 | const questionsClient = new QuestionsAPIClient(authContext); 17 | 18 | await use(questionsClient); 19 | }, 20 | question: async ({ questionsClient }, use) => { 21 | const randomQuestion = getRandomQuestion(); 22 | const question = await questionsClient.createQuestion(randomQuestion); 23 | 24 | await use(question); 25 | 26 | await questionsClient.deleteQuestionAPI(question.id); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /fixtures/users.ts: -------------------------------------------------------------------------------- 1 | import { Fixtures } from '@playwright/test'; 2 | import { AuthUser } from '../utils/types/api/authentication'; 3 | 4 | export type UsersFixture = { 5 | testUser: AuthUser; 6 | }; 7 | 8 | export const usersFixture: Fixtures = { 9 | testUser: async ({}, use) => { 10 | const email = process.env.TEST_USER_EMAIL; 11 | const password = process.env.TEST_USER_PASSWORD; 12 | 13 | if (!email || !password) { 14 | throw Error(`Provide "TEST_USER_EMAIL" and "TEST_USER_PASSWORD" inside .env`); 15 | } 16 | 17 | await use({ email, password }); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playwright_typescript_api", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "devDependencies": { 7 | "@playwright/test": "^1.31.0", 8 | "ajv": "^8.12.0", 9 | "allure-playwright": "^2.0.0", 10 | "dotenv": "^16.0.3" 11 | }, 12 | "scripts": {}, 13 | "dependencies": {} 14 | } 15 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@playwright/test'; 2 | import { config as dotenvConfig } from 'dotenv'; 3 | import { resolve } from 'path'; 4 | 5 | dotenvConfig({ path: resolve(__dirname, '.env'), override: true }); 6 | 7 | /** 8 | * Read environment variables from file. 9 | * https://github.com/motdotla/dotenv 10 | */ 11 | // require('dotenv').config(); 12 | 13 | /** 14 | * See https://playwright.dev/docs/test-configuration. 15 | */ 16 | export default defineConfig({ 17 | testDir: './tests', 18 | /* Maximum time one test can run for. */ 19 | timeout: 30 * 1000, 20 | expect: { 21 | /** 22 | * Maximum time expect() should wait for the condition to be met. 23 | * For example in `await expect(locator).toHaveText();` 24 | */ 25 | timeout: 5000 26 | }, 27 | /* Run tests in files in parallel */ 28 | fullyParallel: true, 29 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 30 | forbidOnly: !!process.env.CI, 31 | /* Retry on CI only */ 32 | retries: process.env.CI ? 2 : 0, 33 | /* Opt out of parallel tests on CI. */ 34 | workers: process.env.CI ? 1 : undefined, 35 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 36 | reporter: [['html'], ['allure-playwright']], 37 | globalTeardown: require.resolve('./utils/config/global-teardown'), 38 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 39 | use: { 40 | /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ 41 | actionTimeout: 0, 42 | /* Base URL to use in actions like `await page.goto('/')`. */ 43 | // baseURL: 'http://localhost:3000', 44 | 45 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 46 | trace: 'on-first-retry' 47 | } 48 | }); 49 | -------------------------------------------------------------------------------- /tests/questions-test.ts: -------------------------------------------------------------------------------- 1 | import { test as base } from '@playwright/test'; 2 | import { questionsFixture, QuestionsFixture } from '../fixtures/questions'; 3 | import { usersFixture, UsersFixture } from '../fixtures/users'; 4 | import { combineFixtures } from '../utils/fixtures'; 5 | 6 | export const questionsTest = base.extend( 7 | combineFixtures(usersFixture, questionsFixture) 8 | ); 9 | -------------------------------------------------------------------------------- /tests/questions.spec.ts: -------------------------------------------------------------------------------- 1 | import { getRandomQuestion, getRandomUpdateQuestion } from '../utils/api/questions'; 2 | import { assertQuestion, assertUpdateQuestion } from '../utils/assertions/api/questions'; 3 | import { expectStatusCode } from '../utils/assertions/solutions'; 4 | import { questionSchema, questionsListSchema, updateQuestionSchema } from '../utils/schema/api/questions-schema'; 5 | import { validateSchema } from '../utils/schema/validator'; 6 | import { Question } from '../utils/types/api/questions'; 7 | import { questionsTest as test } from './questions-test'; 8 | 9 | test.describe('Questions', () => { 10 | test('Get question', async ({ question, questionsClient }) => { 11 | const response = await questionsClient.getQuestionAPI(question.id); 12 | const json: Question = await response.json(); 13 | 14 | await expectStatusCode({ actual: response.status(), expected: 200, api: response.url() }); 15 | await assertQuestion({ expectedQuestion: question, actualQuestion: json }); 16 | 17 | await validateSchema({ schema: questionSchema, json }); 18 | }); 19 | 20 | test('Get questions', async ({ questionsClient }) => { 21 | const response = await questionsClient.getQuestionsAPI(); 22 | const json: Question[] = await response.json(); 23 | 24 | await expectStatusCode({ actual: response.status(), expected: 200, api: response.url() }); 25 | 26 | await validateSchema({ schema: questionsListSchema, json }); 27 | }); 28 | 29 | test('Create question', async ({ questionsClient }) => { 30 | const payload = getRandomQuestion(); 31 | 32 | const response = await questionsClient.createQuestionAPI(payload); 33 | const json: Question = await response.json(); 34 | 35 | await expectStatusCode({ actual: response.status(), expected: 201, api: response.url() }); 36 | await assertQuestion({ expectedQuestion: payload, actualQuestion: json }); 37 | 38 | await validateSchema({ schema: questionSchema, json }); 39 | }); 40 | 41 | test('Update question', async ({ question, questionsClient }) => { 42 | const payload = getRandomUpdateQuestion(); 43 | 44 | const response = await questionsClient.updateQuestionAPI(question.id, payload); 45 | const json: Question = await response.json(); 46 | 47 | await expectStatusCode({ actual: response.status(), expected: 200, api: response.url() }); 48 | await assertUpdateQuestion({ expectedQuestion: payload, actualQuestion: json }); 49 | 50 | await validateSchema({ schema: updateQuestionSchema, json }); 51 | }); 52 | 53 | test('Delete question', async ({ question, questionsClient }) => { 54 | const deleteQuestionResponse = await questionsClient.deleteQuestionAPI(question.id); 55 | const getQuestionResponse = await questionsClient.getQuestionAPI(question.id); 56 | 57 | await expectStatusCode({ 58 | actual: getQuestionResponse.status(), 59 | expected: 404, 60 | api: getQuestionResponse.url() 61 | }); 62 | await expectStatusCode({ 63 | actual: deleteQuestionResponse.status(), 64 | expected: 200, 65 | api: deleteQuestionResponse.url() 66 | }); 67 | }); 68 | }); 69 | -------------------------------------------------------------------------------- /utils/api/questions.ts: -------------------------------------------------------------------------------- 1 | import { randomListOfStrings, randomNumber, randomString } from '../fakers'; 2 | import { Question, UpdateQuestion } from '../types/api/questions'; 3 | 4 | export const getRandomUpdateQuestion = (): UpdateQuestion => ({ 5 | question: randomString(), 6 | correctAnswer: randomString(), 7 | possibleAnswers: randomListOfStrings() 8 | }); 9 | 10 | export const getRandomQuestion = (): Question => ({ 11 | id: randomNumber(), 12 | question: randomString(), 13 | correctAnswer: randomString(), 14 | possibleAnswers: randomListOfStrings() 15 | }); 16 | -------------------------------------------------------------------------------- /utils/assertions/api/questions.ts: -------------------------------------------------------------------------------- 1 | import { Question, UpdateQuestion } from '../../types/api/questions'; 2 | import { expectToEqual } from '../solutions'; 3 | 4 | type AssertQuestionProps = { 5 | expectedQuestion: Question; 6 | actualQuestion: Question; 7 | }; 8 | 9 | type AssertUpdateQuestionProps = { 10 | expectedQuestion: UpdateQuestion; 11 | actualQuestion: UpdateQuestion; 12 | }; 13 | 14 | export const assertUpdateQuestion = async ({ expectedQuestion, actualQuestion }: AssertUpdateQuestionProps) => { 15 | await expectToEqual({ 16 | actual: expectedQuestion.question, 17 | expected: actualQuestion.question, 18 | description: 'Question "question"' 19 | }); 20 | await expectToEqual({ 21 | actual: expectedQuestion.correctAnswer, 22 | expected: actualQuestion.correctAnswer, 23 | description: 'Question "correctAnswer"' 24 | }); 25 | await expectToEqual({ 26 | actual: expectedQuestion.possibleAnswers, 27 | expected: actualQuestion.possibleAnswers, 28 | description: 'Question "possibleAnswers"' 29 | }); 30 | }; 31 | 32 | export const assertQuestion = async ({ expectedQuestion, actualQuestion }: AssertQuestionProps) => { 33 | await expectToEqual({ actual: expectedQuestion.id, expected: actualQuestion.id, description: 'Question "id"' }); 34 | await assertUpdateQuestion({ expectedQuestion, actualQuestion }); 35 | }; 36 | -------------------------------------------------------------------------------- /utils/assertions/solutions.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | type ExpectToEqual = { 4 | actual: T; 5 | expected: T; 6 | description: string; 7 | }; 8 | 9 | type ExpectStatusCode = { api: string } & Omit, 'description'>; 10 | 11 | export const expectToEqual = async ({ actual, expected, description }: ExpectToEqual) => { 12 | await test.step(`Checking that "${description}" is equal to "${expected}"`, async () => { 13 | expect(actual).toEqual(expected); 14 | }); 15 | }; 16 | 17 | export const expectStatusCode = async ({ actual, expected, api }: ExpectStatusCode): Promise => { 18 | await test.step(`Checking that response status code for API "${api}" equal to ${expected}`, async () => { 19 | await expectToEqual({ actual, expected, description: 'Response Status code' }); 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /utils/config/global-teardown.ts: -------------------------------------------------------------------------------- 1 | import { FullConfig } from '@playwright/test'; 2 | import { createAllureEnvironmentFile } from '../reporters/allure'; 3 | 4 | async function globalTeardown(_: FullConfig): Promise { 5 | createAllureEnvironmentFile(); 6 | } 7 | 8 | export default globalTeardown; 9 | -------------------------------------------------------------------------------- /utils/constants/routes.ts: -------------------------------------------------------------------------------- 1 | export enum APIRoutes { 2 | Auth = '/auth', 3 | Info = '/futurama/info', 4 | Cast = '/futurama/cast', 5 | Episodes = '/futurama/episodes', 6 | Questions = '/futurama/questions', 7 | Inventory = '/futurama/inventory', 8 | Characters = '/futurama/characters' 9 | } 10 | -------------------------------------------------------------------------------- /utils/fakers.ts: -------------------------------------------------------------------------------- 1 | const NUMBERS = '0123456789'; 2 | const LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; 3 | const LETTERS_WITH_NUMBERS = LETTERS + NUMBERS; 4 | 5 | export const randomNumber = (start: number = 500, end: number = 2000): number => 6 | Math.floor(Math.random() * (end - start + 1) + end); 7 | 8 | export const randomString = (start: number = 10, end: number = 20, charSet: string = LETTERS_WITH_NUMBERS): string => { 9 | let randomString = ''; 10 | for (let index = 0; index < randomNumber(start, end); index++) { 11 | const randomPoz = Math.floor(Math.random() * charSet.length); 12 | randomString += charSet.substring(randomPoz, randomPoz + 1); 13 | } 14 | return randomString; 15 | }; 16 | 17 | export const randomListOfStrings = (start: number = 10, end: number = 20): string[] => { 18 | const range = randomNumber(start, end); 19 | 20 | return Array.from(Array(range).keys()).map((_) => randomString()); 21 | }; 22 | -------------------------------------------------------------------------------- /utils/fixtures.ts: -------------------------------------------------------------------------------- 1 | import { Fixtures } from '@playwright/test'; 2 | 3 | export const combineFixtures = (...args: Fixtures[]): Fixtures => 4 | args.reduce((acc, fixture) => ({ ...acc, ...fixture }), {}); 5 | -------------------------------------------------------------------------------- /utils/reporters/allure.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | 4 | export const createAllureEnvironmentFile = (): void => { 5 | const reportFolder = path.resolve(process.cwd(), process.env.ALLURE_RESULTS_FOLDER); 6 | const environmentContent = Object.entries(process.env).reduce( 7 | (previousValue, [variableName, value]) => `${previousValue}\n${variableName}=${value}`, 8 | '' 9 | ); 10 | 11 | fs.mkdirSync(reportFolder, { recursive: true }); 12 | fs.writeFileSync(`${reportFolder}/environment.properties`, environmentContent, 'utf-8'); 13 | }; 14 | -------------------------------------------------------------------------------- /utils/schema/api/questions-schema.ts: -------------------------------------------------------------------------------- 1 | import { JSONSchemaType } from 'ajv'; 2 | import { Question, UpdateQuestion } from '../../types/api/questions'; 3 | 4 | export const questionSchema: JSONSchemaType = { 5 | title: 'Question', 6 | type: 'object', 7 | properties: { 8 | id: { type: 'integer' }, 9 | question: { type: 'string' }, 10 | possibleAnswers: { type: 'array', items: { type: 'string' } }, 11 | correctAnswer: { anyOf: [{ type: 'string' }, { type: 'integer' }] } 12 | }, 13 | required: ['id', 'question', 'correctAnswer', 'possibleAnswers'] 14 | }; 15 | 16 | export const updateQuestionSchema: JSONSchemaType = { 17 | title: 'UpdateQuestion', 18 | type: 'object', 19 | properties: { 20 | question: { type: 'string', nullable: true }, 21 | possibleAnswers: { type: 'array', items: { type: 'string' }, nullable: true }, 22 | correctAnswer: { type: 'string', nullable: true } 23 | } 24 | }; 25 | 26 | export const questionsListSchema: JSONSchemaType = { 27 | title: 'QuestionsList', 28 | type: 'array', 29 | items: { 30 | $ref: '#/definitions/question', 31 | type: 'object', 32 | required: ['id', 'question', 'correctAnswer', 'possibleAnswers'] 33 | }, 34 | definitions: { 35 | question: { 36 | title: 'Question', 37 | type: 'object', 38 | properties: { 39 | id: { type: 'integer' }, 40 | question: { type: 'string' }, 41 | possibleAnswers: { type: 'array', items: { type: 'string' } }, 42 | correctAnswer: { anyOf: [{ type: 'string' }, { type: 'integer' }] } 43 | }, 44 | required: ['id', 'question', 'correctAnswer', 'possibleAnswers'] 45 | } 46 | } 47 | }; 48 | -------------------------------------------------------------------------------- /utils/schema/validator.ts: -------------------------------------------------------------------------------- 1 | import test from '@playwright/test'; 2 | import Ajv, { JSONSchemaType } from 'ajv'; 3 | 4 | const ajv = new Ajv(); 5 | 6 | type ValidateSchemaProps = { 7 | schema: JSONSchemaType; 8 | json: T | T[]; 9 | }; 10 | 11 | export const validateSchema = async ({ schema, json }: ValidateSchemaProps) => { 12 | await test.step('Validating json schema', async () => { 13 | const validate = ajv.compile(schema); 14 | 15 | if (!validate(json)) { 16 | const prettyJson = JSON.stringify(json, null, 2); 17 | const prettyError = JSON.stringify(validate.errors, null, 2); 18 | throw Error(`Schema validation error: ${prettyError}\nJSON: ${prettyJson}`); 19 | } 20 | }); 21 | }; 22 | -------------------------------------------------------------------------------- /utils/types/api/authentication.ts: -------------------------------------------------------------------------------- 1 | export interface AuthUser { 2 | email: string; 3 | password: string; 4 | } 5 | 6 | export interface APIAuth { 7 | authToken?: string; 8 | user?: AuthUser; 9 | } 10 | -------------------------------------------------------------------------------- /utils/types/api/client.ts: -------------------------------------------------------------------------------- 1 | import { APIRequestContext } from '@playwright/test'; 2 | 3 | export interface APIClient { 4 | context: APIRequestContext; 5 | } 6 | -------------------------------------------------------------------------------- /utils/types/api/questions.ts: -------------------------------------------------------------------------------- 1 | export interface Question { 2 | id: number; 3 | question: string; 4 | possibleAnswers: string[]; 5 | correctAnswer: string | number; 6 | } 7 | 8 | export interface UpdateQuestion extends Partial> {} 9 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@playwright/test@^1.31.0": 6 | version "1.31.0" 7 | resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.31.0.tgz#bde42ca06804164be54893525110adda946248d6" 8 | integrity sha512-Ys5s/06Dg9g3zAIdCIb/UOBYim3U7Zjb3DvC6XBtnRmnglH5O47iwYzmtxXu9fhSyzI2Jn28apkXIOD81GgCdw== 9 | dependencies: 10 | "@types/node" "*" 11 | playwright-core "1.31.0" 12 | optionalDependencies: 13 | fsevents "2.3.2" 14 | 15 | "@types/node@*": 16 | version "18.14.0" 17 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.0.tgz#94c47b9217bbac49d4a67a967fdcdeed89ebb7d0" 18 | integrity sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A== 19 | 20 | ajv@^8.12.0: 21 | version "8.12.0" 22 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" 23 | integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== 24 | dependencies: 25 | fast-deep-equal "^3.1.1" 26 | json-schema-traverse "^1.0.0" 27 | require-from-string "^2.0.2" 28 | uri-js "^4.2.2" 29 | 30 | allure-js-commons@2.0.0: 31 | version "2.0.0" 32 | resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.0.0.tgz#99ed4fd0fed9686402e0610b97cf62ea0547e826" 33 | integrity sha512-zIUwkNjsQYvJ/pC1SkgnUk9du6tJ6tF9fK1z4bEm+oyJJPALvgqNeERTtkQI3PNAKwQdEMluZ+FqFn8I7lrt+A== 34 | dependencies: 35 | properties "^1.2.1" 36 | uuid "^8.3.0" 37 | 38 | allure-playwright@^2.0.0: 39 | version "2.0.0" 40 | resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.0.0.tgz#546f8fd865fa42f929d3146ec9c4cbbd2643689c" 41 | integrity sha512-uBdtmwMHIqZD0hHCe+SWTfcXVjFv0TZBAR/GYRu6JK6XYo0DPJdZicogCK2g/LK1hUzv0d/e0Wt5ZUepqARSZw== 42 | dependencies: 43 | allure-js-commons "2.0.0" 44 | 45 | dotenv@^16.0.3: 46 | version "16.0.3" 47 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" 48 | integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== 49 | 50 | fast-deep-equal@^3.1.1: 51 | version "3.1.3" 52 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 53 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 54 | 55 | fsevents@2.3.2: 56 | version "2.3.2" 57 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 58 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 59 | 60 | json-schema-traverse@^1.0.0: 61 | version "1.0.0" 62 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 63 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 64 | 65 | playwright-core@1.31.0: 66 | version "1.31.0" 67 | resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.31.0.tgz#dbd184771535e76c6743ef5c082def5564f07e85" 68 | integrity sha512-/KquBjS5DcASCh8cGeNVHuC0kyb7c9plKTwaKxgOGtxT7+DZO2fjmFvPDBSXslEIK5CeOO/2kk5rOCktFXKEdA== 69 | 70 | properties@^1.2.1: 71 | version "1.2.1" 72 | resolved "https://registry.yarnpkg.com/properties/-/properties-1.2.1.tgz#0ee97a7fc020b1a2a55b8659eda4aa8d869094bd" 73 | integrity sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ== 74 | 75 | punycode@^2.1.0: 76 | version "2.3.0" 77 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 78 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 79 | 80 | require-from-string@^2.0.2: 81 | version "2.0.2" 82 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 83 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 84 | 85 | uri-js@^4.2.2: 86 | version "4.4.1" 87 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 88 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 89 | dependencies: 90 | punycode "^2.1.0" 91 | 92 | uuid@^8.3.0: 93 | version "8.3.2" 94 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 95 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 96 | --------------------------------------------------------------------------------