├── .github └── workflows │ ├── build-tests.yml │ └── workflow-action.yml ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── flake-guard-app ├── .editorconfig ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .prettierrc.js ├── Dockerfile ├── babel.config.js ├── dataobj.json ├── global.d.ts ├── jest.config.js ├── jest.setup.ts ├── package-lock.json ├── package.json ├── src │ ├── client │ │ ├── app.test.tsx │ │ ├── app.tsx │ │ ├── assets │ │ │ ├── advantage1.png │ │ │ ├── advantage2.png │ │ │ ├── advantage3.png │ │ │ ├── advantage4.png │ │ │ ├── arrow.png │ │ │ ├── ashley.png │ │ │ ├── brendan.png │ │ │ ├── condensed-logo.png │ │ │ ├── download.png │ │ │ ├── flakeguard-logo-white-background.png │ │ │ ├── github-logo.png │ │ │ ├── github-mark-white.png │ │ │ ├── github-mark.png │ │ │ ├── graphs.png │ │ │ ├── linkedinlogo.png │ │ │ ├── logo.png │ │ │ ├── logo_with_background.png │ │ │ ├── npm.png │ │ │ ├── paloma.png │ │ │ ├── signout.png │ │ │ ├── tommy.png │ │ │ └── will.png │ │ ├── docs │ │ │ ├── DocPage.tsx │ │ │ ├── FAQ.tsx │ │ │ └── faq.test.tsx │ │ ├── flakeRiskSign │ │ │ ├── Analytics │ │ │ │ ├── assertion-failures-percent.tsx │ │ │ │ ├── flake-percentage.tsx │ │ │ │ └── overall-failed-percentage.tsx │ │ │ └── FlakeRiskSign │ │ │ │ ├── FlakeRiskArrow.tsx │ │ │ │ ├── FlakeRiskContainer.tsx │ │ │ │ ├── FlakeRiskSign.tsx │ │ │ │ └── FlakeRiskSlice.tsx │ │ ├── index.html │ │ ├── index.tsx │ │ ├── landingPage │ │ │ ├── LandingPage.tsx │ │ │ └── components │ │ │ │ ├── Advantages.tsx │ │ │ │ ├── Footer.tsx │ │ │ │ ├── LoginButton.tsx │ │ │ │ ├── MeetTheTeam.tsx │ │ │ │ ├── NavBar.tsx │ │ │ │ └── advantages.test.tsx │ │ ├── services │ │ │ └── index.tsx │ │ ├── styles │ │ │ ├── advantages.css │ │ │ ├── dashboard.css │ │ │ ├── dashboard │ │ │ │ ├── charts.css │ │ │ │ ├── newDashboard.css │ │ │ │ └── sidebar.css │ │ │ ├── decisionPage.css │ │ │ ├── docs.css │ │ │ ├── footer.css │ │ │ ├── header.css │ │ │ ├── landingPage.css │ │ │ ├── riskSign.css │ │ │ ├── styles.css │ │ │ ├── tailwind-output.css │ │ │ └── tempDash.css │ │ ├── supabaseClient.ts │ │ ├── tempDash │ │ │ ├── DecisionPage.tsx │ │ │ ├── TempDashboard.tsx │ │ │ └── components │ │ │ │ ├── AssertionsGraph.tsx │ │ │ │ ├── DisplayErrors.tsx │ │ │ │ ├── Flakiness.tsx │ │ │ │ └── Summary.tsx │ │ ├── types.ts │ │ ├── userDash │ │ │ ├── UserDashboard.tsx │ │ │ ├── components │ │ │ │ ├── Sidebar.tsx │ │ │ │ ├── bar │ │ │ │ │ ├── BarChart.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── calendar │ │ │ │ │ ├── Calendar.tsx │ │ │ │ │ └── data.ts │ │ │ │ ├── duration │ │ │ │ │ └── Duration.tsx │ │ │ │ ├── errorsDetails │ │ │ │ │ └── ErrorsDetails.tsx │ │ │ │ ├── line │ │ │ │ │ └── LineChart.tsx │ │ │ │ └── pie │ │ │ │ │ └── PieChart.tsx │ │ │ ├── contexts │ │ │ │ └── ResultContext.tsx │ │ │ └── pages │ │ │ │ ├── codeCoverage │ │ │ │ └── CodeCoverage.tsx │ │ │ │ ├── flakyTests │ │ │ │ └── FlakyTests.tsx │ │ │ │ └── history │ │ │ │ └── History.tsx │ │ └── utilities │ │ │ ├── barchartDataParser.ts │ │ │ ├── displayErrorsDataParser.ts │ │ │ ├── flakyDataParser.ts │ │ │ └── lineChartParser.ts │ └── server │ │ ├── controllers │ │ ├── cacheController.test.js │ │ ├── cacheController.ts │ │ ├── dbController.test.js │ │ ├── dbController.ts │ │ ├── npmController.test.js │ │ ├── npmController.ts │ │ ├── tempCache.test.js │ │ ├── urlController.test.js │ │ └── urlController.ts │ │ ├── db │ │ └── db.ts │ │ ├── errors │ │ ├── CustomError.ts │ │ ├── errorHandler.ts │ │ └── errors.ts │ │ ├── routes │ │ ├── resultsRouter.ts │ │ ├── tempDashRouter.ts │ │ └── userDashRouter.ts │ │ ├── server.ts │ │ └── tempCache.ts ├── tailwind.config.js ├── tsconfig.json └── webpack.config.js └── flake-guard-npm ├── .gitignore ├── README.md ├── default.json ├── index.js ├── loadConfig.js └── package.json /.github/workflows/build-tests.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs 3 | 4 | name: build-tests 5 | 6 | on: 7 | pull_request: 8 | branches: [ "main" ] 9 | 10 | jobs: 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | strategy: 16 | matrix: 17 | node-version: [20.x] 18 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 19 | 20 | steps: 21 | - uses: actions/checkout@v4 22 | - name: Use Node.js ${{ matrix.node-version }} 23 | uses: actions/setup-node@v3 24 | with: 25 | node-version: ${{ matrix.node-version }} 26 | cache: 'npm' 27 | - run: npm ci 28 | - run: npm run build --if-present 29 | - run: npm test 30 | -------------------------------------------------------------------------------- /.github/workflows/workflow-action.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: CI Workflow 4 | 5 | # Controls when the workflow will run 6 | on: workflow_dispatch 7 | # Triggers the workflow on push or pull request events but only for the "dev" branch 8 | # push: 9 | # branches: [ "dev" ] 10 | # pull_request: 11 | # branches: [ "dev" ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | # workflow_dispatch: workflow_dispatch 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | first-job: 19 | runs-on: ubuntu-latest 20 | # Steps represent a sequence of tasks that will be executed as part of the job 21 | steps: 22 | # Runs a single command using the runners shell 23 | - name: Print greeting 24 | run: | 25 | echo "Hello World!" 26 | echo "Second line! 27 | - name: Print goodbye 28 | run: echo "Done - goodbye!" 29 | 30 | # This workflow contains a single job called "build" 31 | # build: 32 | # # The type of runner that the job will run on 33 | # runs-on: ubuntu-latest 34 | 35 | 36 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 37 | # - uses: actions/checkout@v4 38 | 39 | 40 | # # Runs a set of commands using the runners shell 41 | # - name: Run a multi-line script 42 | # run: | 43 | # echo Add other actions to build, 44 | # echo test, and deploy your project. 45 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 🚀 Welcome to FlakeGuard contribution, we are thrillled to have you here! 🚀 2 | 3 | # How Do I submit A (Good) Pull Request? 4 | All pull requests will be reviewed by the authors and will either be 5 | 1. Denied 6 | 2. Denied with feedback 7 | 3. Approved contingent upon minor changes 8 | 4. Approved and merged 9 | 10 | ## Testing 11 | Please write Jest, or React Testing Library files to test the new code you create. 12 | 13 | ## Pull Request 14 | Please send a Pull Request to FlakeGuard with a clear list of what you've done (read more about [pull requests](https://support.github.com/)). When you send a pull request, we will love you forever if you include RSpec examples. We can always use more test coverage. Please follow our coding conventions (below) and make sure all of your commits are atomic (one feature per commit). 15 | 16 | Always write a clear log message for your commits, including a summary and a detailed paragraph about all changes and testing. 17 | 18 | 19 | # How Do I Submit A (Good) Bug Report? 20 | Bugs are tracked as [GitHub Issues](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues). 21 | 22 | 1. Create an issue and provide the following information by filling in the template. 23 | 2. Explain the problem and include additional details to help maintainers reproduce the problem: 24 | 25 | *Use a clear and descriptive title for the issue to identify the problem.* 26 | 27 | Describe the exact steps which reproduce the problem in as many details as possible. 28 | Provide specific examples to demonstrate the steps. Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. 29 | If you're providing snippets in the issue, use Markdown code blocks. 30 | Describe the behavior you observed after following the steps and point out what exactly is the problem with that behavior. 31 | Explain which behavior you expected to see instead and why. 32 | 33 | If the problem wasn't triggered by a specific action, describe what you were doing before the problem happened and share more information. 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | [MIT License] 2 | 3 | Copyright (c) 2024 Open Source FlakeGuard 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 🚀 Welcome to flake guard! 🚀 4 | ### [Website](https://flakeguard.com/) | | [Npm](https://www.npmjs.com/package/flake-guard) | | [Medium](https://medium.com/@ashleyhannigan88/flake-guard-open-source-01431eb6ede3) 5 |
6 | javascipt logo 7 | typescript logo 8 | react js 9 | tailwind css logo 10 | jest logo 11 | react testing library logo 12 | npm logo 13 | nivo react charts logo 14 | chartjs logo 15 | supabase logo 16 | Docker logo 17 | 18 |
19 | 20 | ### FlakeGuard is a free, open-source software that allows developers to run Jest tests to automatically detect, report, and track flaky tests in software development. 21 | --- 22 | *Flaky test: a test that sometimes passes and sometimes fails for the same code, often due to nondeterministic factors like timing issues, network variability, or reliance on external systems.* 23 | 24 | **By identifying flaky tests, FlakeGuard helps users improve test assurances.** 25 | 26 | ## __Table of Contents__ 27 | 1. [Demo](#Demo) 28 | 2. [Getting Started](#getting-started) 29 | 3. [How it works](#how-it-works) 30 | 4. [Tracked dashboard metrics](#tracked-dashboard-metrics) 31 | 5. [Authors](#authors) 32 | 6. [Contributing](#contributing) 33 | 34 | --- 35 | # Getting Started 36 | 37 | Install the FlakeGuard NPM package as a dev dependency by running the command 38 | ```npm i flake-guard --save-dev``` 39 | 40 | To run FlakeGuard in your project, simply execute the command 41 | ```npx flake-guard ``` 42 | . Change `` to the name of the test file that you want to examine. 43 | 44 | 👁️FlakeGuard will analyze your tests for flakiness by executing multiple test runs and analyzing the results. _The default number of test runs is 10_, but this can be adjusted as described below. 45 | 46 | In general, there is a time versus accuracy tradeoff. More test executions increase accuracy but reduce speed. 47 | 48 | ## Configuration: 49 | To adjust FlakeGuard configuration variables, you can create a file in the root directory of your project called 50 | fg.config.json 51 | . Below are the defaults, which can be overridden in your local 'fg.config.json' file. 52 | 53 | 54 | ``` 55 | { 56 | runs: 10 57 | } 58 | ``` 59 | For example, if you want to increase accuracy, you can increase test runs. 60 | ``` 61 | { 62 | runs: 100 63 | } 64 | ``` 65 | 66 | # How It Works 67 | Under the hood, the flake-guard npm package is automating repeated runs of your test file. It will do a parsing of the results locally to log an object in your terminal with all of your test assertions and their pass/fail metrics. It sends off the raw Jest results objects to the FlakeGuard server for further analysis which you can view at flakeguard.com. 68 | 69 | 70 | # Tracked Dashboard Metrics 71 |
72 | 73 |
74 | The flake-guard NPM package pairs with the FlakeGuard web application. After the package runs in the terminal, the user will have the option to press Enter to send the results to the FlakeGuard server and open the FlakeGuard app in the browser. 75 | 76 | The user will be directed to a page where they have the option to either view a one-time simplified version of the user dashboard, or log in via Github to view advanced metrics and save their data to view the evolution of their test suite over time. 77 | 78 | # Future Features and Contributors 79 | We welcome feedback, new ideas, and contributors! 80 | 81 | Some features next in line for development include: 82 | 83 | - Allowing users to organize their stored results by filename 84 | - Incorporating Jest's code coverage metrics to visualize test suite coverage metrics and track changes over time 85 | - A history page where users can review previous results individually 86 | - Further tools to help users mitigate test flake, such as pinpointing test failure points and generating potential solutions 87 | 88 | --- 89 | # Authors 90 | | Name | Connect with Us | 91 | | ------------- |:-------------:| 92 | | Ashley Hannigan | [LinkedIn](https://www.linkedin.com/in/ashley-hannigan-88-/) `-` [Github](https://github.com/ashhannigan) 93 | | Brendan Xiong | [LinkedIn](https://www.linkedin.com/in/brendanxiong/) `-` [Github](https://github.com/brendanxiong) 94 | | Tommy Martinez | [LinkedIn](https://www.linkedin.com/in/tommy-martinez/) `-` [Github](https://github.com/tmm150) 95 | | Paloma Reynolds | [LinkedIn](https://www.linkedin.com/in/palomareynolds/) `-` [Github](https://github.com/palomareynolds) 96 | | Will Suto | [LinkedIn](https://www.linkedin.com/in/willsuto/) `-` [Github](https://github.com/willsuto) 97 | 98 | # Contributing 99 | [CONTRIBUTING.md](CONTRIBUTING.md) 100 | -------------------------------------------------------------------------------- /flake-guard-app/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | insert_final_newline = true 9 | -------------------------------------------------------------------------------- /flake-guard-app/.eslintignore: -------------------------------------------------------------------------------- 1 | build/ 2 | -------------------------------------------------------------------------------- /flake-guard-app/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./node_modules/gts/", 3 | "rules": { 4 | "node/no-unpublished-require": [ 5 | "error", 6 | { 7 | "allowModules": [ 8 | "html-webpack-plugin", 9 | "mini-css-extract-plugin", 10 | "workbox-webpack-plugin" 11 | ] 12 | } 13 | ] 14 | }, 15 | "plugins": ["react", "@typescript-eslint", "prettier", "jest"], 16 | "settings": { 17 | "react": { 18 | "version": "detect" 19 | } 20 | }, 21 | "overrides": [ 22 | // Different options based on file extensions. 23 | { 24 | "parser": "babel-eslint", 25 | "files": ["**.js"] 26 | }, 27 | { 28 | "parser": "@typescript-eslint/parser", 29 | "files": ["**.ts"] 30 | } 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /flake-guard-app/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | build/ 4 | coverage/ 5 | dist/ 6 | 7 | # Logs 8 | logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | lerna-debug.log* 14 | 15 | # Diagnostic reports (https://nodejs.org/api/report.html) 16 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 17 | 18 | # Runtime data 19 | pids 20 | *.pid 21 | *.seed 22 | *.pid.lock 23 | 24 | # Directory for instrumented libs generated by jscoverage/JSCover 25 | lib-cov 26 | 27 | # Coverage directory used by tools like istanbul 28 | coverage 29 | *.lcov 30 | 31 | # nyc test coverage 32 | .nyc_output 33 | 34 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 35 | .grunt 36 | 37 | # Bower dependency directory (https://bower.io/) 38 | bower_components 39 | 40 | # node-waf configuration 41 | .lock-wscript 42 | 43 | # Compiled binary addons (https://nodejs.org/api/addons.html) 44 | build/Release 45 | 46 | # Dependency directories 47 | node_modules/ 48 | jspm_packages/ 49 | 50 | # TypeScript v1 declaration files 51 | typings/ 52 | 53 | # TypeScript cache 54 | *.tsbuildinfo 55 | 56 | # Optional npm cache directory 57 | .npm 58 | 59 | # Optional eslint cache 60 | .eslintcache 61 | 62 | # Microbundle cache 63 | .rpt2_cache/ 64 | .rts2_cache_cjs/ 65 | .rts2_cache_es/ 66 | .rts2_cache_umd/ 67 | 68 | # Optional REPL history 69 | .node_repl_history 70 | 71 | # Output of 'npm pack' 72 | *.tgz 73 | 74 | # Yarn Integrity file 75 | .yarn-integrity 76 | 77 | # dotenv environment variables file 78 | .env 79 | .env.test 80 | 81 | # parcel-bundler cache (https://parceljs.org/) 82 | .cache 83 | 84 | # Next.js build output 85 | .next 86 | 87 | # Nuxt.js build / generate output 88 | .nuxt 89 | 90 | # Gatsby files 91 | .cache/ 92 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 93 | # https://nextjs.org/blog/next-9-1#public-directory-support 94 | # public 95 | 96 | # vuepress build output 97 | .vuepress/dist 98 | 99 | # Serverless directories 100 | .serverless/ 101 | 102 | # FuseBox cache 103 | .fusebox/ 104 | 105 | # DynamoDB Local files 106 | .dynamodb/ 107 | 108 | # TernJS port file 109 | .tern-port 110 | 111 | # VSCode files 112 | sapling/out 113 | sapling/dist 114 | sapling/node_modules 115 | sapling/.vscode-test/ 116 | *.vsix 117 | -------------------------------------------------------------------------------- /flake-guard-app/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | ...require('gts/.prettierrc.json') 3 | } 4 | -------------------------------------------------------------------------------- /flake-guard-app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20.12 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY . /usr/src/app/ 6 | 7 | RUN npm install 8 | RUN npm install -g ts-node 9 | RUN npm run build 10 | 11 | EXPOSE 3000 12 | 13 | ENTRYPOINT ["ts-node", "./src/server/server.ts"] 14 | -------------------------------------------------------------------------------- /flake-guard-app/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | ['@babel/preset-env', {targets: {node: 'current'}}], 4 | '@babel/preset-typescript', 5 | // ['@babel/preset-react', {runtime: 'automatic'}], 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /flake-guard-app/dataobj.json: -------------------------------------------------------------------------------- 1 | [{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":1,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":2,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1717621230000,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["Page loading","Initial page load"],"duration":772,"failureDetails":[],"failureMessages":[],"fullName":"Page loading Initial page load loads page successfully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"loads page successfully"},{"ancestorTitles":["Page functionality","State interactions"],"duration":753,"failureDetails":[{}],"failureMessages":["Error: No element found for selector: new-location\n at assert (/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/node_modules/puppeteer/src/common/assert.ts:27:11)\n at DOMWorld.focus (/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/node_modules/puppeteer/src/common/DOMWorld.ts:566:11)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"],"fullName":"Page functionality State interactions can add a new market","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"can add a new market"}],"endTime":1717621233176,"message":" ● Page functionality › State interactions › can add a new market\n\n No element found for selector: new-location\n\n at assert (node_modules/puppeteer/src/common/assert.ts:27:11)\n at DOMWorld.focus (node_modules/puppeteer/src/common/DOMWorld.ts:566:11)\n","name":"/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/__tests__/puppeteer2.js","startTime":1717621230533,"status":"failed","summary":""}],"wasInterrupted":false},{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":1,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":2,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1717621233753,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["Page loading","Initial page load"],"duration":782,"failureDetails":[],"failureMessages":[],"fullName":"Page loading Initial page load loads page successfully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"loads page successfully"},{"ancestorTitles":["Page functionality","State interactions"],"duration":748,"failureDetails":[{}],"failureMessages":["Error: No element found for selector: new-location\n at assert (/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/node_modules/puppeteer/src/common/assert.ts:27:11)\n at DOMWorld.focus (/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/node_modules/puppeteer/src/common/DOMWorld.ts:566:11)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"],"fullName":"Page functionality State interactions can add a new market","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"can add a new market"}],"endTime":1717621236808,"message":" ● Page functionality › State interactions › can add a new market\n\n No element found for selector: new-location\n\n at assert (node_modules/puppeteer/src/common/assert.ts:27:11)\n at DOMWorld.focus (node_modules/puppeteer/src/common/DOMWorld.ts:566:11)\n","name":"/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/__tests__/puppeteer2.js","startTime":1717621234230,"status":"failed","summary":""}],"wasInterrupted":false},{"numFailedTestSuites":1,"numFailedTests":1,"numPassedTestSuites":0,"numPassedTests":1,"numPendingTestSuites":0,"numPendingTests":0,"numRuntimeErrorTestSuites":0,"numTodoTests":0,"numTotalTestSuites":1,"numTotalTests":2,"openHandles":[],"snapshot":{"added":0,"didUpdate":false,"failure":false,"filesAdded":0,"filesRemoved":0,"filesRemovedList":[],"filesUnmatched":0,"filesUpdated":0,"matched":0,"total":0,"unchecked":0,"uncheckedKeysByFile":[],"unmatched":0,"updated":0},"startTime":1717621237390,"success":false,"testResults":[{"assertionResults":[{"ancestorTitles":["Page loading","Initial page load"],"duration":798,"failureDetails":[],"failureMessages":[],"fullName":"Page loading Initial page load loads page successfully","invocations":1,"location":null,"numPassingAsserts":1,"retryReasons":[],"status":"passed","title":"loads page successfully"},{"ancestorTitles":["Page functionality","State interactions"],"duration":778,"failureDetails":[{}],"failureMessages":["Error: No element found for selector: new-location\n at assert (/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/node_modules/puppeteer/src/common/assert.ts:27:11)\n at DOMWorld.focus (/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/node_modules/puppeteer/src/common/DOMWorld.ts:566:11)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"],"fullName":"Page functionality State interactions can add a new market","invocations":1,"location":null,"numPassingAsserts":0,"retryReasons":[],"status":"failed","title":"can add a new market"}],"endTime":1717621240491,"message":" ● Page functionality › State interactions › can add a new market\n\n No element found for selector: new-location\n\n at assert (node_modules/puppeteer/src/common/assert.ts:27:11)\n at DOMWorld.focus (node_modules/puppeteer/src/common/DOMWorld.ts:566:11)\n","name":"/Users/willsuto/Desktop/Codesmith/Coursework/OSP/Test App/__tests__/puppeteer2.js","startTime":1717621237865,"status":"failed","summary":""}],"wasInterrupted":false}] -------------------------------------------------------------------------------- /flake-guard-app/global.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.css' { 2 | const content: {[className: string]: string}; 3 | export default content; 4 | } 5 | declare module '*.png' { 6 | const value: string; 7 | export default value; 8 | } 9 | 10 | declare module '*.jpg' { 11 | const value: string; 12 | export default value; 13 | } 14 | 15 | declare module '*.gif' { 16 | const value: string; 17 | export default value; 18 | } 19 | 20 | declare module '*.svg' { 21 | const value: string; 22 | export default value; 23 | } 24 | 25 | declare module '*.woff' { 26 | const value: string; 27 | export default value; 28 | } 29 | 30 | declare module '*.woff2' { 31 | const value: string; 32 | export default value; 33 | } 34 | 35 | declare module '*.eot' { 36 | const value: string; 37 | export default value; 38 | } 39 | 40 | declare module '*.ttf' { 41 | const value: string; 42 | export default value; 43 | } 44 | -------------------------------------------------------------------------------- /flake-guard-app/jest.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * For a detailed explanation regarding each configuration property, visit: 3 | * https://jestjs.io/docs/configuration 4 | */ 5 | 6 | /** @type {import('jest').Config} */ 7 | const config = { 8 | // All imported modules in your tests should be mocked automatically 9 | // automock: false, 10 | 11 | // Stop running tests after `n` failures 12 | // bail: 0, 13 | 14 | // The directory where Jest should store its cached dependency information 15 | // cacheDirectory: "/private/var/folders/52/mww99m6x1qs17jmf0g9d5p040000gn/T/jest_dx", 16 | 17 | // Automatically clear mock calls, instances, contexts and results before every test 18 | clearMocks: true, 19 | 20 | // Indicates whether the coverage information should be collected while executing the test 21 | collectCoverage: true, 22 | 23 | // An array of glob patterns indicating a set of files for which coverage information should be collected 24 | // collectCoverageFrom: undefined, 25 | 26 | // The directory where Jest should output its coverage files 27 | coverageDirectory: 'coverage', 28 | 29 | // An array of regexp pattern strings used to skip coverage collection 30 | // coveragePathIgnorePatterns: [ 31 | // "/node_modules/" 32 | // ], 33 | 34 | // Indicates which provider should be used to instrument code for coverage 35 | coverageProvider: 'v8', 36 | 37 | // A list of reporter names that Jest uses when writing coverage reports 38 | // coverageReporters: [ 39 | // "json", 40 | // "text", 41 | // "lcov", 42 | // "clover" 43 | // ], 44 | 45 | // An object that configures minimum threshold enforcement for coverage results 46 | // coverageThreshold: undefined, 47 | 48 | // A path to a custom dependency extractor 49 | // dependencyExtractor: undefined, 50 | 51 | // Make calling deprecated APIs throw helpful error messages 52 | // errorOnDeprecated: false, 53 | 54 | // The default configuration for fake timers 55 | // fakeTimers: { 56 | // "enableGlobally": false 57 | // }, 58 | 59 | // Force coverage collection from ignored files using an array of glob patterns 60 | // forceCoverageMatch: [], 61 | 62 | // A path to a module which exports an async function that is triggered once before all test suites 63 | // globalSetup: undefined, 64 | 65 | // A path to a module which exports an async function that is triggered once after all test suites 66 | // globalTeardown: undefined, 67 | 68 | // A set of global variables that need to be available in all test environments 69 | // globals: {}, 70 | 71 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. 72 | // maxWorkers: "50%", 73 | 74 | // An array of directory names to be searched recursively up from the requiring module's location 75 | // moduleDirectories: [ 76 | // "node_modules" 77 | // ], 78 | 79 | // An array of file extensions your modules use 80 | // moduleFileExtensions: [ 81 | // "js", 82 | // "mjs", 83 | // "cjs", 84 | // "jsx", 85 | // "ts", 86 | // "tsx", 87 | // "json", 88 | // "node" 89 | // ], 90 | 91 | // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module 92 | // moduleNameMapper: {}, 93 | 94 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader 95 | // modulePathIgnorePatterns: [], 96 | 97 | // Activates notifications for test results 98 | // notify: false, 99 | 100 | // An enum that specifies notification mode. Requires { notify: true } 101 | // notifyMode: "failure-change", 102 | 103 | // A preset that is used as a base for Jest's configuration 104 | // preset: 'ts-jest', 105 | 106 | // Run tests from one or more projects 107 | // projects: undefined, 108 | 109 | // Use this configuration option to add custom reporters to Jest 110 | // reporters: undefined, 111 | 112 | // Automatically reset mock state before every test 113 | // resetMocks: false, 114 | 115 | // Reset the module registry before running each individual test 116 | // resetModules: false, 117 | 118 | // A path to a custom resolver 119 | // resolver: undefined, 120 | 121 | // Automatically restore mock state and implementation before every test 122 | // restoreMocks: false, 123 | 124 | // The root directory that Jest should scan for tests and modules within 125 | // rootDir: undefined, 126 | 127 | // A list of paths to directories that Jest should use to search for files in 128 | // roots: [ 129 | // "" 130 | // ], 131 | 132 | // Allows you to use a custom runner instead of Jest's default test runner 133 | // runner: "jest-runner", 134 | 135 | // The paths to modules that run some code to configure or set up the testing environment before each test 136 | // setupFiles: [], 137 | 138 | // A list of paths to modules that run some code to configure or set up the testing framework before each test 139 | // setupFilesAfterEnv: [], 140 | 141 | // The number of seconds after which a test is considered as slow and reported as such in the results. 142 | // slowTestThreshold: 5, 143 | 144 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing 145 | // snapshotSerializers: [], 146 | 147 | // The test environment that will be used for testing 148 | testEnvironment: 'jest-environment-node', 149 | 150 | // Options that will be passed to the testEnvironment 151 | // testEnvironmentOptions: {}, 152 | 153 | // Adds a location field to test results 154 | // testLocationInResults: false, 155 | 156 | // The glob patterns Jest uses to detect test files 157 | // testMatch: [ 158 | // "**/__tests__/**/*.[jt]s?(x)", 159 | // "**/?(*.)+(spec|test).[tj]s?(x)" 160 | // ], 161 | 162 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped 163 | // testPathIgnorePatterns: [ 164 | // "/node_modules/" 165 | // ], 166 | 167 | // The regexp pattern or array of patterns that Jest uses to detect test files 168 | // testRegex: [], 169 | 170 | // This option allows the use of a custom results processor 171 | // testResultsProcessor: undefined, 172 | 173 | // This option allows use of a custom test runner 174 | // testRunner: "jest-circus/runner", 175 | 176 | // A map from regular expressions to paths to transformers 177 | // transform: undefined, 178 | transform: { 179 | "^.+\\.(t|j)sx?$": "ts-jest", 180 | ".+\\.(css|scss|png|jpg|svg)$": "jest-transform-stub" 181 | }, 182 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation 183 | // transformIgnorePatterns: [ 184 | // "/node_modules/", 185 | // "\\.pnp\\.[^\\/]+$" 186 | // ], 187 | 188 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them 189 | // unmockedModulePathPatterns: undefined, 190 | 191 | // Indicates whether each individual test should be reported during the run 192 | // verbose: undefined, 193 | 194 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode 195 | // watchPathIgnorePatterns: [], 196 | 197 | // Whether to use watchman for file crawling 198 | // watchman: true, 199 | }; 200 | 201 | module.exports = config; 202 | -------------------------------------------------------------------------------- /flake-guard-app/jest.setup.ts: -------------------------------------------------------------------------------- 1 | import 'ts-node/register'; 2 | -------------------------------------------------------------------------------- /flake-guard-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flake-guard", 3 | "version": "1.0.0", 4 | "description": "Stability Starts Here: Master Test Flakiness, Ensure Reliability", 5 | "main": "./src/client/index.tsx", 6 | "scripts": { 7 | "start": "concurrently \"webpack serve --open\" \"nodemon ./src/server/server.ts\"", 8 | "test": "jest", 9 | "build": "webpack --mode=production --node-env=production", 10 | "build:dev": "webpack --mode=development", 11 | "build:prod": "webpack --mode=production --node-env=production", 12 | "watch": "webpack --watch", 13 | "serve": "webpack serve", 14 | "lint": "gts lint", 15 | "clean": "gts clean", 16 | "compile": "tsc", 17 | "fix": "gts fix" 18 | }, 19 | "author": "", 20 | "license": "ISC", 21 | "devDependencies": { 22 | "@babel/core": "^7.24.8", 23 | "@babel/preset-env": "^7.24.8", 24 | "@babel/preset-react": "^7.24.7", 25 | "@babel/preset-typescript": "^7.24.7", 26 | "@eslint/js": "^9.3.0", 27 | "@jest/globals": "^29.7.0", 28 | "@testing-library/dom": "^10.3.2", 29 | "@testing-library/jest-dom": "^6.4.6", 30 | "@testing-library/react": "^16.0.0", 31 | "@types/bootstrap": "^5.2.10", 32 | "@types/cors": "^2.8.17", 33 | "@types/express": "^4.17.21", 34 | "@types/faker": "^6.6.9", 35 | "@types/jest": "^29.5.12", 36 | "@types/lodash": "^4.17.6", 37 | "@types/node": "^20.14.2", 38 | "@types/react": "^18.3.3", 39 | "@types/react-dom": "^18.3.0", 40 | "@types/react-redux": "^7.1.33", 41 | "@types/react-router-dom": "^5.3.3", 42 | "@types/webpack": "^5.28.5", 43 | "babel-jest": "^29.7.0", 44 | "css-loader": "^7.1.2", 45 | "eslint": "^8.57.0", 46 | "eslint-plugin-react": "^7.34.4", 47 | "globals": "^15.3.0", 48 | "gts": "^5.3.0", 49 | "html-webpack-plugin": "^5.6.0", 50 | "jest": "^29.7.0", 51 | "jest-environment-jsdom": "^29.7.0", 52 | "mini-css-extract-plugin": "^2.9.0", 53 | "style-loader": "^4.0.0", 54 | "tailwindcss": "^3.4.4", 55 | "ts-jest": "^29.2.2", 56 | "ts-loader": "^9.5.1", 57 | "ts-node": "^10.9.2", 58 | "tslint-config-prettier": "^1.18.0", 59 | "typescript": "^5.4.5", 60 | "typescript-eslint": "^7.11.0", 61 | "webpack": "^5.91.0", 62 | "webpack-cli": "^5.1.4", 63 | "webpack-dev-server": "^5.0.4", 64 | "workbox-webpack-plugin": "^7.1.0" 65 | }, 66 | "dependencies": { 67 | "@coreui/icons": "^3.0.1", 68 | "@coreui/react": "^5.1.0", 69 | "@emotion/css": "^11.11.2", 70 | "@emotion/react": "^11.11.4", 71 | "@emotion/styled": "^11.11.5", 72 | "@fontsource/roboto": "^5.0.13", 73 | "@mui/icons-material": "^5.16.4", 74 | "@mui/material": "^5.16.4", 75 | "@mui/styled-engine-sc": "^6.0.0-alpha.18", 76 | "@mui/system": "^5.15.20", 77 | "@mui/x-charts": "^7.7.0", 78 | "@nivo/bar": "^0.87.0", 79 | "@nivo/calendar": "^0.87.0", 80 | "@nivo/core": "^0.87.0", 81 | "@nivo/line": "^0.87.0", 82 | "@nivo/pie": "^0.87.0", 83 | "@reduxjs/toolkit": "^2.2.5", 84 | "@supabase/supabase-js": "^2.43.4", 85 | "@testing-library/user-event": "^14.5.2", 86 | "@types/chart.js": "^2.9.41", 87 | "axios": "^1.7.4", 88 | "body-parser": "^1.20.3", 89 | "bootstrap": "^5.3.3", 90 | "chart.js": "^4.4.3", 91 | "chartjs-plugin-datalabels": "^2.2.0", 92 | "concurrently": "^8.2.2", 93 | "cors": "^2.8.5", 94 | "dotenv": "^16.4.5", 95 | "express": "^4.21.0", 96 | "faker": "^5.5.3", 97 | "jest-transform-css": "^6.0.1", 98 | "jest-transform-stub": "^2.0.0", 99 | "nodemon": "^3.1.2", 100 | "postgres": "^3.4.4", 101 | "react": "^17.0.0 || ^18.0.0", 102 | "react-bootstrap": "^2.10.4", 103 | "react-chartjs-2": "^5.2.0", 104 | "react-dom": "^17.0.0 || ^18.0.0", 105 | "react-icons": "^5.2.1", 106 | "react-icons-kit": "^2.0.0", 107 | "react-pro-sidebar": "^1.1.0", 108 | "react-redux": "^9.1.2", 109 | "react-router-dom": "^6.25.0", 110 | "recharts": "^2.12.7", 111 | "styled-components": "^6.1.11" 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /flake-guard-app/src/client/app.test.tsx: -------------------------------------------------------------------------------- 1 | 2 | /** @jest-environment jsdom */ 3 | //https://testing-library.com/docs/example-react-router/ 4 | import * as React from 'react'; 5 | import { render } from '@testing-library/react'; 6 | import App from './app'; 7 | 8 | describe('App', () => { 9 | it('renders App component', () => { 10 | render(); 11 | 12 | 13 | }); 14 | }); 15 | 16 | //NEED TO MANUALLY SET THE ENVIRONMENT BECAUSE OUR CONFIG ENVIRONMENT IS SET WITH NODE ENVIRONMENT FOR BACKEND TESTING -------------------------------------------------------------------------------- /flake-guard-app/src/client/app.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Landing from './landingPage/LandingPage'; 3 | import DocPage from './docs/DocPage'; 4 | import UserDashboard from './userDash/UserDashboard'; 5 | import TempDashboard from './tempDash/TempDashboard'; 6 | import DecisionPage from './tempDash/DecisionPage'; 7 | import History from './userDash/pages/history/History'; 8 | import FlakyTests from './userDash/pages/flakyTests/FlakyTests' 9 | import ResultsProvider from './userDash/contexts/ResultContext'; 10 | import CodeCoverage from './userDash/pages/codeCoverage/CodeCoverage'; 11 | 12 | import { 13 | BrowserRouter as Router, 14 | Routes, 15 | Route, 16 | Navigate, 17 | } from 'react-router-dom'; 18 | 19 | const App: React.FC = () => { 20 | // Define the style object 21 | 22 | return ( 23 |
24 | {/* Alias of BrowserRouter i.e. Router */} 25 | 26 | 27 | } /> 28 | } /> 29 | } /> 30 | } /> 31 | {/* } /> */} 32 | 36 | 37 | 38 | } 39 | /> 40 | 44 | 45 | 46 | } 47 | /> 48 | 52 | 53 | 54 | } 55 | /> 56 | 58 | 59 | 60 | } /> 61 | {/* } /> */} 62 | {/* Redirect any unmatched routes to home */} 63 | } /> 64 | 65 | 66 |
67 | ); 68 | }; 69 | 70 | export default App; 71 | -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/advantage1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/advantage1.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/advantage2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/advantage2.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/advantage3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/advantage3.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/advantage4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/advantage4.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/arrow.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/ashley.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/ashley.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/brendan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/brendan.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/condensed-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/condensed-logo.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/download.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/flakeguard-logo-white-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/flakeguard-logo-white-background.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/github-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/github-logo.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/github-mark-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/github-mark-white.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/github-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/github-mark.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/graphs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/graphs.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/linkedinlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/linkedinlogo.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/logo.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/logo_with_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/logo_with_background.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/npm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/npm.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/paloma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/paloma.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/signout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/signout.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/tommy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/tommy.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/assets/will.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oslabs-beta/flake-guard-alpha/421e573779f1d5d3fe663263dd9b0f181840b053/flake-guard-app/src/client/assets/will.png -------------------------------------------------------------------------------- /flake-guard-app/src/client/docs/DocPage.tsx: -------------------------------------------------------------------------------- 1 | import Header from '../landingPage/components/NavBar'; 2 | import Footer from '../landingPage/components/Footer'; 3 | import '../styles/styles.css'; 4 | import '../styles/docs.css'; 5 | import FAQ from './FAQ'; 6 | 7 | const DocPage = (): JSX.Element => { 8 | return ( 9 | <> 10 |
11 |
12 |
13 |
19 | 31 | 43 | 55 |
56 |
57 |
63 |

What is FlakeGuard?

64 |

65 | FlakeGuard a free, open-source, tool that allows developers to 66 | run Jest tests to automatically detect, report, and manage flaky 67 | tests in software development. 68 |

69 |

Personalized Features

70 |

71 | Things you can do with your personal Flake Guard dashboard: 72 |

    73 |
  • View analytics including, but not limited to: 74 |
      75 |
    • Passing vs failing tests with the color coordinated flake severity table
    • 76 |
    • Analyze Runtime metrics & API response times
    • 77 |
    • See flags and recommendations to fix flaky tests
    • 78 |
    • View pointers showing fail points within test code
    • 79 |
    • Running test order permutation
    • 80 | {/*
    • Flagged tests using ‘async’ calls
    • */} 81 |
    • 82 | Display flake improvement over time 83 |
    • 84 |
    85 |
  • 86 | 87 |
88 |

89 |
90 |
96 |

Installation

97 |

98 | Terminal Command: 99 | 100 | npm i flake-guard 101 | 102 | Installation as dev dependency:{' '} 103 | 104 | npm i flake-guard --save-dev 105 |
106 | Run Flake Guard:{' '} 107 | npx flake-guard

Or

108 | npx flake-guard {''}
Please change {``} with the appropriate name of the 109 | test file that you want to examine. Flake Guard will analyze your 110 | E2E tests for flakiness by executing multiple test runs and 111 | analyzing the results. 112 |

113 |

Configuration

114 |

115 | The default number of test runs is 10, 116 | but this can be adjusted as described below.
117 | In general, there is a time versus accuracy tradeoff. More test 118 | executions increase accuracy but reduce speed.
119 | To adjust FlakeGuard configuration variables, you can create a 120 | file in the root directory of your project called{' '} 121 | fg.config.json Below are the defaults, which can 122 | be overridden in your local 'fg.config.json' file. 123 |

124 |
125 |
131 | 132 |
133 |
134 |
135 |
136 |