{name}
13 |{age} years
14 |├── .github
├── FUNDING.yml
└── workflows
│ ├── blockchain.app.yml
│ ├── dev-portfolio.yml
│ ├── master_nikolay-react.yml
│ └── web2022.yml
├── .gitpod-ws.code-workspace
├── .gitpod.Dockerfile
├── .gitpod.yml
├── LICENSE.md
├── README.md
├── api-testing-2022
├── .eslintignore
├── .eslintrc
├── LICENSE
├── README.md
├── cypress.config.js
├── cypress
│ ├── e2e
│ │ └── network_requests.cy.js
│ ├── fixtures
│ │ └── example.json
│ └── support
│ │ ├── commands.js
│ │ └── e2e.js
├── docs
│ ├── API.md
│ ├── ATOMIC-TESTS.md
│ ├── CICD.md
│ └── CONCLUSIONS.md
├── graphics
│ ├── bye.gif
│ ├── component-diagram.jpeg
│ ├── me-and-mia.jpg
│ └── secrets.png
├── package-lock.json
└── package.json
├── atomic-testing
├── README.md
└── package.json
├── auth-api-tutorial
├── .gitignore
├── cypress.json
├── cypress
│ ├── fixtures
│ │ └── example.json
│ ├── plugins
│ │ └── index.js
│ └── support
│ │ ├── commands.js
│ │ └── index.js
├── dataValidation.js
├── index.js
├── model
│ └── Users.js
├── package.json
└── routes
│ ├── auth.js
│ ├── posts.js
│ └── verifyToken.js
├── birthday-reminder
├── README.md
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ ├── me-and-mia.jpeg
│ └── robots.txt
├── src
│ ├── App.js
│ ├── List.js
│ ├── data.js
│ ├── index.css
│ └── index.js
├── test
│ └── specs
│ │ └── visual.spec.js
└── wdio.conf.js
├── blockchain-app
├── README.md
├── client
│ ├── .eslintignore
│ ├── .eslintrc
│ ├── .gitignore
│ ├── .happo.js
│ ├── .prettierrc
│ ├── cypress.json
│ ├── cypress
│ │ ├── fixtures
│ │ │ └── example.json
│ │ ├── integration
│ │ │ └── visual
│ │ │ │ └── visual.spec.js
│ │ ├── plugins
│ │ │ └── index.js
│ │ └── support
│ │ │ ├── commands.js
│ │ │ └── index.js
│ ├── images
│ │ ├── animated.svg
│ │ ├── hello.svg
│ │ └── logo.png
│ ├── index.html
│ ├── package.json
│ ├── postcss.config.js
│ ├── src
│ │ ├── App.jsx
│ │ ├── __tests__
│ │ │ └── Welcome.test.js
│ │ ├── components
│ │ │ ├── Footer.jsx
│ │ │ ├── Loader.jsx
│ │ │ ├── Navbar.jsx
│ │ │ ├── Services.jsx
│ │ │ ├── Transactions.jsx
│ │ │ ├── Welcome.jsx
│ │ │ └── index.js
│ │ ├── context
│ │ │ └── TransactionContext.jsx
│ │ ├── favicon.svg
│ │ ├── hooks
│ │ │ └── useFetch.jsx
│ │ ├── index.css
│ │ ├── logo.svg
│ │ ├── main.jsx
│ │ └── utils
│ │ │ ├── Transactions.json
│ │ │ ├── constants.js
│ │ │ ├── dummyData.js
│ │ │ └── shortenAddress.js
│ ├── tailwind.config.js
│ └── vite.config.js
└── smart_contract
│ ├── .gitignore
│ ├── README.md
│ ├── contracts
│ └── Transactions.sol
│ ├── hardhat.config.js
│ ├── package.json
│ ├── scripts
│ └── deploy.js
│ └── test
│ └── sample-test.js
├── cy-10
├── .gitignore
├── cypress.config.js
├── cypress
│ ├── component
│ │ ├── Stepper.cy.jsx
│ │ └── Stepper.jsx
│ ├── fixtures
│ │ └── example.json
│ └── support
│ │ ├── commands.js
│ │ ├── component-index.html
│ │ ├── component.js
│ │ └── e2e.js
├── index.html
├── package-lock.json
├── package.json
├── src
│ ├── App.css
│ ├── App.jsx
│ ├── favicon.svg
│ ├── index.css
│ ├── logo.svg
│ └── main.jsx
└── vite.config.js
├── dev-portfolio
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .happo.js
├── .prettierignore
├── .prettierrc
├── README.md
├── cypress.config.js
├── cypress
│ ├── e2e
│ │ ├── SocialDetails.cy.js
│ │ ├── homepage.cy.js
│ │ └── visual.cy.js
│ ├── fixtures
│ │ └── example.json
│ ├── plugins
│ │ └── index.js
│ └── support
│ │ ├── commands.js
│ │ └── e2e.js
├── jest.config.js
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ ├── images
│ │ ├── birthday-reminder.webp
│ │ ├── comparison-settings.webp
│ │ ├── github-users-search.webp
│ │ ├── portfolio.webp
│ │ ├── sauce-bindings.webp
│ │ ├── tic-tac-toe.webp
│ │ └── ultimateqa.webp
│ └── vercel.svg
└── src
│ ├── components
│ ├── Acomplishments
│ │ ├── Acomplishments.js
│ │ └── AcomplishmentsStyles.js
│ ├── BackgroundAnimation
│ │ └── BackgroundAnimation.js
│ ├── Footer
│ │ ├── Footer.js
│ │ └── FooterStyles.js
│ ├── Header
│ │ ├── Header.js
│ │ ├── HeaderStyles.js
│ │ └── SocialDetails.js
│ ├── Hero
│ │ ├── Hero.js
│ │ └── HeroStyles.js
│ ├── NavDropDown
│ │ ├── NavDropDown.js
│ │ └── index.js
│ ├── Projects
│ │ ├── Projects.js
│ │ └── ProjectsStyles.js
│ ├── Technologies
│ │ ├── Technologies.js
│ │ └── TechnologiesStyles.js
│ └── TimeLine
│ │ ├── TimeLine.js
│ │ └── TimeLineStyles.js
│ ├── constants
│ ├── constants.js
│ ├── projects.js
│ ├── projects.test.js
│ ├── socialUrls.js
│ └── timelineData.js
│ ├── layout
│ ├── Layout.js
│ └── LayoutStyles.js
│ ├── pages
│ ├── _app.js
│ ├── _document.js
│ ├── api
│ │ └── hello.js
│ └── index.js
│ ├── styles
│ ├── GlobalComponents
│ │ ├── Button.js
│ │ └── index.js
│ ├── globals.js
│ └── theme.js
│ └── themes
│ └── default.js
├── github-user-search
├── .vscode
│ └── settings.json
├── README.md
├── end
│ ├── cypress.json
│ ├── cypress
│ │ ├── fixtures
│ │ │ └── example.json
│ │ ├── integration
│ │ │ ├── Search.spec.js
│ │ │ └── error.spec.js
│ │ ├── plugins
│ │ │ └── index.js
│ │ └── support
│ │ │ ├── commands.js
│ │ │ └── index.js
│ ├── package.json
│ ├── public
│ │ ├── _redirects
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── logo192.png
│ │ ├── logo512.png
│ │ ├── manifest.json
│ │ └── robots.txt
│ ├── src
│ │ ├── App.js
│ │ ├── App.test.js
│ │ ├── components
│ │ │ ├── Card.js
│ │ │ ├── Followers.js
│ │ │ ├── Info.js
│ │ │ ├── Navbar.js
│ │ │ ├── Repos.js
│ │ │ ├── Search.js
│ │ │ ├── User.js
│ │ │ └── index.js
│ │ ├── context
│ │ │ ├── context.js
│ │ │ └── mockData.js
│ │ │ │ ├── mockFollowers.js
│ │ │ │ ├── mockRepos.js
│ │ │ │ └── mockUser.js
│ │ ├── images
│ │ │ ├── login-img.svg
│ │ │ └── preloader.gif
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── pages
│ │ │ ├── AuthWrapper.js
│ │ │ ├── Dashboard.js
│ │ │ ├── Error.js
│ │ │ ├── Login.js
│ │ │ ├── PrivateRoute.js
│ │ │ └── index.js
│ │ ├── serviceWorker.js
│ │ └── setupTests.js
│ ├── test
│ │ └── specs
│ │ │ └── visual.spec.js
│ ├── wdio.conf.js
│ └── wdio.functional.conf.js
└── start
│ ├── package.json
│ ├── public
│ ├── _redirects
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
│ ├── src
│ ├── App.js
│ ├── App.test.js
│ ├── components
│ │ ├── Card.js
│ │ ├── Followers.js
│ │ ├── Info.js
│ │ ├── Navbar.js
│ │ ├── Repos.js
│ │ ├── Search.js
│ │ ├── User.js
│ │ └── index.js
│ ├── context
│ │ ├── context.js
│ │ └── mockData.js
│ │ │ ├── mockFollowers.js
│ │ │ ├── mockRepos.js
│ │ │ └── mockUser.js
│ ├── images
│ │ ├── login-img.svg
│ │ └── preloader.gif
│ ├── index.css
│ ├── index.js
│ ├── pages
│ │ ├── AuthWrapper.js
│ │ ├── Dashboard.js
│ │ ├── Error.js
│ │ ├── Login.js
│ │ ├── PrivateRoute.js
│ │ └── index.js
│ ├── serviceWorker.js
│ └── setupTests.js
│ ├── test
│ └── specs
│ │ ├── functional.spec.js
│ │ └── visual.spec.js
│ ├── wdio.conf.js
│ └── wdio.functional.conf.js
├── react-tutorial
└── react-hooks
│ └── hooks-11-http-reducer
│ └── .gitignore
├── storybook
├── README.md
└── solution
│ └── taskbox
│ ├── .gitignore
│ ├── .storybook
│ ├── main.js
│ └── preview.js
│ ├── LICENSE
│ ├── README.md
│ ├── package.json
│ ├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
│ ├── screener.config.js
│ ├── src
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── assets
│ │ ├── font
│ │ │ ├── OpenSans-Light-webfont.eot
│ │ │ ├── OpenSans-Light-webfont.svg
│ │ │ ├── OpenSans-Light-webfont.ttf
│ │ │ ├── OpenSans-Light-webfont.woff
│ │ │ ├── OpenSans-Regular-webfont.eot
│ │ │ ├── OpenSans-Regular-webfont.svg
│ │ │ ├── OpenSans-Regular-webfont.ttf
│ │ │ └── OpenSans-Regular-webfont.woff
│ │ └── icon
│ │ │ ├── percolate.eot
│ │ │ ├── percolate.svg
│ │ │ ├── percolate.ttf
│ │ │ ├── percolate.woff
│ │ │ ├── todos.eot
│ │ │ ├── todos.svg
│ │ │ ├── todos.ttf
│ │ │ └── todos.woff
│ ├── components
│ │ ├── Task.js
│ │ ├── Task.stories.js
│ │ ├── TaskList.js
│ │ └── TaskList.stories.js
│ ├── index.css
│ ├── index.js
│ ├── logo.svg
│ ├── reportWebVitals.js
│ ├── setupTests.js
│ └── stories
│ │ ├── Button.js
│ │ ├── Button.stories.js
│ │ ├── Header.js
│ │ ├── Header.stories.js
│ │ ├── Introduction.stories.mdx
│ │ ├── Page.js
│ │ ├── Page.stories.js
│ │ ├── assets
│ │ ├── code-brackets.svg
│ │ ├── colors.svg
│ │ ├── comments.svg
│ │ ├── direction.svg
│ │ ├── flow.svg
│ │ ├── plugin.svg
│ │ ├── repo.svg
│ │ └── stackalt.svg
│ │ ├── button.css
│ │ ├── header.css
│ │ └── page.css
│ └── yarn.lock
├── test-optimization
├── .gitignore
├── package-lock.json
├── package.json
├── playwright.config.ts
├── tests-examples
│ └── demo-todo-app.spec.ts
└── tests
│ └── example.spec.ts
├── testing-js
├── cypress
│ └── my-app
│ │ ├── .gitignore
│ │ ├── README.md
│ │ ├── cypress
│ │ └── integration
│ │ │ └── e2e
│ │ │ └── cypress.demo.spec.js
│ │ ├── package.json
│ │ ├── public
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── logo192.png
│ │ ├── logo512.png
│ │ ├── manifest.json
│ │ └── robots.txt
│ │ └── src
│ │ ├── App.css
│ │ ├── App.js
│ │ ├── App.test.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── logo.svg
│ │ ├── mia-dev.jpg
│ │ ├── serviceWorker.js
│ │ └── setupTests.js
├── frontend-performance
│ ├── LICENSE.md
│ ├── README.md
│ └── package.json
├── jest-testing
│ ├── __tests__
│ │ ├── math.spec.js
│ │ ├── mocking.spec.js
│ │ └── super-heros.spec.js
│ ├── classes
│ │ ├── math.js
│ │ ├── super-heros.js
│ │ └── users.js
│ ├── package-lock.json
│ └── package.json
├── linting
│ ├── .eslintrc.js
│ ├── package-lock.json
│ ├── package.json
│ └── src
│ │ └── bad-code.js
└── react-components
│ └── test-app
│ ├── .gitignore
│ ├── README.md
│ ├── package.json
│ ├── public
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
│ ├── src
│ ├── App.css
│ ├── App.js
│ ├── Button.test.js
│ ├── Checkbox.test.js
│ ├── __tests__
│ │ ├── hello.test.js
│ │ ├── react-dom.js
│ │ └── toggle.tests.js
│ ├── components
│ │ ├── class-component
│ │ │ └── Button.js
│ │ └── function-component
│ │ │ ├── Button.js
│ │ │ ├── Hello.js
│ │ │ ├── Toggle.js
│ │ │ └── favorite-number.js
│ ├── index.css
│ ├── index.js
│ ├── reportWebVitals.js
│ └── setupTests.js
│ └── yarn.lock
└── web-testing-2022
├── .eslintignore
├── .eslintrc
├── LICENSE
├── README.md
├── cypress.config.js
├── cypress
├── e2e
│ ├── exercise.cy.js
│ ├── sanity.cy.js
│ └── solution.cy.js
├── fixtures
│ └── example.json
└── support
│ ├── commands.js
│ ├── e2e.js
│ └── e2eConstants.js
├── docs
├── ATOMIC-TESTS.md
├── CICD.md
├── COMPONENT-TESTS.md
├── CONCLUSIONS.md
├── E2E-TESTS.md
├── PERF.md
├── TEST-COVERAGE.md
├── VISUAL.md
└── visual-testing.pdf
├── graphics
├── bye.gif
├── component-diagram.jpeg
├── me-and-mia.jpg
└── secrets.png
├── package-lock.json
├── package.json
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
└── src
├── App.css
├── App.js
├── App.test.js
├── index.css
├── index.js
├── logo.svg
├── reportWebVitals.js
└── setupTests.js
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: nadvolod
2 |
--------------------------------------------------------------------------------
/.github/workflows/blockchain.app.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://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
3 |
4 | name: Blockchain App CI
5 |
6 | on:
7 | push:
8 | branches: [ main ]
9 | pull_request:
10 | branches: [ main ]
11 |
12 | jobs:
13 | build:
14 |
15 | runs-on: ubuntu-latest
16 | strategy:
17 | matrix:
18 | node-version: [14.x, 16.x]
19 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
20 |
21 | defaults:
22 | run:
23 | working-directory: ./blockchain-app/client/
24 | steps:
25 | - uses: actions/checkout@v2
26 | - name: Use Node.js ${{ matrix.node-version }}
27 | uses: actions/setup-node@v2
28 | with:
29 | node-version: ${{ matrix.node-version }}
30 | cache: 'npm'
31 | cache-dependency-path: blockchain-app/client/package-lock.json
32 | - name: Install dependencies 📦
33 | #Using npm ci is generally faster than running npm install
34 | run: |
35 | npm ci
36 | - name: Build the app for prod 🏗
37 | run: |
38 | npm run build
39 | - name: Start the app 📤
40 | #Vite has a different command for deploy than vanilla react
41 | run: |
42 | npm run preview &
43 | npx wait-on --timeout 60000
44 | - name: Run visual tests 👁
45 | run: |
46 | npm run cy:visual
47 |
--------------------------------------------------------------------------------
/.github/workflows/master_nikolay-react.yml:
--------------------------------------------------------------------------------
1 | # Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
2 | # More GitHub Actions for Azure: https://github.com/Azure/actions
3 |
4 | name: Build and deploy Node.js app to Azure Web App - nikolay-react
5 |
6 | on:
7 | push:
8 | branches:
9 | - none
10 |
11 | jobs:
12 | build-and-deploy:
13 | runs-on: windows-latest
14 |
15 | steps:
16 | - uses: actions/checkout@master
17 |
18 | - name: Set up Node.js version
19 | uses: actions/setup-node@v1
20 | with:
21 | node-version: '12.13.0'
22 |
23 | - name: npm install, build, and test
24 | run: |
25 | npm install
26 | npm run build --if-present
27 | npm run test --if-present
28 |
29 | - name: 'Deploy to Azure Web App'
30 | uses: azure/webapps-deploy@v2
31 | with:
32 | app-name: 'nikolay-react'
33 | slot-name: 'production'
34 | publish-profile: ${{ secrets.AzureAppService_PublishProfile_beb0a9f8c66246119ef00e3abd37b968 }}
35 | package: .
36 |
--------------------------------------------------------------------------------
/.gitpod-ws.code-workspace:
--------------------------------------------------------------------------------
1 | {
2 | "folder": [
3 | { "path": "web-testing-2022" }
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/.gitpod.Dockerfile:
--------------------------------------------------------------------------------
1 | FROM gitpod/workspace-full-vnc:latest
2 |
3 | ENV CYPRESS_CACHE_FOLDER=/workspace/.cypress-cache
4 |
5 | # Install Cypress dependencies.
6 | RUN sudo apt-get update \
7 | && sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
8 | libgtk2.0-0 \
9 | libgtk-3-0 \
10 | libnotify-dev \
11 | libgconf-2-4 \
12 | libnss3 \
13 | libxss1 \
14 | libasound2 \
15 | libxtst6 \
16 | xauth \
17 | xvfb \
18 | && sudo rm -rf /var/lib/apt/lists/*
19 |
20 | # Install Firefox
21 |
22 | RUN sudo apt-get update -q \
23 | && sudo apt-get install -yq \
24 | firefox \
25 | && sudo rm -rf /var/lib/apt/lists/*
26 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | image:
2 | file: .gitpod.Dockerfile
3 | workspaceLocation: gitpod/gitpod-ws.code-workspace
4 |
5 | ports:
6 | - port: 3000
7 | onOpen: open-preview
8 | visibility: public
9 | name: Website
10 | description: Preview of Website
11 | - port: 5900
12 | onOpen: ignore
13 | name: VNC
14 | description: VNC Server
15 | - port: 6080
16 | onOpen: open-preview
17 | visibility: public
18 | name: VNC
19 | description: VNC Viewer
20 |
21 | # List the start up tasks. You can start them in parallel in multiple terminals. See https://www.gitpod.io/docs/configure/workspaces/tasks/
22 | tasks:
23 | - init: npm install
24 | command: npm run start
25 | name: Start
26 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2020 Nikolay Advolodkin www.ultimateqa.com
2 |
3 | Permission to use, copy, modify, and distribute this software for any
4 | purpose with or without fee is hereby granted, provided that the above
5 | copyright notice and this permission notice appear in all copies.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # So much JS Code!
2 |
3 | [](https://app.netlify.com/sites/boring-goldwasser-4ff12b/deploys)
4 |
5 | Tons of JavaScript concepts in a single repo!
6 |
7 | **🥗 Like my content? [Buy me a salad](https://www.buymeacoffee.com/nikolaya)**
8 |
9 | **📬[Get notified of latest projects and JS testing tips](https://ultimateqa.ck.page/js-testing-tips)**
10 |
11 | ## TOC
12 |
13 | - [API Testing w/ Cypress](https://github.com/nadvolod/cypress-api-testing-22) `cypress10`
14 | - [Birthday reminder web app, ReactJS, Screener, WebdriverIO, Sauce Labs](./birthday-reminder)
15 | - [Personal dev portfolio](./dev-portfolio) `nextjs` `netlify`
16 | - [Test React components using component tests](./testing-js/react-components/test-app/)
17 | - [Github User Search React App](./github-user-search/)
18 | - [Modern Web 3.0 Blockchain APp]()
19 | - [Web testing in 2023](./web-testing-2022) `cypress10` `happoio` `cicd`
20 |
21 | ### Concepts
22 |
23 | - [WebdriverIO w/ Screener.io on localhost](./birthday-reminder/wdio.conf.js)
24 | - [Sauce connect Proxy] be sure to run with a higher [ulimit](https://support.saucelabs.com/hc/en-us/articles/115005571668)
25 |
--------------------------------------------------------------------------------
/api-testing-2022/.eslintignore:
--------------------------------------------------------------------------------
1 | .tmp/
2 | node_modules/
3 |
--------------------------------------------------------------------------------
/api-testing-2022/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 saucelabs-training
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/api-testing-2022/README.md:
--------------------------------------------------------------------------------
1 | # api testing with javascript workshop
2 |
3 | [#testing4good](https://twitter.com/hashtag/Testing4Good)
4 |
5 | In this workshop you will learn how to do automated API testing with Cypress 10.
6 |
7 | ## [Moved to this repo](https://github.com/nadvolod/cypress-api-testing-22)
8 |
--------------------------------------------------------------------------------
/api-testing-2022/cypress.config.js:
--------------------------------------------------------------------------------
1 | const { defineConfig } = require("cypress");
2 |
3 | module.exports = defineConfig({
4 | e2e: {
5 | setupNodeEvents(on, config) {
6 | // implement node event listeners here
7 | },
8 | },
9 | });
10 |
--------------------------------------------------------------------------------
/api-testing-2022/cypress/fixtures/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Using fixtures to represent data",
3 | "email": "hello@cypress.io",
4 | "body": "Fixtures are a great way to mock data for responses to routes"
5 | }
6 |
--------------------------------------------------------------------------------
/api-testing-2022/cypress/support/commands.js:
--------------------------------------------------------------------------------
1 | // ***********************************************
2 | // This example commands.js shows you how to
3 | // create various custom commands and overwrite
4 | // existing commands.
5 | //
6 | // For more comprehensive examples of custom
7 | // commands please read more here:
8 | // https://on.cypress.io/custom-commands
9 | // ***********************************************
10 | //
11 | //
12 | // -- This is a parent command --
13 | // Cypress.Commands.add('login', (email, password) => { ... })
14 | //
15 | //
16 | // -- This is a child command --
17 | // Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
18 | //
19 | //
20 | // -- This is a dual command --
21 | // Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
22 | //
23 | //
24 | // -- This will overwrite an existing command --
25 | // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
--------------------------------------------------------------------------------
/api-testing-2022/cypress/support/e2e.js:
--------------------------------------------------------------------------------
1 | // ***********************************************************
2 | // This example support/e2e.js is processed and
3 | // loaded automatically before your test files.
4 | //
5 | // This is a great place to put global configuration and
6 | // behavior that modifies Cypress.
7 | //
8 | // You can change the location of this file or turn off
9 | // automatically serving support files with the
10 | // 'supportFile' configuration option.
11 | //
12 | // You can read more here:
13 | // https://on.cypress.io/configuration
14 | // ***********************************************************
15 |
16 | // Import commands.js using ES2015 syntax:
17 | import './commands'
18 |
19 | // Alternatively you can use CommonJS syntax:
20 | // require('./commands')
--------------------------------------------------------------------------------
/api-testing-2022/docs/CICD.md:
--------------------------------------------------------------------------------
1 | # CICD
2 |
3 | ## 🏋️♀️Let's add this code to our CI system.
4 |
5 | 1. In the repository's Github, go to `Actions` tab
6 | 2. Configure `Node.js`
7 | 3. Keep the name of the file and on line 4, or change, up to you
8 | 4. Copy + Paste the code from [comprehensive.yml](../.github/workflows/comprehensive.yml)
9 |
10 | 5. Add New repository secrets for the repo
11 |
12 | 6. Commit the new file
13 | 7. `git push` all of your changes to your repo
14 |
15 | ## 🧪Current Test Coverage
16 |
17 | [Look here](TEST-COVERAGE.md)
18 |
19 | ## 📝Summary
20 |
21 | ✅ We can use Github Workflows for free and easy continuous integration pipelines
22 |
23 | ## ⏭️[Conclusions](./CONCLUSIONS.md)
24 |
--------------------------------------------------------------------------------
/api-testing-2022/docs/CONCLUSIONS.md:
--------------------------------------------------------------------------------
1 | # conclusions
2 |
3 | {name} {age} years
4 |
5 | ## Thanks so much for your time and generosity 🙌👏
6 |
7 |
8 |
9 | 1. We raised...
10 | 2. Please leave some quick and anonymous [feedback on this workshop](https://docs.google.com/forms/d/e/1FAIpQLSes4ft4_0JGFQnMB5Tj2L6J3-IWLX2jqyRIc7ejrDlLiCfIyg/viewform?usp=sf_link)
11 | 3. 📫 Follow me as I will do many more Testing for Good events
12 |
13 | - [JS Testing Newsletter](https://ultimateqa.ck.page/js-testing-tips)
14 | - [Youtube](https://youtube.com/ultimateqa)
15 | - [LinkedIn](https://www.linkedin.com/in/nikolayadvolodkin/)
16 | - [Twitter](https://twitter.com/Nikolay_A00)
17 |
18 | 4. Give this repo a ⭐
19 |
20 | ## 💃Let's pick a winner for a backpack!
21 |
22 | ---
23 |
24 | ## Bonus resources
25 |
26 | - [How to code and test an authentication API tutorial](https://youtu.be/klIAT82UtVs)
27 | - [Build and test a Github users search app tutorial](https://youtu.be/EvZ6pjgYA38)
28 | - [What is REST blog post](https://restfulapi.net/)
29 | - [API testing in JavaScript tutorial](https://testautomationu.applitools.com/javascript-api-testing/)
30 |
--------------------------------------------------------------------------------
/api-testing-2022/graphics/bye.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/api-testing-2022/graphics/bye.gif
--------------------------------------------------------------------------------
/api-testing-2022/graphics/component-diagram.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/api-testing-2022/graphics/component-diagram.jpeg
--------------------------------------------------------------------------------
/api-testing-2022/graphics/me-and-mia.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/api-testing-2022/graphics/me-and-mia.jpg
--------------------------------------------------------------------------------
/api-testing-2022/graphics/secrets.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/api-testing-2022/graphics/secrets.png
--------------------------------------------------------------------------------
/api-testing-2022/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api-testing-2022",
3 | "version": "1.0.0",
4 | "description": "[#testing4good](https://twitter.com/hashtag/Testing4Good)",
5 | "main": "index.js",
6 | "directories": {
7 | "doc": "docs"
8 | },
9 | "scripts": {
10 | "test": "echo \"Error: no test specified\" && exit 1"
11 | },
12 | "keywords": [],
13 | "author": "",
14 | "license": "ISC",
15 | "devDependencies": {
16 | "cypress": "^10.4.0"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/atomic-testing/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "atomic-testing",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC"
12 | }
13 |
--------------------------------------------------------------------------------
/auth-api-tutorial/.gitignore:
--------------------------------------------------------------------------------
1 | *.env
2 | /cypress/screenshots/
3 | ../authentication-api/*
4 | ../cypress/*
--------------------------------------------------------------------------------
/auth-api-tutorial/cypress.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/auth-api-tutorial/cypress/fixtures/example.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Using fixtures to represent data",
3 | "email": "hello@cypress.io",
4 | "body": "Fixtures are a great way to mock data for responses to routes"
5 | }
--------------------------------------------------------------------------------
/auth-api-tutorial/cypress/plugins/index.js:
--------------------------------------------------------------------------------
1 | ///
17 |
18 | - 🔭 I’m the founder of [Ultimate QA](https://ultimateqa.com/) a Sr Solutions Architect at [Sauce Labs](https://saucelabs.com/)
19 | - 👨💻 I’m currently working on [Sauce Bindings](https://github.com/saucelabs/sauce_bindings)
20 | - 💬 Ask me about environmentalism, veganism, test automation, and fitness
21 | - 😄 Pronouns: he/him
22 | - ⚡ Fun fact: I'm a vegan that's super pasionate about saving the planet, saving animals, and helping underpriveleged communities
23 | - 📫 Follow me for testing and dev training
24 | - [JS Testing Newsletter](https://ultimateqa.ck.page/js-testing-tips) to learn testing like a pro
25 | - [Youtube](https://youtube.com/ultimateqa) for 🔥 training tutorials
26 | - [LinkedIn](https://www.linkedin.com/in/nikolayadvolodkin/) for 👍 conversations
27 | - [Twitter](https://twitter.com/Nikolay_A00) for awesome quotes from 🧠 people
28 |
29 | ## Idea
30 |
31 | [https://uidesigndaily.com/](https://uidesigndaily.com/posts/sketch-birthdays-list-card-widget-day-1042)
32 |
--------------------------------------------------------------------------------
/birthday-reminder/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "reminder",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.16.1",
7 | "@testing-library/react": "^12.1.2",
8 | "@testing-library/user-event": "^13.5.0",
9 | "react": "^17.0.2",
10 | "react-dom": "^17.0.2",
11 | "react-scripts": "^5.0.0"
12 | },
13 | "scripts": {
14 | "start": "react-scripts start",
15 | "build": "CI= react-scripts build",
16 | "test": "react-scripts test",
17 | "eject": "react-scripts eject",
18 | "wdio": "wdio run wdio.conf.js"
19 | },
20 | "eslintConfig": {
21 | "extends": "react-app"
22 | },
23 | "browserslist": {
24 | "production": [
25 | ">0.2%",
26 | "not dead",
27 | "not op_mini all"
28 | ],
29 | "development": [
30 | "last 1 chrome version",
31 | "last 1 firefox version",
32 | "last 1 safari version"
33 | ]
34 | },
35 | "devDependencies": {
36 | "@wdio/cli": "^7.16.13",
37 | "@wdio/local-runner": "^7.16.13",
38 | "@wdio/mocha-framework": "^7.16.13",
39 | "@wdio/sauce-service": "^7.16.13",
40 | "@wdio/spec-reporter": "^7.16.13",
41 | "chromedriver": "^97.0.0",
42 | "wdio-chromedriver-service": "^7.2.6",
43 | "wdio-slack-service": "^2.0.9"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/birthday-reminder/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/birthday-reminder/public/favicon.ico
--------------------------------------------------------------------------------
/birthday-reminder/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/birthday-reminder/public/logo192.png
--------------------------------------------------------------------------------
/birthday-reminder/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/birthday-reminder/public/logo512.png
--------------------------------------------------------------------------------
/birthday-reminder/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/birthday-reminder/public/me-and-mia.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nadvolod/js-code/1a528d6701aacee4d6098a05b81d5555c22eba79/birthday-reminder/public/me-and-mia.jpeg
--------------------------------------------------------------------------------
/birthday-reminder/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/birthday-reminder/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import data from './data';
3 | import List from './List';
4 | function App() {
5 | const [people, setPeople] = useState(data);
6 |
7 | return (
8 |
{people.length} birthdays
11 |
12 |
15 |
11 |