diff --git a/Appium_CrossPlatform/Login/dummy.txt b/Appium_CrossPlatform/Login/dummy.txt deleted file mode 100644 index d57d09f..0000000 --- a/Appium_CrossPlatform/Login/dummy.txt +++ /dev/null @@ -1 +0,0 @@ -as \ No newline at end of file diff --git a/Appium_CrossPlatform/SignUp/dummy.txt b/Appium_CrossPlatform/SignUp/dummy.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Cypress_FE_BE/Login/dummy.txt b/Cypress_FE_BE/Login/dummy.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Cypress_FE_BE/SignUp/dummy.txt b/Cypress_FE_BE/SignUp/dummy.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c1081c5 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM cypress/base:latest + +WORKDIR /home/node/app + +COPY cypress.config.js package.json package-lock.json ./ + +COPY cypress ./cypress + +ENV CI=1 + +RUN npm i + +RUN npx cypress verify \ No newline at end of file diff --git a/JMeter_StressTesting/dummy.txt b/JMeter_StressTesting/dummy.txt deleted file mode 100644 index e69de29..0000000 diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..dfd6729 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,42 @@ +pipeline { + agent any + triggers { + githubPush() + } + + environment { + DOCKERHUB_CREDENTIALS=credentials('Dockerhub') + } + + stages{ + + stage('Login') { + + steps { + sh 'echo $DOCKERHUB_CREDENTIALS_PSW | docker login -u $DOCKERHUB_CREDENTIALS_USR --password-stdin' + } + } + + stage('Build') { + + steps { + echo "hello" + sh 'docker build -t waer/web_testing:latest .' + } + } + + stage('Push') { + steps { + sh 'docker push waer/web_testing:latest' + } + } + +} + + post { + always { + sh 'docker logout' + } + } + +} \ No newline at end of file diff --git a/README.md b/README.md index 870ae5c..324fd84 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# SW-Testing -repositry hold all testing file for Reddit-El8alaba Project +# Deployment-Testing +This branch for deployment only. diff --git a/Screenshot from 2022-11-09 04-38-48.png b/Screenshot from 2022-11-09 04-38-48.png new file mode 100644 index 0000000..01fa69d Binary files /dev/null and b/Screenshot from 2022-11-09 04-38-48.png differ diff --git a/Screenshot from 2022-11-09 04-38-58.png b/Screenshot from 2022-11-09 04-38-58.png new file mode 100644 index 0000000..27e4179 Binary files /dev/null and b/Screenshot from 2022-11-09 04-38-58.png differ diff --git a/cypress.config.js b/cypress.config.js new file mode 100644 index 0000000..91fa394 --- /dev/null +++ b/cypress.config.js @@ -0,0 +1,18 @@ +const { defineConfig } = require("cypress"); + +module.exports = defineConfig({ + screenshotOnRunFailure: false, + video: false, + watchForFileChanges:false, + numTestsKeptInMemory:2, + projectId: 'hp3ona', + "env":{ + // CYPRESSBASEURL:"http://frontend_test" + CYPRESSBASEURL:"http://www.read-it.live" + }, + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}); \ No newline at end of file diff --git a/cypress/CodeStyle/ForgetUserNameActions.cy.js b/cypress/CodeStyle/ForgetUserNameActions.cy.js new file mode 100644 index 0000000..a6c1ef6 --- /dev/null +++ b/cypress/CodeStyle/ForgetUserNameActions.cy.js @@ -0,0 +1,453 @@ +/// +import ForgetUserNameObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy" + +describe('Reset UserName Page Tests', function () { + + //Test Case 1 + //NOTE: CHECK THE EFFECT OF IT + it('Forget UserName', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.ClickOnEmailButton() + + }) + + //Test Case 2 + it('Forget UserName - then click login - go back to show the email is still written ', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.CLickOnLoginButton() + forgetUserName.UrlEqualChecker('http://localhost/login') + forgetUserName.GoBack() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com') + + }) + + + //Test Case 3 + it('Forget UserName - then click sign up - go back to show the email is still written', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.ClickOnSignUpButton() + forgetUserName.UrlEqualChecker('http://localhost:8085/signup') + forgetUserName.GoBack() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com') + + }) + + //Test Case 4 + //TODO : REVIEW IT + it('Forget username then click on help', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.UrlNotEqualChecker('http://localhost/forgetUsernamepage') + }) + + //Test Case 5 + //email is : 1231565456@gmail.com which is invalid one + it('Write Invalid Email - should appear error message', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('1231565456@gmail.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 6 + //email is : 1231565456a@gmail.com which is Valid one + it('Write Valid Email - should not appear error message', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('1231565456a@gmail.com') + forgetUserName.NotInValidMessage() + + }) + + //Test Case 7 + //email is : as1231565456a which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('as1231565456a') + forgetUserName.InvalidMessage() + + }) + + //----------------------------------------Valid Test Cases----------------------------------------// + + //Test Case 8 + it('The email contains a dot with a subdomain', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@subdomain.domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 9 + it('Plus sign is considered a valid character', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('firstname+lastname@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 10 + it('The domain is a valid IP address', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@123.123.123.123') + forgetUserName.InvalidMessage() + + }) + + //Test Case 11 + it('A square bracket around IP address is considered valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@[123.123.123.123]') + forgetUserName.InvalidMessage() + + }) + + //Test Case 12 + it('Quotes around email are considered valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('“email”@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 13 + it('Digits with at least one char in the address are valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('1234567890a@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 14 + it('Dash in the domain name is valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain-one.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 15 + it('Underscore in the address field is valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('_______@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 16 + it('.name is a valid Top Level Domain name', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.name') + forgetUserName.InvalidMessage() + + }) + + //Test Case 17 + it('Dot in Top Level Domain name also considered valid (use co.jp as an example here)', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.co.jp') + forgetUserName.InvalidMessage() + + }) + + //Test Case 18 + it('Dash in the address field is valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('firstname-lastname@domain.com') + forgetUserName.InvalidMessage() + + }) + + //----------------------------------------InValid Test Cases----------------------------------------// + + //Test Case 19 + it('Garbage', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('#@%^%#$@#$@#.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 20 + it('Missing username', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 21 + it('Encoded HTML within an email is invalid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('Joe Smith ') + forgetUserName.InvalidMessage() + + }) + + //Test Case 22 + it('Missing @', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email.domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 23 + it('Two @ sign', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 24 + it('Leading dot in address is not allowed', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('.email@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 25 + it('Trailing dot in address is not allowed', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email.@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 26 + it('Multiple dots', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email..email@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 27 + it('Unicode char as address', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('あいうえお@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 28 + it('Text followed email is not allowed', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.com (Joe Smith)') + forgetUserName.InvalidMessage() + + }) + + //Test Case 29 + it('Missing top-level domain (.com/.net/.org/etc)', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain') + forgetUserName.InvalidMessage() + + }) + + //Test Case 30 + it('The leading dash in front of the domain is invalid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@-domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 31 + it('.web is not a valid top-level domain', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.web') + forgetUserName.InvalidMessage() + + }) + + //Test Case 32 + it('Invalid IP format', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@111.222.333.44444') + forgetUserName.InvalidMessage() + + }) + + //Test Case 33 + it('Multiple dots in the domain portion is invalid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain..com') + forgetUserName.InvalidMessage() + + }) + + +}) \ No newline at end of file diff --git a/cypress/CodeStyle/ForgetUserNameObjects.cy.js b/cypress/CodeStyle/ForgetUserNameObjects.cy.js new file mode 100644 index 0000000..30d33e3 --- /dev/null +++ b/cypress/CodeStyle/ForgetUserNameObjects.cy.js @@ -0,0 +1,104 @@ + +class ForgetUserNameObjects { + navigate() { + cy.visit('http://localhost/login') + } + + //----------------------------------------Test #1----------------------------------------// + + ForgetUserNameHyperLink(){ + //click on the hyperlink of username + cy.get('#app > div > div > div.sec-largest-div > form > div.forgot-usr-pass > a:nth-child(2)') + .should('be.visible') + .click() + return this + } + + /* + ReCAPTCHA(){ + cy.get('iframe') + .first() + .then((recaptchaIframe) => { + const body = recaptchaIframe.contents() + cy.get('[id=recaptcha-anchor]') + .click() + }) + + } + */ + + UrlEqualChecker(url){ + cy.url() + .should('eq', url) + } + + UrlNotEqualChecker(url){ + cy.url() + .should('not.eq' , url ) + + } + + + EnterEmail(username) { + cy.get('[id=emailAddress]') + .should('be.visible') + .clear() + .type(username) + return this + } + + ClickOnEmailButton(){ + cy.get('[id=emailme]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + CLickOnLoginButton(){ + cy.get('[id=login]') + .should('be.visible') + .click() + } + + GoBack(){ + cy.go('back') + } + + ContainsChecker(checkingContent){ + cy.get('[id=emailAddress]') + .should('be.visible') + .contains() + } + + //----------------------------------------Test #3----------------------------------------// + ClickOnSignUpButton(){ + cy.get('[id=signup]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #4----------------------------------------// + ClickOnHelpButton(){ + cy.get('[id=help]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #5----------------------------------------// + InvalidMessage(){ + cy.get('[class=invalid]') + .should('be.visible') + .contains('Please enter an email address to continue') + } + + //----------------------------------------Test #6----------------------------------------// + NotInValidMessage(){ + cy.get('[class=invalid]') + .should('be.visible') + .should('not.eq' , 'Please enter an email address to continue') + } + + + +} +export default ForgetUserNameObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/CreateCommunity/CreateCommunity.cy.js b/cypress/e2e/SWE_PROJECT/CreateCommunity/CreateCommunity.cy.js new file mode 100644 index 0000000..951b4dd --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/CreateCommunity/CreateCommunity.cy.js @@ -0,0 +1,207 @@ +////////////////////later: Community category, Community type,Adult content + + +import CreateCommObjects from '../PageObjects/CreateCommunityObjects/CreateCommObjects' +describe('Test Create Community form', () => { + + //test visiting the sign_up page + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const creatCommObj = new CreateCommObjects() + creatCommObj.Navigate() + creatCommObj.HomeCreateComm() + }) + +//------------------------------------------------------- first form --------------------------------------------------------/// + it('test damy', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('samasemo') + // creatCommObj.CancelCreateComByX() + // creatCommObj.CommFormNotExist() + }) + + it('Clicking on "Create Community" button with empty Community name', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CreateCommunitySub() + creatCommObj.NoCommNameErrMsg('A community name is required') + //?: creatCommObj.ErrFormVisible() + }) + +//?:Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores. +//?OR : Community names must be between 3–21 characters, and can only contain letters,.. ? + //?:- + it('Clicking on "Create Community" button with very short Community name', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('ab') + creatCommObj.CreateCommunitySub() + creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') + }) + + //pass + //later + it('Clicking on "Create Community" button with community name with numbers only', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('hihii8908') + creatCommObj.CommCategory('TV') + creatCommObj.CreateCommunitySub() + }) + + //pass -m.s- + //later + it('Clicking on "Create Community" button with community name start with numbers only', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('8908party') + creatCommObj.CommCategory('TV') + creatCommObj.CreateCommunitySub() + }) + + it('Clicking on "Create Community" button with community name with numbers and space', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('hibjhii 8908') + creatCommObj.CreateCommunitySub() + creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') + }) + + it('Clicking on "Create Community" button with community name with numbers and space', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('hibjhii 8908') + creatCommObj.CreateCommunitySub() + creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') + }) + + //not pass + it('Clicking on "Create Community" button with community name with special character only', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('hibjhii##') + creatCommObj.CreateCommunitySub() + creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') + }) + + //repeated?:- + it('Clicking on "Create Community" button with community name with special character and space', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('hibjhii ##') + creatCommObj.CreateCommunitySub() + creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') + }) + +// //later: responce? +// it('Clicking on "Create Community" button with lowercase community name', () => { +// const creatCommObj = new CreateCommObjects() +// // creatCommObj.CommName('lowlow') + +// }) + +//later: responce? +// it('Clicking on "Create Community" button with upercase community name', () => { +// const creatCommObj = new CreateCommObjects() +// // creatCommObj.CommName('HIGHHIGH') + +// }) + + //useless?:- +// it('Without clicking on "Create Community" button with very short Community name', () => { +// const creatCommObj = new CreateCommObjects() +// creatCommObj.CommName('ab') +// creatCommObj.InvalidCommNameErrMsg('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') +// }) + + it('Clicking on "More" in the error message of very short Community name ', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('ab') + creatCommObj.CreateCommunitySub() + creatCommObj.MoreErrMsgUrl() + creatCommObj.ErrFormVisible() + }) + + it('Error form message synatx', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('ab') + creatCommObj.CreateCommunitySub() + creatCommObj.MoreErrMsgUrl() + creatCommObj.ErrFormText('Community names must be between 3–21 characters, and can only contain letters, numbers, or underscores.') + }) + + it('Close by (x) in error form message synatx', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('ab') + creatCommObj.CreateCommunitySub() + creatCommObj.MoreErrMsgUrl() + creatCommObj.ErrFormX() + creatCommObj.ErrFormNotExist() + }) + + it('Close by (OK) in error form message synatx', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommName('ab') + creatCommObj.CreateCommunitySub() + creatCommObj.MoreErrMsgUrl() + creatCommObj.ErrFormOk() + creatCommObj.ErrFormNotExist() + }) + + it('Check Max community name lenght', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CommNameMax() + }) + + // it('Enter existing community name and submit', () => { + // const creatCommObj = new CreateCommObjects() + // //later commName:- + // const commName = 'footbally' + // creatCommObj.CommName(commName) + // creatCommObj.CreateCommunitySub() + // creatCommObj.CommNameErrMsg('Sorry, r/'+commName+' is taken. Try another.') + // //Sorry, r/footbally is taken. Try another. + // }) + + it('Enter existing community name and submit', () => { + const creatCommObj = new CreateCommObjects() + //later commName:- + const commName = 'footbally' + creatCommObj.CommName(commName) + creatCommObj.CreateCommunitySub() + // creatCommObj.CommNameErrMsg('Sorry, r/'+commName+' is taken. Try another.') + //Sorry, r/footbally is taken. Try another. + }) + + //filtered + // it('Submit without community category', () => { + // const creatCommObj = new CreateCommObjects() + // creatCommObj.CommName('NOCATEGORY') + // creatCommObj.CreateCommunitySub() + // creatCommObj.CommCategoryErrMsg('A community category is required') + // }) + +// //later +// // it('Enter valid community name and submit', () => { +// // const creatCommObj = new CreateCommObjects() +// // creatCommObj.CommName('Samaa_Comm_fero') +// // creatCommObj.CreateCommunitySub() +// // creatCommObj.xx +// // }) + + it('Closeing the form of "Create Community" by (Cancel) button', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CancelCreateCom () + //creatCommObj.GoHome() + creatCommObj.CommFormNotExist() + }) + + it('Closeing the form of "Create Community" by (X) button', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.CancelCreateComByX() + //creatCommObj.GoHome() + creatCommObj.CommFormNotExist() + }) + + //Bug + it('Closeing the form of "Create Community" by Clicking out of the "Create Community" form', () => { + const creatCommObj = new CreateCommObjects() + creatCommObj.ClickOutForm() + //creatCommObj.GoHome() + creatCommObj.CommFormNotExist() + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetPasswordActions.cy.js b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetPasswordActions.cy.js new file mode 100644 index 0000000..2213c5a --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetPasswordActions.cy.js @@ -0,0 +1,142 @@ +/// +import ForgetPasswordObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy" + +describe('Reset Password Page Tests', function () { + +//Test Case 1 + //NOTE: CHECK THE EFFECT OF IT + it('Forget Password', () => { + console.log("\n\nwaer" ,Cypress.env("CYPRESSBASEURL"), "waer\n\n") + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('karimmahmoud2210@gmail.com') + forgetPassword.EnterUserName('adasdwdx') + forgetPassword.ClickOnResetPasswordButton() + + }) + + //Test Case 2 + //TODO : REVIEW IT + it('Forget Password then click on help', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('karimmahmoud2210@gmail.com') + forgetPassword.EnterUserName('adasdwdx') + forgetPassword.UrlNotEqualChecker('http://localhost/forgetPasswordpage') + }) + + //Test Case 3 + //email is : 1231565456@gmail.com which is invalid one + it('Write Invalid Email - should appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('1231565456@gmail.com') + forgetPassword.EnterUserName('adasdwdx') + forgetPassword.InvalidMessage() + + }) + + //Test Case 6 + //email is : 1231565456a@gmail.com which is Valid one + it('Write Valid Email - should not appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('1231565456a@gmail.com') + forgetPassword.EnterUserName('adasdwdx') + forgetPassword.NotInValidMessage() + + }) + + //Test Case 7 + //email is : as1231565456a which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('as1231565456a') + forgetPassword.EnterUserName('adasdwdx') + forgetPassword.InvalidMessage() + + }) + + //Test Case 8 + //email is : which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('as1231565456a') + forgetPassword.EnterUserName('') + forgetPassword.InvalidMessage() + + }) + + //Test Case 9 + //email is : #$%#$^$%#^ which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('as1231565456a') + forgetPassword.EnterUserName('#$%#$^$%#^') + forgetPassword.InvalidMessage() + + }) + + //Test Case 10 + //email is : @@@@@@@ which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('as1231565456a') + forgetPassword.EnterUserName('@@@@@@@') + forgetPassword.InvalidMessage() + + }) + + + //Test Case 11 + //email is : 127.0.0.1 which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetPassword = new ForgetPasswordObjects() + forgetPassword.navigate() + + forgetPassword.ForgetPasswordHyperLink() + forgetPassword.UrlEqualChecker('http://localhost/forgetPasswordpage') + forgetPassword.EnterEmail('as1231565456a') + forgetPassword.EnterUserName('127.0.0.1') + forgetPassword.InvalidMessage() + + }) + + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetUserNameActions.cy.js b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetUserNameActions.cy.js new file mode 100644 index 0000000..22e489f --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/ForgetActions/ForgetUserNameActions.cy.js @@ -0,0 +1,453 @@ +/// +import ForgetUserNameObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy" + +describe('Reset UserName Page Tests', function () { + + //Test Case 1 + //NOTE: CHECK THE EFFECT OF IT + it('Forget UserName', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.ClickOnEmailButton() + + }) + + //Test Case 2 + it('Forget UserName - then click login - go back to show the email is still written ', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.CLickOnLoginButton() + forgetUserName.UrlEqualChecker('http://localhost/login') + forgetUserName.GoBack() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com') + + }) + + + //Test Case 3 + it('Forget UserName - then click sign up - go back to show the email is still written', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.ClickOnSignUpButton() + forgetUserName.UrlEqualChecker('http://localhost:8085/signup') + forgetUserName.GoBack() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.ContainsChecker('karimmahmoud2210@gmail.com') + + }) + + //Test Case 4 + //TODO : REVIEW IT + it('Forget username then click on help', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('karimmahmoud2210@gmail.com') + forgetUserName.UrlNotEqualChecker('http://localhost/forgetUsernamepage') + }) + + //Test Case 5 + //email is : 1231565456@gmail.com which is invalid one + it('Write Invalid Email - should appear error message', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('1231565456@gmail.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 6 + //email is : 1231565456a@gmail.com which is Valid one + it('Write Valid Email - should not appear error message', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('1231565456a@gmail.com') + forgetUserName.NotInValidMessage() + + }) + + //Test Case 7 + //email is : as1231565456a which is InValid one + it('Write Invalid Email - should appear error message', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('as1231565456a') + forgetUserName.InvalidMessage() + + }) + + //----------------------------------------Valid Test Cases----------------------------------------// + + //Test Case 8 + it('The email contains a dot with a subdomain', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@subdomain.domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 9 + it('Plus sign is considered a valid character', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('firstname+lastname@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 10 + it('The domain is a valid IP address', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@123.123.123.123') + forgetUserName.InvalidMessage() + + }) + + //Test Case 11 + it('A square bracket around IP address is considered valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@[123.123.123.123]') + forgetUserName.InvalidMessage() + + }) + + //Test Case 12 + it('Quotes around email are considered valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email”@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 13 + it('Digits with at least one char in the address are valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('1234567890a@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 14 + it('Dash in the domain name is valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain-one.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 15 + it('Underscore in the address field is valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('_______@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 16 + it('.name is a valid Top Level Domain name', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.name') + forgetUserName.InvalidMessage() + + }) + + //Test Case 17 + it('Dot in Top Level Domain name also considered valid (use co.jp as an example here)', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.co.jp') + forgetUserName.InvalidMessage() + + }) + + //Test Case 18 + it('Dash in the address field is valid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('firstname-lastname@domain.com') + forgetUserName.InvalidMessage() + + }) + + //----------------------------------------InValid Test Cases----------------------------------------// + + //Test Case 19 + it('Garbage', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('#@%^%#$@#$@#.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 20 + it('Missing username', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 21 + it('Encoded HTML within an email is invalid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('Joe Smith ') + forgetUserName.InvalidMessage() + + }) + + //Test Case 22 + it('Missing @', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email.domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 23 + it('Two @ sign', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 24 + it('Leading dot in address is not allowed', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('.email@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 25 + it('Trailing dot in address is not allowed', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email.@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 26 + it('Multiple dots', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email..email@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 27 + it('Unicode char as address', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('あいうえお@domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 28 + it('Text followed email is not allowed', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.com (Joe Smith)') + forgetUserName.InvalidMessage() + + }) + + //Test Case 29 + it('Missing top-level domain (.com/.net/.org/etc)', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain') + forgetUserName.InvalidMessage() + + }) + + //Test Case 30 + it('The leading dash in front of the domain is invalid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@-domain.com') + forgetUserName.InvalidMessage() + + }) + + //Test Case 31 + it('.web is not a valid top-level domain', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain.web') + forgetUserName.InvalidMessage() + + }) + + //Test Case 32 + it('Invalid IP format', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@111.222.333.44444') + forgetUserName.InvalidMessage() + + }) + + //Test Case 33 + it('Multiple dots in the domain portion is invalid', () => { + + const forgetUserName = new ForgetUserNameObjects() + forgetUserName.navigate() + + forgetUserName.ForgetUserNameHyperLink() + forgetUserName.UrlEqualChecker('http://localhost/forgetUsernamepage') + forgetUserName.EnterEmail('email@domain..com') + forgetUserName.InvalidMessage() + + }) + + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/ForgetActions/ResetPasswordActions.cy.js b/cypress/e2e/SWE_PROJECT/ForgetActions/ResetPasswordActions.cy.js new file mode 100644 index 0000000..16403cf --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/ForgetActions/ResetPasswordActions.cy.js @@ -0,0 +1,123 @@ +/// + +import ResetPasswordObjects from "../PageObjects/ForgetObjects/ResetPasswordObjects.cy" +describe('Reset Password Page Tests', function () { + + //Test Case 1 + it('Verify the title of the page', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.TitleChecker() + }) + + //Test Case 2 + it('Reset pasword with same length and same content', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.NewPassword('123456789') + ResetPassword.VerifyPassword('123456789') + ResetPassword.NotInValidMessageNewPassword() + ResetPassword.NotInValidMessageVerifyPassword() + ResetPassword.ClickOnSetPasswordButton() + ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token') + + }) + + //Test Case 3 + it('Reset pasword with same length and different content', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.NewPassword('123456789') + ResetPassword.VerifyPassword('123456788') + ResetPassword.NotInValidMessageNewPassword() + ResetPassword.InvalidMessageVerifyPassword() + ResetPassword.ClickOnSetPasswordButton() + ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token') + + }) + + //Test Case 4 + it('Reset pasword with different length', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.NewPassword('123456789') + ResetPassword.VerifyPassword('123456788a') + ResetPassword.NotInValidMessageNewPassword() + ResetPassword.InvalidMessageVerifyPassword() + ResetPassword.ClickOnSetPasswordButton() + ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token') + + }) + + //Test Case 6 + it('Click on Reset Button With empty passwords', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.ClickOnSetPasswordButton() + ResetPassword.UrlEqualChecker('http://localhost:8085/reset-password/:id/:token') + ResetPassword.InvalidMessageNewPassword() + + }) + + //Test Case 7 + it('Enter Password then go Back then return to Reset Password Page', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.NewPassword('123456789') + ResetPassword.VerifyPassword('123456789') + ResetPassword.NotInValidMessageNewPassword() + ResetPassword.NotInValidMessageVerifyPassword() + ResetPassword.GoBack() + ResetPassword.GoForward() + ResetPassword.EmptyCheckerNewPassword() + ResetPassword.EmptyCheckerVerifyPassword() + + }) + + //Test Case 8 + it('Enter Password then click on Sign In then return to Reset Password Page', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.NewPassword('123456789') + ResetPassword.VerifyPassword('123456789') + ResetPassword.NotInValidMessageNewPassword() + ResetPassword.NotInValidMessageVerifyPassword() + ResetPassword.ClickOnSignUpButton() + ResetPassword.GoBack() + ResetPassword.EmptyCheckerNewPassword() + ResetPassword.EmptyCheckerVerifyPassword() + }) + + //Test Case 9 + it('Enter Password then click on Sign Up then return to Reset Password Page', () => { + + const ResetPassword = new ResetPasswordObjects() + ResetPassword.navigate() + + ResetPassword.NewPassword('123456789') + ResetPassword.VerifyPassword('123456789') + ResetPassword.NotInValidMessageNewPassword() + ResetPassword.NotInValidMessageVerifyPassword() + ResetPassword.CLickOnLoginButton() + ResetPassword.GoBack() + ResetPassword.EmptyCheckerNewPassword() + ResetPassword.EmptyCheckerVerifyPassword() + + }) + + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/HomePageActions/BackToTopButton.cy.js b/cypress/e2e/SWE_PROJECT/HomePageActions/BackToTopButton.cy.js new file mode 100644 index 0000000..dfb3402 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/HomePageActions/BackToTopButton.cy.js @@ -0,0 +1,38 @@ +/// + +import BackToTopButtonObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js" + +describe('Back to Top Button Test Cases', function () { + + beforeEach(() => { + //visit the URL before each test + //backToTopButton.navigate() + }) + + // Test case 1 ==> scroll down then click on the button to get the top of the page + it('Back To Top Button After Scrolling', function () { + + const backToTopButton = new BackToTopButtonObjects() + backToTopButton.navigate() + + backToTopButton.ScrolDown() + + //just for me to see what have happened + cy.wait(2000) + backToTopButton.BackToTopButtonAfterScrolling() + + }) + + + // Test case 2 ==> don't scroll down then click on the button to get the top of the page ==> the button must not appear if i don't scroll down + it('Back To Top Button Before Scrolling', function () { + const backToTopButton = new BackToTopButtonObjects() + backToTopButton.navigate() + + //just for me to see what have happened + cy.wait(2000) + backToTopButton.BackToTopButtonBeforeScrolling() + + }) + + }) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/LoginActions/login.cy.js b/cypress/e2e/SWE_PROJECT/LoginActions/login.cy.js new file mode 100644 index 0000000..3da5ac3 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/LoginActions/login.cy.js @@ -0,0 +1,148 @@ + +import loginObjects from '../PageObjects/LoginObjects/loginObjects' + +describe('Test Login', () => { + + //test visiting the login page + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const login = new loginObjects() + login.navigate() + }) + + + it('empty username with empty password', () => { + const login = new loginObjects() + login.submit() + login.doNotLog() + }) + +//Later:if we have to check the enter , then theck it for all test cases bellow + it('Invalid username with empty password', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Hazem_semo') + login.submit() + login.doNotLog() + }) + + it('Invalid password with empty username', () => { + const login = new loginObjects() + login.enterPassword('12345ghhj') + login.submit() + login.doNotLog() + }) + + it('Valid username with empty password', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Hazem') + login.submit() + login.doNotLog() + }) + + it('Valid password with empty username', () => { + const login = new loginObjects() + login.enterPassword('12345') + login.submit() + login.doNotLog() + }) + + it('Valid username with invalid password', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Hazem') + login.enterPassword('12345') + login.submit() + login.userNameErrMsg("Incorrect username or password") + login.doNotLog() + + }) + + it('Valid password with invalid username', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Ha') + login.enterPassword('cmp123456') + login.submit() + login.doNotLog() + + login.userNameErrMsg("Incorrect username or password") + }) + + it('Invalid password with Invalid username', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Ha') + login.enterPassword('1231hgrjgn') + login.submit() + login.doNotLog() + + login.userNameErrMsg("Incorrect username or password") + + }) + + it('Valid password with valid username', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Hazem') + login.enterPassword('cmp123456') + login.submit() + //blue msg for success login + //cy.get(':nth-child(8) > .AnimatedForm__submitStatus > .AnimatedForm__submitStatusMessage').should('have.text',"You are now logged in. You will soon be redirected") + login.userNameErrMsg('You are now logged in. You will soon be redirected') + login.doLog() + }) + + //weird case: + it('Check the message after:writing username then writing password the deleting user name then submit', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Hazem') + login.enterPassword('cmp123456') + //NOTE:enterUsername is already make clearing the text inside it + login.clearUsername() + login.submit() + login.userNameErrMsg("Username must be between 3 and 20 characters") + login.doNotLog() + }) + + //weird case: + //?later : check the validation of this in original cypress + it('Check the message after:writing username then writing password the deleting user name then press any where', () => { + const login = new loginObjects() + login.enterUsername('Samaa_Hazem') + login.enterPassword('cmp123456') + login.clearUsername() + login.body() + login.userNameErrMsg("Username must be between 3 and 20 characters") + login.doNotLog() + }) + //########################################### linking with other pages ####################################### + it('Clicking on the "SIGN UP" will load the Login page', () => { + const login = new loginObjects() + login.signUpPage() + login.urlChecker(Cypress.env('CYPRESSBASEURL') +'/signup') + //cy.url().should('include','/register') + //?or:cy.url().should('include','/account/register') + }) + + it('Clicking on the "username" will load the(forget username page)', () => { + const login = new loginObjects() + login.forgetUserName() + login.urlChecker(Cypress.env('CYPRESSBASEURL') +'/forgetUsernamepage') + }) + + it('Clicking on the "password" will load the (forget password page)', () => { + const login = new loginObjects() + login.forgetPassword() + login.urlChecker(Cypress.env('CYPRESSBASEURL') +'/forgetPasswordpage') + }) + + it('Clicking on the "User Agreement" will load the (User Agreement page)', () => { + const login = new loginObjects() + login.userAgreementPage() + login.urlChecker('https://www.redditinc.com/policies/user-agreement') + }) + + it('Clicking on the "Privacy Policy" will load the (Privacy Policy)', () => { + const login = new loginObjects() + login.privacyPolicyPage() + login.urlChecker('https://www.reddit.com/policies/privacy-policy') + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/CreateCommunityObjects/CreateCommObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/CreateCommunityObjects/CreateCommObjects.js new file mode 100644 index 0000000..d795478 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/CreateCommunityObjects/CreateCommObjects.js @@ -0,0 +1,143 @@ +class CreateCommObjects{ + + Navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/main') + + } + + UrlChecker(url) { + cy.url() + .should('equal',url); + } + + HomeCreateComm() { + cy.get('#create-community-sidebar') + .click() + } + + // urlInclude(tag) { + // cy.url() + // .should('include',tag); + // } + + // urlNotInclude(tag) { + // cy.url() + // .should('not.include',tag); + // } + + CreateCommunitySub() { + //click on create community button + cy.get('#create-button') + .click() + } + + NoCommNameErrMsg(msg) { + //filtered + // cy.get('#required-name') + // .should('have.text',msg) + cy.get('#required-name') + .should('contain.text',msg) + } + + //filtered : each error msg has different ids + InvalidCommNameErrMsg(msg) { + //filtered + // cy.get('#name-symbols') + // .should('have.text',msg) + cy.get('#name-symbols') + .should('contain.text',msg) + } + + MoreErrMsgUrl() { + cy.get('#more') + .click() + } + + ErrFormVisible() { + cy.get('.transparent-background > dialog') + // cy.get('#more-dialog') + .should('be.exist') + } + + ErrFormNotExist() { + cy.get('.transparent-background > dialog') + // cy.get('#more-dialog') + .should('not.exist') + } + + ErrFormText(msg) { + //filtered + // cy.get('.error-text') + // .should('have.text',msg) + cy.get('.error-text') + .should('contain.text',msg) + } + + ErrFormOk() { + cy.get('#ok') + .click() + } + + ErrFormX() { + //NOTE: not '#exit-dialog' as this is the id for (x) of th Create Community form itself + cy.get('.transparent-background > dialog > header > #exit-dialog') + .click() + } + + CommName(commName) { + cy.get('#name-input') + .clear() + .type(commName) + } + + CommNameMax() { + cy.get('#name-input') + .invoke('attr', 'maxlength') + .should('equal','21') + } + + CancelCreateCom() { + cy.get('#cancel-button') + .click() + } + + CancelCreateComByX() { + cy.get('#exit-dialog') + .click() + } + + CommFormVisible() { + cy.get('#create-community-form') + .should('be.exist') + } + + CommFormNotExist() { + //later:m.s of not exist + cy.get('#create-community-form') + .should('not.exist') + } + // GoHome() { + // this.UrlChecker(Cypress.env('CYPRESSBASEURL') +'/main') + // } + + ClickOutForm() { + cy.get('.backdrop') + .click('left') + } + + CommCategory(major) { + cy.get('#category-input') + .select(major) + } + + CommCategoryErrMsg(msg) { + //filteres + // cy.get('#required-category') + // .should('have.text',msg) + cy.get('#required-category') + .should('contain.text',msg) + } + + +} +export default CreateCommObjects diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/createPostObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/createPostObjects.js new file mode 100644 index 0000000..5bd1505 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/createPostObjects.js @@ -0,0 +1,236 @@ +class createPostObjects{ + + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/submit') + } + + urlChecker(url) { + cy.url() + .should('equal',url); + } + + urlInclude(tag) { + cy.url() + .should('include',tag); + } + + urlNotInclude(tag) { + cy.url() + .should('not.include',tag); + } + + post() { + //"Post" button + //cy.contains('Post') + cy.get('.post-button') + .click() + } + + //?later:change the condition of + //later:update the link + //?what is (2) here? how to determine this num + // cy.url() + // .should('equal',Cypress.env('CYPRESSBASEURL') +'/r/sub-com/comments/2/look_at_this/') + postDone() { + this.urlInclude('comments') + } + + postNotDone() { + //later:change the url + //NOTE:we check that we still in th create post page + cy.url() + .should('equal',Cypress.env('CYPRESSBASEURL') +'/submit') + // urlNotInclude('comments') + } + + // chooseCommunity() { + // //" " button + // cy.get(' ') + // .click() + // } + + mainPostTap() { + //" " button + cy.get('#0') + .click() + } + + imageAndVideoTap() { + //" " button + cy.get('#1') + .click() + } + + linkTap() { + //" " button + cy.get('#2') + .click() + } + + //later:the following should not be implemented as excel sheet said + // pollTap() { + // //" " button + // cy.get(' ') + // .click() + // } + + // talkTap() { + // //" " button + // cy.get(' ') + // .click() + // } + + // oc() { + // //" " button + // cy.get(' ') + // .click() + // } + + // markdown() { + // //" " button + // cy.get(' ') + // .click() + // } + + spoiler() { + //" " button + cy.get('#footer-button-spoiler') + .click() + } + + nsfw() { + //" " button + cy.get('#footer-button-nsfw') + .click() + } + + //later: + flair() { + //" " button + cy.get('#footer-button-flair') + .click() + } + + dragDropImg(img) { + cy.get("input[type=file]") + .attachFile(img, { subjectType: 'drag-n-drop' }) + + } + + uploadImgOrVideo() { + //" " button + cy.get('label.blue-button') + .click() + } + + //?later:how to that?(selecting img after pressing (upload) button + selectImg(img) { + + } + + //?later:how to check that:- + checkUploadImgOrVideo(imoog) { + // cy.get("input[type=file]") + // cy.get('.one-image') + // .contains(img) + cy.get('.one-image') + .should('be.visible') + .and(($img) => { + // "naturalWidth" and "naturalHeight" are set when the image loads + expect($img[0].naturalWidth).to.be.greaterThan(0) + }) + } + + sendNotification() { + //" " checkbox + cy.get('#reply') + .check() + } + + title(text) { + cy.get('.title-input') + .clear() + .type(text); + return this + } + + checkMaxTitle() { + //change this id :[maxlength] :- + cy.get('[maxlength]').invoke('attr', 'maxlength') + .should('equal','300') + } + + checkTitle(text) { + cy.get('.title-input') + .should('equal',text) + } + + postText(text) { + //cy.get('[data-v-2464a639=""][data-v-a41bc47a=""]') + cy.get('.ql-editor') + .clear() + .type(text); + return this + } + + typeUrl(url) { + //cy.get('.url-placeholder') + cy.get('#title') + .clear() + .type(url); + return this + } + + showMyCommunities() { + cy.get('.choose-post-community-3 > .bi') + .click() + } + + //later:update this id:- + chooseMyprofile() { + cy.get('.choose-post-community-3') + .children().first() + } + + //later:update this function:- + clearCommunity() { + //" " button + cy.get('.choose-post-community-3') + .clear + } + + // chooseACommunity(pswd) { + // cy.get('') + // .children().last() + // } + + buttonDisabled(button) { + cy.get(button) + .should('be.disabled') + } + + buttonEnabled(button) { + cy.get(button) + .should('be.enabled') + } + + postDisabled() { + //later and important : update the id of (post) button when norhan add it + this.buttonDisabled('.post-button') + } + + spoilerDisabled() { + this.buttonDisabled('#footer-button-spoiler') + } + + //later + FlairDisabled() { + this.buttonDisabled('#footer-button-flair') + } + + nsfwEnable() { + this.buttonEnabled('#footer-button-nsfw') + } + +} +export default createPostObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/postActionObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/postActionObjects.js new file mode 100644 index 0000000..14c47b3 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/CreatePostObjects/postActionObjects.js @@ -0,0 +1,214 @@ +//1)Later: important : most of these ids is for the first post which is child(3) +//so, later we have to edit it (when it becomes child (1) +//NOTES:if ypu want to upvote any post rather than the first post , most of thses functions may not help + +//2))Later: important : the class names of any msg or any (Undo) in msg or (X) in msg , need to be updated later + +class postActionObjects { + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/main') + } + + + urlChecker(url) { + cy.url() + .should('equal',url); + } + + postOptions(){ + return cy.get('.sub-menu') + } + + //################################################### save and unsave posts################################################# + + savePost() { + //"save" button + cy.get('#sub-save') + .click() + } + + unsavePost() { + //"unsave" button + cy.get('#sub-unsave') + .click() + } + + saveMsgSyntax() { + cy.get('._7JH6kQpO-bx66b9ajIZrz') + .should('have.text','Post saved successfully'); + } + + unsaveMsgSyntax() { + cy.get('._7JH6kQpO-bx66b9ajIZrz') + .should('have.text','Post unsaved successfully'); + } + + saveUndoByMsg() { + //"undo" button + cy.get('._2iuoyPiKHN3kfOoeIQalDT _3zbhtNO0bdck0oYbYRhjMC HNozj_dKjQZ59ZsfEegz8') + .click() + + } + + unsaveUndoByMsg() { + //"undo" button + cy.get('._2iuoyPiKHN3kfOoeIQalDT _3zbhtNO0bdck0oYbYRhjMC HNozj_dKjQZ59ZsfEegz8') + .click() + + } + + //################################################## Hide and UnHide posts################################################### + + hidePost() { + //"hide" button + cy.get('#hide') + .click() + } + + //later:m.s of this function + unhidePostDisappearance() { + //"unhide" button + cy.get('.sub-menu') + .should('not.exist') + //.should('not.contain','Unhide').and('not.contain','unhide').and('not.contain','UnHide') + } + + + hideMsgSyntax() { + cy.get('_7JH6kQpO-bx66b9ajIZrz ') + .should('have.text','Post hidden successfully.') + } + + //later:important: what if there are more than one post have the same title of hidden post? + disappHiddenfPost(postTitle) { + cy.contains(postTitle) + .should('not.exist') + } + + // //###################################################Edit posts################################################# + //later:m.s of this function + editPostDisappearance() { + //"edit" button + cy.get('.sub-menu') + .should('not.contain','Edit').and('not.contain','edit') + } + + // ################################################# vote posts ################################################# + + upvotePost() { + //"upvote" button + //Later:child (3) need to changed to (1) i think? + //? what ydmn that there is at least three posts in home page? + cy.get(':nth-child(3) > .d-flex > #upvote') + .click() + } + + downvotePost() { + //"downvote" button + //Later:child (3) need to changed to (1) i think? + //? what ydmn that there is at least three posts in home page? + cy.get(':nth-child(3) > .d-flex > #downvote') + .click() + } + + //?:-return?the concept? + votesNum(){ + //get number ov votes + return cy.get(':nth-child(3) > .d-flex > .p-2') .invoke('text') + } + + //?should the number be '32' or integer(32)? + checkVotesNum(num){ + //get number ov votes + cy.get(':nth-child(3) > .d-flex > .p-2').invoke('text') + .should('equal',num); + } + +// // cypress test code +// cy.get('[data-testid="num"]').then(($span) => { +// // capture what num is right now +// const num1 = parseFloat($span.text()) + +// cy.get('button') +// .click() +// .then(() => { +// // now capture it again +// const num2 = parseFloat($span.text()) + +// // make sure it's what we expected +// expect(num2).to.eq(num1 + 1) +// }) +// }) + + + // ################################################# delete posts ################################################# + + deleteDisappearance() { + //Disappearance of delete option in any posts rather than those of the users + //"delete" button + cy.get('.sub-menu') + .should('not.contain','Delete').and('not.contain','delete') + } + + //Later: ################################################# share posts ################################################# + + //generl check , if all have the sme id: + // checkMsgSyntax(msg) { + // cy.get('_7JH6kQpO-bx66b9ajIZrz') + // .should('have.text',msg); + + // } + + // undoByMsg() { + // //"undo" button + // cy.get('._2iuoyPiKHN3kfOoeIQalDT _3zbhtNO0bdck0oYbYRhjMC HNozj_dKjQZ59ZsfEegz8') + // .click() + // } + + //?later : check if the msg diappeared or not after click on (x) + msgCancelbyX() { + //"X" button which appeare when we pass over the msg + cy.get('.CloseIcon') + .click() + } + + // ################################################# linking between posts and comments ################################################# + + comments() { + //"Comments" button of the post first post + cy.get(':nth-child(3) > .post-content > .post-services > .services > :nth-child(1)') + .click() + } + + //?Later: get the link of the post , then get the link of the comment page of this post + checkCommmentPage() { + this.urlChecker('http://localhost/r/sub-com/comments/1/Hello%20World/') + } + + // ################################################# linking between posts and user profile ################################################# + + goUserProfile() { + cy.get('#go-to-user-page') + .click() + } + + getFirstPostTitle() { + return cy.get(':nth-child(3) > .post-content > #post-router > .post-title > h3').invoke('text')//.as('posttext') + } + + showSettingsSubmenu() { + cy.get('#show-settings-submenu') + .click() + } + + //?Later: important: we have a serious problem in find saving in cypress! + //?at the full window , saved appeare without the need to click on (...) + //?but in cypress window , it has to click on (...) !! + //?which is totally different id !! + firstPostActionsList() { + cy.get(':nth-child(3) > .post-content > .post-services > .services > #submenu') + .click() + } + +} +export default postActionObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy.js new file mode 100644 index 0000000..5d0875a --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetPasswordObjects.cy.js @@ -0,0 +1,103 @@ + +class ForgetPasswordObjects { + navigate() { + cy.visit(Cypress.env("CYPRESSBASEURL")+'/login') + console.log("\n\nwaer" ,Cypress.env("CYPRESSBASEURL"), "waer\n\n") + cy.log( "\n\nwaerlog" ,Cypress.env("CYPRESSBASEURL"), "waerlogg\n\n") + } + + //----------------------------------------Test #1----------------------------------------// + + ForgetPasswordHyperLink(){ + //click on the hyperlink of Password + cy.get('#app > div > div > div.sec-largest-div > div > form > div.forgot-usr-pass > a:nth-child(4)') + .should('be.visible') + .click() + return this + } + + UrlEqualChecker(url){ + cy.url() + .should('eq', url) + } + + UrlNotEqualChecker(url){ + cy.url() + .should('not.eq' , url ) + + } + + + EnterEmail(Password) { + cy.get('[id=emailAddress]') + .should('be.visible') + .clear() + .type(Password) + return this + } + + EnterUserName(password) { + cy.get('[id=userName]') + .should('be.visible') + .clear() + .type(password) + return this + } + + + ClickOnResetPasswordButton(){ + cy.get('[id=reset-btn]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + CLickOnLoginButton(){ + cy.get('[id=login]') + .should('be.visible') + .click() + } + + + GoBack(){ + cy.go('back') + } + + ContainsChecker(checkingContent){ + cy.get('[id=emailAddress]') + .should('be.visible') + .contains() + } + + //----------------------------------------Test #3----------------------------------------// + ClickOnSignUpButton(){ + cy.get('[id=signup]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #4----------------------------------------// + ClickOnHelpButton(){ + cy.get('[id=help]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #5----------------------------------------// + InvalidMessage(){ + cy.get('[class=invalid]') + .should('be.visible') + .contains('Please enter an email address to continue') + } + + //----------------------------------------Test #6----------------------------------------// + NotInValidMessage(){ + cy.get('[class=invalid]') + .should('be.visible') + .should('not.eq' , 'Please enter an email address to continue') + } + + + +} +export default ForgetPasswordObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js new file mode 100644 index 0000000..b372cba --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js @@ -0,0 +1,104 @@ + +class ForgetUserNameObjects { + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/login') + } + + //----------------------------------------Test #1----------------------------------------// + + ForgetUserNameHyperLink(){ + //click on the hyperlink of username + cy.get('#app > div > div > div.sec-largest-div > form > div.forgot-usr-pass > a:nth-child(2)') + .should('be.visible') + .click() + return this + } + + /* + ReCAPTCHA(){ + cy.get('iframe') + .first() + .then((recaptchaIframe) => { + const body = recaptchaIframe.contents() + cy.get('[id=recaptcha-anchor]') + .click() + }) + + } + */ + + UrlEqualChecker(url){ + cy.url() + .should('eq', url) + } + + UrlNotEqualChecker(url){ + cy.url() + .should('not.eq' , url ) + + } + + + EnterEmail(username) { + cy.get('[id=emailAddress]') + .should('be.visible') + .clear() + .type(username) + return this + } + + ClickOnEmailButton(){ + cy.get('[id=emailme]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + CLickOnLoginButton(){ + cy.get('[id=login]') + .should('be.visible') + .click() + } + + GoBack(){ + cy.go('back') + } + + ContainsChecker(checkingContent){ + cy.get('[id=emailAddress]') + .should('be.visible') + .contains() + } + + //----------------------------------------Test #3----------------------------------------// + ClickOnSignUpButton(){ + cy.get('[id=signup]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #4----------------------------------------// + ClickOnHelpButton(){ + cy.get('[id=help]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #5----------------------------------------// + InvalidMessage(){ + cy.get('[class=invalid]') + .should('be.visible') + .contains('Please enter an email address to continue') + } + + //----------------------------------------Test #6----------------------------------------// + NotInValidMessage(){ + cy.get('[class=invalid]') + .should('be.visible') + .should('not.eq' , 'Please enter an email address to continue') + } + + + +} +export default ForgetUserNameObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js new file mode 100644 index 0000000..98eda22 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js @@ -0,0 +1,91 @@ + +class ResetPasswordObjects { + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/reset-password/:id/:token') + } + + TitleChecker(){ + cy.title() + .should('eq' , 'reddit.com: Reset your password') + } + + NewPassword(password){ + cy.get('[id=password]') + .should('be.visible') + .type(password) + + return this + } + + VerifyPassword(verifyPassword){ + cy.get('[id=password-verify]') + .should('be.visible') + .type(verifyPassword) + + return this + } + + UrlEqualChecker(url){ + cy.url() + .should('eq', url) + } + + ClickOnSetPasswordButton(){ + cy.get('[class=AnimatedForm__submitButton]') + .should('be.visible') + .click() + } + + CLickOnLoginButton(){ + cy.get('[id=login]') + .should('be.visible') + .click() + } + + GoBack(){ + cy.go('back') + } + + GoForward(){ + cy.go('forward') + } + + + ClickOnSignUpButton(){ + cy.get('[id=signup]') + .should('be.visible') + .click() + } + + InvalidMessageNewPassword(){ + cy.get('[class=invalid]') + .contains('Password must be at least 8 characters long') + } + + NotInValidMessageNewPassword(){ + cy.get('[class=invalid]') + .should('not.eq' , 'Password must be at least 8 characters long') + } + + InvalidMessageVerifyPassword(){ + cy.get('[class=invalid]') + .contains('Password must match') + } + + NotInValidMessageVerifyPassword(){ + cy.get('[class=invalid]') + .should('not.eq' , 'Password must match') + } + + EmptyCheckerNewPassword(){ + cy.get('[id=password]') + .should('be.empty') + } + + EmptyCheckerVerifyPassword(){ + cy.get('[id=password]') + .should('be.empty') + } + +} +export default ResetPasswordObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js new file mode 100644 index 0000000..ed2aaba --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js @@ -0,0 +1,25 @@ +class BackToTopButtonObjects{ + + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/main') + } + + //----------------------------------------Test #1----------------------------------------// + ScrolDown(){ + cy.scrollTo(0,300) + } + + BackToTopButtonAfterScrolling(){ + cy.get('[class=back-button]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + BackToTopButtonBeforeScrolling(){ + cy.get('[class=back-button]') + .should('not.be.visible') + } + +} +export default BackToTopButtonObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/LoginObjects/loginObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/LoginObjects/loginObjects.js new file mode 100644 index 0000000..f557614 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/LoginObjects/loginObjects.js @@ -0,0 +1,91 @@ +class loginObjects{ + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/login/') + } + + enterUsername(username) { + cy.get('#user-name') + .clear() + .type(username) + return this + } + + clearUsername() { + cy.get('#user-name') + .clear() + return this + } + + enterPassword(pswd) { + cy.get('#password') + .clear() + .type(pswd) + return this + } + + submit() { + //"LOG IN" button + cy.get('.submit-login') + .click() + } + + urlChecker(url) { + cy.url() + .should('equal',url) + } + + doNotLog() { + cy.url() + .should('not.equal',Cypress.env('CYPRESSBASEURL') +'/main') + } + + doLog() { + cy.url() + .should('equal',Cypress.env('CYPRESSBASEURL') +'/main') + } + + userNameErrMsg(msg){ + //error msg of username box + cy.get('.username-error-message') + .should('have.text',msg) + + } + + // loginpassmsg() { + // } + forgetPassword(){ + //password blue word , will lead to forget password page + cy.get('[href="/forgetPasswordpage"]') + .click() + } + + forgetUserName(){ + //UserName blue word , will lead to forget UserName page + cy.get('[href="/forgetUsernamepage"]') + .click() + } + + signUpPage(){ + //SIGN UP blue word , will lead to SIGN UP page + cy.get('[href="/signup"]') + .click() + } + + userAgreementPage(){ + //User Agreement blue word , will lead to SIGN UP page + cy.get('[href="https://www.redditinc.com/policies/user-agreement"]') + .click() + } + + privacyPolicyPage(){ + //Privacy Policy blue word , will lead to SIGN UP page + cy.get('[href="https://www.redditinc.com/policies/privacy-policy"]') + .click() + } + + body() { + cy.get('.sec-largest-div') + .click() + } +} +export default loginObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/AccountObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/AccountObjects.cy.js new file mode 100644 index 0000000..3d80e20 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/AccountObjects.cy.js @@ -0,0 +1,83 @@ +class AccountObjects { + + navigate(){ + cy.visit(Cypress.env('CYPRESSBASEURL') +'/settings/account') + } + + //----------------------------------------ACCOUNT PREFERENCES----------------------------------------// + EmailAddress(){ + cy.get('[id=change]') + .should('be.visible') + .click() + } + + //TODO: CHECK THE ID OF IT LATER + Gender() { + cy.get('[id=gender-menu]') + .should('be.visible') + .click() + } + + DisplayLanguageBeta() { + cy.get('[id=language]') + .should('be.visible') + .click() + } + + Country() { + cy.get('[id=scountry]') + .should('be.visible') + .click() + } + + //----------------------------------------CONNECTED ACCOUNTS----------------------------------------// + + ConnectToTwitter(){ + cy.get('[id=twitter]') + .should('be.visible') + .click() + } + + ConnectToApple() { + cy.get('[id=apple]') + .should('be.visible') + .click() + } + + ConnectedToGoogle() { + cy.get('[id=google]') + .should('be.visible') + .click() + } + + NoBodyPrivateMessages() { + cy.get('[id=sum-menuNobody]') + .should('be.visible') + .click() + } + + //----------------------------------------BETA TESTS----------------------------------------// + + OptIntoBetaTests(){ + cy.get('[id=sb-2]') + .should('not.be.visible') + .click() + } + + OptOutOfTheRedesign(){ + //TODO: [class=title] ==>need to be changed later + cy.get('[id=sb-1]') + .should('not.be.visible') + .click() + } + + //----------------------------------------DELETE ACCOUNT----------------------------------------// + InviteSomeoneToChat(){ + cy.get('[id=delete-account]') + .should('be.visible') + .click() + } + +} + +export default AccountObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js new file mode 100644 index 0000000..ea76a00 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js @@ -0,0 +1,94 @@ +class ChatAndMessagingObjects { + + navigate(){ + cy.visit(Cypress.env('CYPRESSBASEURL') + '/settings/messaging') + } + + //----------------------------------------Test #1----------------------------------------// + WhoCanSendYouChatRequests(){ + //TODO: [class=title] ==>need to be changed later + cy.get('[class=title]') + .should('be.visible') + .click() + } + + AccountsOlderThan30DaysChatRequests() { + cy.get('[id=sum-menu-titleAccounts Older Than 30 Days]') + .should('be.visible') + .click() + } + + EveryOneChatRequests() { + cy.get('[id=sum-menu-titleEveryone]') + .should('be.visible') + .click() + } + + NoBodyChatRequests() { + cy.get('[id=sum-menuNobody]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + + WhoCanSendYouPrivateMessages(){ + //TODO: [class=title] ==>need to be changed later + cy.get('[class=title]') + .should('be.visible') + .click() + } + + AccountsOlderThan30DaysPrivateMessages() { + cy.get('[id=sum-menu-titleAccounts Older Than 30 Days]') + .should('be.visible') + .click() + } + + EveryOnePrivateMessages() { + cy.get('[id=sum-menu-titleEveryone]') + .should('be.visible') + .click() + } + + NoBodyPrivateMessages() { + cy.get('[id=sum-menuNobody]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #3----------------------------------------// + + InvisbleWhoCanSendYouPrivateMessages(){ + //TODO: [class=title] ==>need to be changed later + cy.get('[class=title]') + .should('not.be.visible') + .click() + } + + //----------------------------------------Test #4----------------------------------------// + InvisbleWhoCanSendYouChatRequests(){ + //TODO: [class=title] ==>need to be changed later + cy.get('[class=title]') + .should('not.be.visible') + .click() + } + + //----------------------------------------Test #6----------------------------------------// + InviteSomeoneToChat(){ + cy.get('[id=copy-link]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #7----------------------------------------// + MarkAllAsread(){ + cy.get('[id=mark-as-read]') + .should('be.visible') + .click() + } + + +} + +export default ChatAndMessagingObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy.js new file mode 100644 index 0000000..8435619 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy.js @@ -0,0 +1,99 @@ +class EmailsObjects{ + + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') + '/settings/emails') + } + + //----------------------------------------Test #1----------------------------------------// + InboxMessages(){ + cy.get('[id=btn1]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + ChatRequests(){ + cy.get('[id=btn2]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #3----------------------------------------// + NewUserWelcome(){ + cy.get('[id=btn3]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #4----------------------------------------// + CommentsOnYourPosts(){ + cy.get('[id=btn4]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #5----------------------------------------// + RepliesToYourComments(){ + cy.get('[id=btn5]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #6----------------------------------------// + UpvotesOnYourPosts(){ + cy.get('[id=btn6]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #7----------------------------------------// + UpvotesOnYourComments(){ + cy.get('[id=btn7]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #8----------------------------------------// + UsernameMentions(){ + cy.get('[id=btn8]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #9----------------------------------------// + NewFollowers(){ + cy.get('[id=btn9]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #10----------------------------------------// + DailyDigest(){ + cy.get('[id=btn10]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #11----------------------------------------// + WeeklyRecap(){ + cy.get('[id=btn11]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #12----------------------------------------// + CommunityDiscovery(){ + cy.get('[id=btn12]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #13----------------------------------------// + UnsubscribeFromAllEmails(){ + cy.get('[id=btn13]') + .should('be.visible') + .click() + } + +} +export default EmailsObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js new file mode 100644 index 0000000..817fb89 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js @@ -0,0 +1,88 @@ +class FeedSettingsObjects{ + + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/settings/feed') + } + //----------------------------CONTENT PREFERENCES Section--------------------------------// + + //----------------------------------------Test #1----------------------------------------// + AdultContent(){ + cy.get('[id=button-one]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + SafeBrowsingMode(){ + cy.get('[id=button-two]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #3----------------------------------------// + EnableHomeFeedRecommendations(){ + cy.get('[id=button-three]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #4----------------------------------------// + EnableLiveRecommendations(){ + cy.get('[id=button-four]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #5----------------------------------------// + AutoplayMedia(){ + cy.get('[id=button-five]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #6----------------------------------------// + ReduceAnimations(){ + cy.get('[id=button-six]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #7----------------------------------------// + CommunityThemes(){ + cy.get('[id=button-seven]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #8----------------------------------------// + CommunityContentSort(){ + cy.get('[class=items-span]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #9----------------------------------------// + RememberPerCommunity(){ + cy.get('[id=button-eight]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #10----------------------------------------// + OpenPostsInNewTab(){ + cy.get('[id=button-nine]') + .should('be.visible') + .click() + } + + //----------------------------CONTENT PREFERENCES Section--------------------------------// + + //----------------------------------------Test #11----------------------------------------// + DefaultToMarkdown(){ + cy.get('[id=button-ten]') + .should('be.visible') + .click() + } + +} +export default FeedSettingsObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ProfileObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ProfileObjects.cy.js new file mode 100644 index 0000000..5400e99 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ProfileObjects.cy.js @@ -0,0 +1,87 @@ +class ProfileObjects { + + navigate(){ + cy.visit( Cypress.env('CYPRESSBASEURL') + '/settings/profile') + } + + //--------------------------------PROFILE INFORMATION------------------------------------// + + //----------------------------------------Test #1----------------------------------------// + + DisplayNameOptional(displayName){ + cy.get('[id=dispalyname]') + .should('be.visible') + .type(displayName) + } + + //----------------------------------------Test #2----------------------------------------// + AboutOptional(about) { + cy.get('[id=about]') + .should('be.visible') + .type(about) + } + + //----------------------------------------Test #3----------------------------------------// + SocialLinks5Max() { + cy.get('[id=links-profile-settings]') + .should('be.visible') + .click() + } + + + //----------------------------------------IMAGES----------------------------------------// + //----------------------------------------Test #4----------------------------------------// + + //TODO: CHECK THE ID HERE + ProfilePicture() { + cy.get('[id=sum-menuNobody]') + .should('be.visible') + .click() + } + + + //TODO: CHECK THE ID HERE + BannerImage(){ + cy.get('[class=title]') + .should('be.visible') + .click() + } + + //----------------------------------------PROFILE CATEGORY----------------------------------------// + + NSFW() { + cy.get('[id=nsfw-profile-settings]') + .should('be.visible') + .click() + } + + //----------------------------------------ADVANCED----------------------------------------// + + AllowPeopletoFollowYou() { + cy.get('[id=allow-profile-settings]') + .should('be.visible') + .click() + } + + ContentVisibility() { + cy.get('[id=visibility-profile-settings]') + .should('be.visible') + .click() + } + + + ActiveInCommunitiesVisibility(){ + cy.get('[id=active-profile-settings]') + .should('be.visible') + .click() + } + + ProfileModerationPage(){ + cy.get('[id=moderation-profile-settings]') + .should('be.visible') + .click() + } + +} + +export default ProfileObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js new file mode 100644 index 0000000..8d871f7 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js @@ -0,0 +1,91 @@ +class SafetyAndPrivacyObjects{ + + //TODO: CHECK ALL IDS OF THIS PAGE OBJECTS + navigate() { + cy.visit(Cypress.env('CYPRESSBASEURL') +'/settings/privacy') + } + //----------------------------------------Safety Section----------------------------------------// + + //----------------------------------------Test #1----------------------------------------// + PrivacyAndSecurityFAQs(){ + cy.get('#app > div > div > div > div:nth-child(2) > div > div > div > p > span > a') + .should('be.visible') + .click() + } + + //----------------------------------------Test #2----------------------------------------// + PeopleYouHaveBlocked(){ + cy.get('[id=button-two]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #3----------------------------------------// + RemoveABlockedUser(){ + cy.get('[id=button-three]') + .should('be.visible') + .click() + } + + //----------------------------------Privacy Section--------------------------------------// + + //----------------------------------------Test #4----------------------------------------// + ShowUpInSearchResults(){ + cy.get('[id=button-four]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #5----------------------------------------// + PersonalizeAllOfRedditBasedOnTheOutboundLinksYouClickOn(){ + cy.get('[id=button-five]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #6----------------------------------------// + PersonalizeAdsBasedOnInformationFromOurPartners(){ + cy.get('[id=button-six]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #7----------------------------------------// + PersonalizeAdsBasedOnYourActivityWithOurPartners(){ + cy.get('[id=button-seven]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #8----------------------------------------// + PersonalizeRecommendationsBasedOnYourGeneralLocation(){ + cy.get('[class=items-span]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #9----------------------------------------// + PersonalizeRecommendationsBasedOnYourActivityWithOurPartners(){ + cy.get('[id=button-eight]') + .should('be.visible') + .click() + } + + //----------------------------------------Test #10----------------------------------------// + BlockNewUserAddButton(){ + cy.get('[id=button-nine]') + .should('be.visible') + .click() + } + + //----------------------------ADVANCED SECURITY Section--------------------------------// + + //----------------------------------------Test #11----------------------------------------// + UseTwoFactorAuthentication(){ + cy.get('[id=button-ten]') + .should('be.visible') + .click() + } + +} +export default SafetyAndPrivacyObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/SignUpObjects/signUpObjects.js b/cypress/e2e/SWE_PROJECT/PageObjects/SignUpObjects/signUpObjects.js new file mode 100644 index 0000000..d79403a --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/SignUpObjects/signUpObjects.js @@ -0,0 +1,184 @@ +class signUpObjects{ + navigate() { + //?which one? + cy.visit(Cypress.env('CYPRESSBASEURL') +'/signup') + //cy.visit('https://www.reddit.com/register/') + } + + enterEmail(username) { + cy.get('#email-input') + .clear() + .type(username); + return this + } + + continue() { + //"CONTINUE" button + cy.get('.submit-signup') + .click(); + //cy.wait(5000) + } + + urlChecker(url) { + cy.url() + .should('equal',url); + } + + urlCheckerNot(url) { + cy.url() + .should('not.equal',url); + } + + emailErrMsg(msg){ + //error msg of Email box + cy.get('.username-error-message') + .should('have.text',msg); + } + + //########################################### linking with other pages ####################################### + loginPage(){ + //LOG IN blue word , will lead to login page + cy.get('[href="/login"]') + .click(); + } + userAgreementPage(){ + //User Agreement blue word , will lead to SIGN UP page + cy.get('[href="https://www.redditinc.com/policies/user-agreement"]') + .click(); + } + + privacyPolicyPage(){ + //Privacy Policy blue word , will lead to SIGN UP page + cy.get('[href="https://www.redditinc.com/policies/privacy-policy"]') + .click(); + } + + goSecondForm() { + cy.get('.all-div') + .should('be.visible') + } + + goNotSecondForm() { + cy.get('.all-div') + .should('not.exist') + } + //###########################for the second form ################## + + enterUserName(username) { + cy.get('#regUsername') + .clear() + .type(username); + return this + } + + enterPassword(pswd) { + cy.get('#reg-password') + .clear() + .type(pswd); + return this + } + + signUpButton(){ + //SIGN UP button + cy.get('#signup-button') + .click(); + } + + backButton(){ + //Back button + cy.get('#back-button') + .click(); + } + + //later:important to update this function + notRobot() { + //?:- + // cy.get('.all-div') + // .click() + cy.get('#repatcha') + .check() + } + //NOTE:userNameErrMsg and passwordErrMsg have the same id !! + //?what if both appears at the same time? + userNameErrMsg(msg){ + //error msg of username box + cy.get('.username-error-message') + .should('have.text',msg); + } + + passwordErrMsg(msg){ + //error msg of password box + cy.get('.username-error-message') + .should('have.text',msg); + } + + noUserNameErrMsg() { + //error msg of username box + cy.get('.username-error-message') + .should('not.exist') + } + + noPasswordErrMsg() { + //error msg of password box + cy.get('.username-error-message') + .should('not.exist') + } + + signUpEnable() { + cy.get('#signup-button') + .should('be.enabled') + } + + //############# later ######## + //?i do not know what is going on, i have to click twice on conyinuw with a delay between them!!:- + contiuneTemporary() { + //"CONTINUE" button + cy.get('.submit-signup') + .click(); + cy.wait(1000) + //"CONTINUE" button + cy.get('.submit-signup') + .click(); + } + + goFirstForm() { + cy.get('.largest-div') + .should('be.visible') + } + + goNotFirstForm() { + cy.get('.largest-div') + .should('not.exist') + } + + firstUsernameSugg() { + cy.get('.suggestions') + .children() + .last() + //.first() + .click() + } + + //later:update 'should' condition + checkUsername() { + cy.get('#regUsername') + .should('not.be.empty') + //later:you can use this later:- + // cy.get('[data-username="Unlucky_Read_4488"]').click() + // cy.get('[data-username="Unlucky_Read_4488"]').invoke('text').then(_arbitaty_username => { + // cy.get('#regUsername').should('have.text',_arbitaty_username) + // }) + } + + signUpDone() { + cy.url() + .should('equal',Cypress.env('CYPRESSBASEURL') +'/main') + } + + signUpNotDone() { + cy.url() + .should('not.equal',Cypress.env('CYPRESSBASEURL') +'/main') + } + +} +export default signUpObjects \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/PageObjects/UserProfileObjects/userProfileObject.js b/cypress/e2e/SWE_PROJECT/PageObjects/UserProfileObjects/userProfileObject.js new file mode 100644 index 0000000..4d3945b --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PageObjects/UserProfileObjects/userProfileObject.js @@ -0,0 +1,295 @@ +class userProfileObject{ + navigate() { + //NOTE:edited later + cy.visit( Cypress.env('CYPRESSBASEURL') + '/user/asmaa0') + } + + overview() { + //"OVERVIEW" button + cy.get('#viewed-profile-link-overview') + .click() + } + + + posts() { + //"POSTS" button + cy.get('#viewed-profile-link-Posts') + .click() + } + + comments() { + //"COMMENTS" button + cy.get('#viewed-profile-link-Comments') + .click() + } + + history() { + //"HISTORY" button + cy.get('#viewed-profile-link-history') + .click() + } + + hidden() { + //"HIDDEN" button + cy.get('#viewed-profile-link-hidden') + .click() + } + + saved() { + //"SAVED" button + cy.get('#viewed-profile-link-saved') + .click() + } + + upvoted() { + //"UPvoted" button + cy.get('#viewed-profile-link-upvoted') + .click() + } + + downvoted() { + //"DOWNVOTED" button + cy.get('#viewed-profile-link-Down\ voted') + .click() + } + + awardsReceived() { + //"AWARDS Received" button + cy.get('#viewed-profile-link-awards\ received') + .click() + } + + awardsGiven() { + //"AWARDS GIVEN" button + cy.get('#viewed-profile-link-awards\ given') + .click() + } + + /////////////// + urlChecker(url) { + cy.url() + .should('equal',url); + } + + overviewPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/') + } + + postsPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/submitted') + } + + commentsPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/comments') + } + + historyPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/history') + } + + hiddenPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/hidden') + } + + savedPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/saved') + } + + + upvotedPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/upvoted') + } + + downvotedPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/downvoted') + } + + awardsReceivedPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/gilded') + } + + awardsGivenPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/gilded/given/') + } + + // ################################################# linking between user profile and create post ################################################# + newPost() { + cy.get('#profile-new-post') + .click() + } + + createPostPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/submitted') + } + + // ################################################# linking between user profile and settings ################################################# + goSettings() { + cy.get('#profile-settings-icon-card') + .click() + } + + settingsPage() { + cy.url() + .should('equal','http://localhost/settings/profile') + } + // ################################################# linking between user profile and home ################################################# + goHome() { + cy.get('#logo-img') + .click() + } + + HomePage() { + cy.url() + .should('equal','http://localhost/main') + } + + // ################################################# pictures and links ################################################# + //?later : how to select + // addProfileImg() { + // cy.get('#add-profile-image-button') + // .click().selectFile('C:\Users\samaa\Downloads\test1.jpeg') + // cy.get('#add-profile-image-button') + // .click() + // } + + // addCoverImg() { + // cy.get('#cover-picture > :nth-child(1)') + // .click() + // } + + //?m.s of the following logic: + checkProfileImg() { + //upload img + cy.get('#profile-picture')// yields the element + .should('have.attr', 'src') // yields the "src" attribute + //.and('equal', '/img/R.2bc79f6f.png') // checks the "src" value + .and('not.eq', '/img/R.2bc79f6f.png') // checks the "src" value + //check that another picture has been added rather than the defult one + //NOTE:-- + //later: if the defult img change , then change the should condition + } + + usernameUrl() { + cy.get('#profile-pic-user-name') + .click() + } + + //userpage() {} + //NOTE:use overviewPage() function + // ################################################# profile options ################################################# + + moreOptions() { + cy.get('#more-options-button') + .click() + } + + fewerOptions() { + cy.get('#fewer-options-button') + .click() + } + + //later: using (get) with any of the three options gives error ,why? + profileModeration() { + //cy.get('#profile-option-Profile\ to\ Moderation') + cy.contains('Profile to Moderation') + .click() + } + + addCustomFeed() { + // cy.get('#profile-option-Add\ to\ Custom\ Feed') + cy.contains('Add to Custom Feed') + .click() + } + + inviteSomeoneToChat() { + //cy.get('#profile-option-Invite\ someone\ to\ chat') + cy.contains('Invite someone to chat') + .click() + } + + inviteSomeoneMsgSyntax() { + //return cy.get('') + cy.get('') + .should('have.text','Copied link!'); + } + + //?later : check if the msg diappeared or not after click on (x) + msgCancelbyX() { + //"X" button which appeare when we pass over the msg + cy.get('') + .click() + } + + profileModerationPage() { + cy.url() + .should('equal','http://localhost/user/asmaaadel0/about/edit/moderation') + } + + //?later: check the responce after click on addToCustomFeed + profileModerationSyntax() { + //cy.get('#profile-option-Profile\ to\ Moderation') + cy.contains('Profile to Moderation') + .should('have.text','Profile Moderation'); + } + + addCustomFeedSyntax() { + //cy.get('#profile-option-Add\ to\ Custom\ Feed') + cy.contains('Add to Custom Feed') + .should('have.text','Add to Custom Feed'); + } + + inviteSomeoneToChatSyntax() { + //cy.get('#profile-option-Invite\ someone\ to\ chat') + cy.contains('Invite someone to chat') + .should('have.text','Invite someone to chat'); + } + + // ################################################# last part of Right side bar ################################################# + //? is the last part is for moderating? + + //?is join and unjoin have the same id? + //?are there the same buttom aslan? + joinAndUnjoin() { + cy.get('#moderator-join-button-') + .click() + } + + goToCommunity() { + cy.get('#moderator-name-') + .click() + } + + //? later: same problem as (comment as) mena + // communityPage() { + // cy.url() + // .should('equal','http://localhost/r//') + // } + + //later : test hover of the join commiunty button + + // ################################################# find a post in a cerain page ################################################# + + findPost(postTitle) { + cy.contains(postTitle) + } + + disappearanceOfPost(postTitle) { + cy.contains(postTitle) + .should('not.exist') + } + +} +export default userProfileObject + + diff --git a/cypress/e2e/SWE_PROJECT/PostActions/createPost.cy.js b/cypress/e2e/SWE_PROJECT/PostActions/createPost.cy.js new file mode 100644 index 0000000..e056d49 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PostActions/createPost.cy.js @@ -0,0 +1,358 @@ + +import createPostObjects from '../PageObjects/CreatePostObjects/createPostObjects' + +describe('Test Craete Post', () => { + + //test visiting the submit page + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const createPost = new createPostObjects(); + createPost.navigate() + }) + + //################################################ test chosing the community with title and post body ############################################### + it('Enable to choose the community or not ', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + }) + + it('Try to click on (post) with choosing the community and without writing any thing', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + //createPost.postNotDone() + createPost.postDisabled() + }) + + it('Try to click on (post) without choosing the community and without writing any thing', () => { + const createPost = new createPostObjects(); + createPost.postNotDone() + //createPost.postDisabled() + }) + + it('Try to click on (post) without choosing the community and with writing title and text', () => { + const createPost = new createPostObjects(); + createPost.title('hi for all') + createPost.postText('this is my first post') + createPost.postNotDone() + //createPost.postDisabled() + }) + + it('Try to click on (post) without choosing the community and with writing the title only', () => { + const createPost = new createPostObjects(); + createPost.title('hi for all') + createPost.postNotDone() + //createPost.postDisabled() + }) + + it('Try to click on (post) without choosing the community and with writing the text only', () => { + const createPost = new createPostObjects(); + createPost.postText('this is my first post') + createPost.postNotDone() + //createPost.postDisabled() + }) + + it('Click (post) with choosing the community and with writing the title only', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.title('hi for all') + createPost.post() + createPost.postDone() + //should pass + }) + + it('Try to click on (post) with choosing the community and with writing the text only', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.postText('this is my first post') + createPost.postNotDone() + //createPost.postDisabled() + //should NOT pass + }) + + // it('Delete the chosen community and choose another', () => { + // const createPost = new createPostObjects(); + // createPost.showMyCommunities() + // createPost.chooseMyprofile() + // createPost.clearCommunity() + // createPost.chooseACommunity() + + // }) + + it('Try to click on (post) after deleting the chosen community and without choosing another', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.clearCommunity() + createPost.postNotDone() + //createPost.postDisabled() + }) + + it('Try to click on (post) after deleting the chosen community and without choosing another and with writing the title only', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.clearCommunity() + createPost.title('hi for all') + createPost.postNotDone() + //createPost.postDisabled() + //should NOT pass + }) + + it('Try to click on (post) after deleting the chosen community and without choosing another and with writing the text only', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.clearCommunity() + createPost.postText('this is my first post') + createPost.postNotDone() + //createPost.postDisabled() + }) + + //Later;i think the 2 tests here are repeated:-- + // it('Click (post) after deleting the chosen community and with choosing another and with writing the title only', () => { + // const createPost = new createPostObjects(); + // createPost.showMyCommunities() + // createPost.chooseMyprofile() + // createPost.clearCommunity() + // createPost.chooseACommunity() + // createPost.title('hi for all') + // createPost.post() + // createPost.postDone() + // //should pass + + // }) + + // it('Click (post) after deleting the chosen community and with choosing another and with writing the text only', () => { + // const createPost = new createPostObjects(); + // createPost.showMyCommunities() + // createPost.chooseMyprofile() + // createPost.clearCommunity() + // createPost.chooseACommunity() + // createPost.postText('this is my first post') + // createPost.postDisabled() + // //should NOT pass + + // }) + + //-------------------------------------------------------- another tests about the title ############################################### + it('Check max length of Title', () => { + const createPost = new createPostObjects(); + createPost.checkMaxTitle() + //should the text box of the title disaalowed + //createPost.title('ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggSS') + }) + + //-------------------------------------------------------- Image & Videos -------------------------------------------------------- + //later:check this test case:(check ->checkTitle<-) + it('Title is the same after switching to Image & Videos', () => { + const createPost = new createPostObjects(); + createPost.title('hi for all') + createPost.imageAndVideoTap() + createPost.checkTitle('hi for all') + }) + + //later:check "checkUploadImgOrVideo" + // it('Uploading an image using drag and drop', () => { + // const createPost = new createPostObjects(); + // createPost.imageAndVideoTap() + // createPost.dragDropImg('test1.jpeg') + // createPost.checkUploadImgOrVideo('test1') + // }) + + // it('Uploading an image using (upload) button', () => { + // const createPost = new createPostObjects(); + // createPost.imageAndVideoTap() + // createPost.uploadImgOrVideo() + // createPost.selectImg('test1.jpeg') + // createPost.checkUploadImgOrVideo('test1') + // }) + + // //later:13-12 + // it.only('Try to click on (post) with uploading an image and with writing title and without choosing the community', () => { + // const createPost = new createPostObjects(); + // createPost.imageAndVideoTap() + // createPost.dragDropImg('test1.jpeg') + // createPost.checkUploadImgOrVideo('test1') + // // createPost.title('hi for all') + // // createPost.postNotDone() + // //createPost.postDisabled() + // }) + + //this test is repeated:- + // it('Click (post) without uploading an image without writing title and without choosing the community', () => { + // const createPost = new createPostObjects(); + // createPost.postDisabled() + // }) + + it('Try to click on (post) without uploading an image with writing title and with choosing the community', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.title('hi for all') + createPost.postNotDone() + //createPost.postDisabled() + //should NOT pass + }) + + it('Try to click on (post) with uploading an image without writing title and with choosing the community', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.imageAndVideoTap() + createPost.dragDropImg('test1.jpeg') + createPost.postNotDone() + //createPost.postDisabled() + //should NOT pass + }) + + //filtered + // it('Click (post) with uploading an image with writing title and with choosing the community', () => { + // const createPost = new createPostObjects(); + // createPost.imageAndVideoTap() + // createPost.dragDropImg('test1.jpeg') + // createPost.showMyCommunities() + // createPost.chooseMyprofile() + // createPost.title('hi for all') + // createPost.post() + // createPost.postDone() + // //should pass + // }) + + + it('Click (post) with uploading an image with writing title and with choosing the community', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.title('hi for all') + createPost.imageAndVideoTap() + createPost.dragDropImg('test1.jpeg') + createPost.post() + createPost.postDone() + //should pass + }) + //-------------------------------------------------------- Link -------------------------------------------------------- + + //filtered + // it('Try to click on (post) with writing a link and with writing title and without choosing the community', () => { + // const createPost = new createPostObjects(); + // createPost.linkTap() + // createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/') + // createPost.title('hi for all') + // createPost.postNotDone() + // //createPost.postDisabled() + // }) + + + it('Try to click on (post) with writing a link and with writing title and without choosing the community', () => { + const createPost = new createPostObjects(); + createPost.title('hi for all') + createPost.linkTap() + createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/') + createPost.postNotDone() + //createPost.postDisabled() + }) + + + //this test is repeated:- + // it('Click (post) without writing a link without writing title and without choosing the community', () => { + // const createPost = new createPostObjects(); + // createPost.postDisabled() + // }) + + it('Try to click on (post) without writing a link with writing title and with choosing the community', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.title('hi for all') + createPost.postNotDone() + //createPost.postDisabled() + //should NOT pass + }) + + it('Try to click on (post) with writing a link without writing title and with choosing the community', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.linkTap() + createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/') + createPost.postNotDone() + //createPost.postDisabled() + //should NOT pass + }) + + //filtered + // it('Click (post) with writing a link with writing title and with choosing the community', () => { + // const createPost = new createPostObjects(); + // createPost.linkTap() + // createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/') + // createPost.showMyCommunities() + // createPost.chooseMyprofile() + // createPost.title('hi for all') + // createPost.post() + // createPost.postDone() + // //should pass + // }) + + it('Click (post) with writing a link with writing title and with choosing the community', () => { + const createPost = new createPostObjects(); + createPost.showMyCommunities() + createPost.chooseMyprofile() + createPost.title('hi for all') + createPost.linkTap() + createPost.typeUrl('https://testup.io/how-to-implement-drag-and-drop-in-cypress/') + createPost.post() + createPost.postDone() + //should pass + }) + //-------------------------------------------------------- other buttons -------------------------------------------------------- + + it('Try to click on (Spoiler) Without choosing the community', () => { + const createPost = new createPostObjects(); + //createPost.spoiler() + createPost.spoilerDisabled() + }) + + //later:check the flair later + it('Try to click on (Flair) Without choosing the community', () => { + const createPost = new createPostObjects(); + // createPost.flair() + createPost.FlairDisabled() + }) + + it('Try to click on (nsfw) Without choosing the community', () => { + const createPost = new createPostObjects(); + createPost.nsfw() + createPost.nsfwEnable() + //NOTE:enable not diabled +}) + //-------------------------------------------------------- Later -------------------------------------------------------- + + //later:- + // it('Try to click on (Spoiler) Without choosing the community that enable spoiler', () => { + // const createPost = new createPostObjects(); + // createPost. + // createPost. + // createPost. + // }) + + // //later:- + // it('Try to click on (flair) Without choosing the community that enable spoiler', () => { + // const createPost = new createPostObjects(); + // createPost. + // createPost. + // createPost. + // }) + + //test NSFW button + + //test Event button + + //test Live chat button + + //check all styles +}) diff --git a/cypress/e2e/SWE_PROJECT/PostActions/postAction.cy.js b/cypress/e2e/SWE_PROJECT/PostActions/postAction.cy.js new file mode 100644 index 0000000..b807c68 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/PostActions/postAction.cy.js @@ -0,0 +1,366 @@ +import postActionObjects from '../PageObjects/CreatePostObjects/postActionObjects' +import userProfileObject from '../PageObjects/UserProfileObjects/userProfileObject' + +describe('Test some actions on post', () => { + + //test visiting the home page + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const postAct = new postActionObjects(); + postAct.navigate() + }) + + + //################################################### save posts################################################# + + it('Check saving arbitrary post in (SAVED) page in user profile', () => { + const postAct = new postActionObjects() + const userProfile = new userProfileObject() + + postAct.firstPostActionsList() + postAct.savePost() + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.saved() + userProfile.findPost(title) + }) + + }) + + it('Appearance of saving post message and its syntax', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.savePost() + postAct.saveMsgSyntax() + + }) + + it('Check message after clicking on (Undo) in saving post message', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.savePost() + postAct.unsaveMsgSyntax() + + }) + + it('Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message', () => { + const postAct = new postActionObjects() + const userProfile = new userProfileObject() + postAct.firstPostActionsList() + postAct.savePost() + postAct.saveUndoByMsg() + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.saved() + userProfile.disappearanceOfPost(title) + }) + //save a post go to SAVED in your profile and chrck if it is unsaved or not + //?Later:how to check for the post that i unsaved right now not another post? + }) + + //################################################### unsave posts################################################# + + it('Check unsaving arbitrary saved post in (SAVED) page in user profile', () => { + const postAct = new postActionObjects() + const userProfile = new userProfileObject() + postAct.firstPostActionsList() + postAct.savePost() + //NOTE: wait some time until the message of saving post diappeare + cy.wait(8000) + + postAct.firstPostActionsList() + postAct.unsavePost() + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.saved() + userProfile.disappearanceOfPost(title) + }) + //save a post go to SAVED in your profile and chrck if it is saved or not + //?Later:how to check for the post that i saved right now not another post? + }) + + it('Appearance of unsaving post message and its syntax', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.savePost() + //NOTE: wait some time until the message of saving post diappeare + cy.wait(8000) + + postAct.firstPostActionsList() + postAct.unsavePost() + postAct.unsaveMsgSyntax() + }) + + it('Check message after clicking on (Undo) in unsaving post message', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.savePost() + //NOTE: wait some time until the message of saving post diappeare + cy.wait(8000) + + postAct.firstPostActionsList() + postAct.unsavePost() + postAct.unsaveUndoByMsg() + postAct.saveMsgSyntax() + + }) + + it('Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.savePost() + //NOTE: wait some time until the message of saving post diappeare + cy.wait(8000) + postAct.firstPostActionsList() + postAct.unsavePost() + postAct.unsaveUndoByMsg() + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.saved() + userProfile.findPost(title) + }) + }) + + // it('Check messages for multiple saving and unsaving for the same post one after the other at the same minute', () => { + // const postAct = new postActionObjects() + // postAct.xx + // postAct.xx + // //check it will keep up with the speed or not + // //check the messages are not overlaped or not + // //check the last responce (saved or unsaved) + + // }) + + //################################################## Hide and UnHide posts################################################### + + it('Check hiding arbitrary post in (HIDDEN) page in user profile', () => { + const postAct = new postActionObjects() + const userProfile = new userProfileObject() + postAct.firstPostActionsList() + postAct.hidePost() + + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.hidden() + userProfile.findPost(title) + }) + //check : Disappearance for the arbitrary hidden post + //hide a post go to HIDDEN in your profile and chrck if it is hide or not + //?Later:how to check for the post that i hide right now not another post? + }) + + it('Appearance of hiding post message and its syntax', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.hidePost() + postAct.hideMsgSyntax() + }) + + it('Check message after clicking on (Undo) in hiding post message ', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.hidePost() + postAct.hideUndoByMsg(); + postAct.unhideMsgDisappearance() + //NOTE: unlike undo of save and save , there is no message appeare after pree undo in hidden msg + + }) + + it("Disappearance of a hidden home post in home page", () => { + const postAct = new postActionObjects() + postAct.getFirstPostTitle().then((title)=>{ + postAct.firstPostActionsList() + postAct.hidePost() + postAct.disappHiddenfPost(title) + }) + }) + + it("Disappearance of (Unhide) option in the hiddden home post", () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.hidePost() + postAct.unhidePostDisappearance() + //you can not unhide any post from its option, it is just done from (HIDDEN) page in the user page + }) + + + //###################################################Edit posts################################################# + + it('Disappearance of edit option of a post that dose not belong to the user', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.editPostDisappearance() + //?:check the ability to edit a post which is not mine (even if i share it in my profile <= m.s ) + }) + // ################################################# vote posts ################################################# + + it('Check numbers of votes after upvote', () => { + const postAct = new postActionObjects() + + //?later: how to check thousand vote numbers? + postAct.votesNum().then((num_str)=>{ + let num = parseInt(num_str) + postAct.upvotePost() + num= num+1 + let string = `${num}`; + postAct.checkVotesNum(string) + }) + }) + + //later: + // it('Check numbers of votes after downvote for at least votes = 2', () => { + // const postAct = new postActionObjects() + // postAct.votesNum() + // postAct.downvotePost() + // postAct.checkVotesNum(num) + // }) + + // it('Check numbers of votes after downvote for at least votes = 1', () => { + // const postAct = new postActionObjects() + // //check zero votes ability + // }) + + // it('Check numbers of votes after downvote for at least votes = 0', () => { + // const postAct = new postActionObjects() + // //check -ve votes + // }) + + it('Downvoting after upvoting the same post', () => { + const postAct = new postActionObjects() + postAct.votesNum().then((num_str)=>{ + let num = parseInt(num_str) + postAct.upvotePost() + postAct.downvotePost() + num= num-1 + let string = `${num}`; + postAct.checkVotesNum(string) + }) + }) + + it('Upvoting after downvoting the same post', () => { + const postAct = new postActionObjects() + postAct.votesNum().then((num_str)=>{ + let num = parseInt(num_str) + postAct.downvotePost() + postAct.upvotePost() + num= num+1 + let string = `${num}`; + postAct.checkVotesNum(string) + }) + }) + + it('Cancel upvoting by clicking on upvote button even numbers of time', () => { + const postAct = new postActionObjects() + postAct.votesNum().then((num_str)=>{ + postAct.upvotePost() + postAct.upvotePost() + postAct.checkVotesNum(num_str) + //same old number num_str not num_str+2 + }) + }) + + it('Click on upvote button odd numbers of time', () => { + const postAct = new postActionObjects() + postAct.votesNum().then((num_str)=>{ + let num = parseInt(num_str) + postAct.upvotePost() + postAct.upvotePost() + postAct.upvotePost() + num= num+1 + let string = `${num}`; + postAct.checkVotesNum(string) + //num_str+1 not num_str+3 + }) + //it should be counted as one upvote + + }) + + it('Click on downvote button odd numbers of time', () => { + const postAct = new postActionObjects() + postAct.votesNum().then((num_str)=>{ + let num = parseInt(num_str) + postAct.downvotePost() + postAct.downvotePost() + postAct.downvotePost() + num= num-1 + let string = `${num}`; + postAct.checkVotesNum(string) + //num_str-1 not num_str-3 + }) + + }) + + it('Cancel downvoting by clicking on downvote button even numbers of time', () => { + const postAct = new postActionObjects() + postAct.votesNum().then((num_str)=>{ + postAct.downvotePost() + postAct.downvotePost() + postAct.checkVotesNum(num_str) + //same old number num_str not num_str-2 + }) + }) + + it('Check upvoted post in UPVOTE page in user profile', () => { + const postAct = new postActionObjects() + const userProfile = new userProfileObject() + postAct.upvotePost() + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.upvoted() + userProfile.findPost(title) + }) + }) + + it('Check downvoted post in DOWNVOTE page in user profile', () => { + const postAct = new postActionObjects() + const userProfile = new userProfileObject() + postAct.downvotePost() + postAct.getFirstPostTitle().then((title)=>{ + postAct.showSettingsSubmenu() + postAct.goUserProfile() + userProfile.downvoted() + userProfile.findPost(title) + }) + }) + + // ################################################# delete posts ################################################# + it('Disappearance of delete option of a post that dose not belong to the user', () => { + const postAct = new postActionObjects() + postAct.firstPostActionsList() + postAct.deleteDisappearance() + }) + + ////////////////////////////////////////////Later////////////////////////////////////////////// + + it('Exsitance of any post', () => { + const postAct = new postActionObjects() + postAct.getFirstPostTitle() + }) + + //Later : check all posts option gain , but from each tab in the users top tapa ( SAVED , UPVOTE , .... ) + + //Later: ################################################# share posts ################################################# + // it('', () => { + // const postAct = new postActionObjects() + // postAct.xx + // postAct.xx + + // }) + + // ################################################# linking between posts and comments ################################################# + it('check if (Comments)button will go to the comments page of the post', () => { + const postAct = new postActionObjects() + postAct.comments(); + postAct.checkCommmentPage(); + }) + + //Later:check when click on the (my post or a hom post) post all the buttons that appeare , ex: (New Post) at the right + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/AccountActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/AccountActions.cy.js new file mode 100644 index 0000000..7cd32c4 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SettingsActions/AccountActions.cy.js @@ -0,0 +1,93 @@ +/// + +import AccountObjects from "../PageObjects/SettingsObjects/AccountObjects.cy" + +describe('Feed Settings Tab Tests', function () { + + //----------------------------------------ACCOUNT PREFERENCES Section----------------------------------------// + //Test Case 1 + it('Email address', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //Test Case 2 + it('Gender', () => { + + const Account = new AccountObjects() + Account.navigate() + + + }) + + //Test Case 3 + it('Display language (beta)', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //Test Case 4 + it('Country', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //----------------------------------------CONNECTED ACCOUNTS Section----------------------------------------// + //Test Case 5 + it('Connect to Twitter', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //Test Case 6 + it('Connect to Apple', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + + //Test Case 7 + it('Connected to Google', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //----------------------------------------BETA TESTS Section----------------------------------------// + //Test Case 8 + it('Opt into beta tests', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //Test Case 9 + it('Opt out of the redesign', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + + //----------------------------------------DELETE ACCOUNT Section----------------------------------------// + //Test Case 10 + it('DELETE ACCOUNT', () => { + + const Account = new AccountObjects() + Account.navigate() + + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/ChatAndMessagingActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/ChatAndMessagingActions.cy.js new file mode 100644 index 0000000..56ebc57 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SettingsActions/ChatAndMessagingActions.cy.js @@ -0,0 +1,101 @@ +/// + +import ChatAndMessagingObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy" + +describe('Chat And Messaging Tab Tests', function () { + + + + //Test Case 1 + //TODO : NEED TO CHECK THE EFFECT OF EACH CHOICE LATER + it('Who can send you chat requests', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + ChatAndMessaging.WhoCanSendYouChatRequests() + ChatAndMessaging.AccountsOlderThan30DaysChatRequests() + ChatAndMessaging.EveryOneChatRequests() + ChatAndMessaging.NoBodyChatRequests() + + }) + + //Test Case 2 + //TODO : NEED TO CHECK THE EFFECT OF EACH CHOICE LATER + it('Who can send you private messages', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + ChatAndMessaging.WhoCanSendYouPrivateMessages() + ChatAndMessaging.EveryOnePrivateMessages() + ChatAndMessaging.NoBodyPrivateMessages() + + }) + + //Test Case 3 + //Click on Who can send you private messages and keep it open, then click on Who can send you chat requests ==> Who can send you private messages should be closed, otherwise bug + it('Who can send you private messages opened, THEN click on Who can send you chat requests', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + ChatAndMessaging.WhoCanSendYouPrivateMessages() + ChatAndMessaging.WhoCanSendYouChatRequests() + ChatAndMessaging.InvisbleWhoCanSendYouPrivateMessages() + + }) + + //Test Case 4 + //Click on Who can send you chat requests and keep it open, then click on Who can send you private messages ==> Who can send you private messages should be closed, otherwise bug + it('Who can send you chat requests opened, THEN Who can send you private messages', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + //TODO: [class=title] ==>need to be changed later ==> Who can send you chat requests + ChatAndMessaging.WhoCanSendYouChatRequests() + ChatAndMessaging.WhoCanSendYouPrivateMessages() + ChatAndMessaging.InvisbleWhoCanSendYouChatRequests() + + }) + + //Test Case 5 + // I choose nobody from Who can send you private messages, then i open Who can send you chat requests and keep it open + //Now I need to get the combo box of the Who can send you private messages ==> but it is invesible + it('choice nobody from Who can send you private messages,THEN open Who can send you chat requests and keep it open , THEN open Who can send you private messages', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + ChatAndMessaging.WhoCanSendYouPrivateMessages() + ChatAndMessaging.NoBodyPrivateMessages() + ChatAndMessaging.WhoCanSendYouChatRequests() + ChatAndMessaging.WhoCanSendYouPrivateMessages() + + }) + + //Test Case 6 + //TODO: NEED TO CHECK THE EFFECT OF THE INVITATION TO A PERSON + it('Invite someone to chat', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + ChatAndMessaging.InviteSomeoneToChat() + + }) + + //Test Case 7 + //TODO: NEED TO CHECK THE EFFECT OF THE MARK AS READ + it('Mark all as read', () => { + + const ChatAndMessaging = new ChatAndMessagingObjects() + ChatAndMessaging.navigate() + + ChatAndMessaging.MarkAllAsread() + + }) + + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/EmailsActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/EmailsActions.cy.js new file mode 100644 index 0000000..7a21d58 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SettingsActions/EmailsActions.cy.js @@ -0,0 +1,129 @@ +/// + +import EmailsObjects from "./cypress/e2e/SWE_PROJECT/PageObjects/SettingsObjects/EmailsObjects.cy" + +//TODO: CHECK THE EFFECT OF ALL TEST CASES LATER + +describe('Emails Tab Tests', function () { + + //----------------------------------------Messages Section----------------------------------------// + //Test Case 1 + it('Inbox messages', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.InboxMessages() + + }) + + //Test Case 2 + it('Chat requests', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.ChatRequests() + + }) + + //----------------------------------------Activity Section----------------------------------------// + //Test Case 3 + it('New user welcome', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.NewUserWelcome() + + }) + + //Test Case 4 + it('Comments on your posts', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.CommentsOnYourPosts() + + }) + + //Test Case 5 + it('Replies to your comments', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.RepliesToYourComments() + + }) + + //Test Case 6 + it('Upvotes on your posts', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.UpvotesOnYourPosts() + + }) + + //Test Case 7 + it('Upvotes on your comments', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.UpvotesOnYourComments() + + }) + + //Test Case 8 + it('Username mentions', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.UsernameMentions() + + }) + + //Test Case 9 + it('New followers', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.NewFollowers() + + }) + + //----------------------------------------NEWSLETTERS Section----------------------------------------// + //Test Case 10 + it('Daily Digest', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.DailyDigest() + + }) + + //Test Case 11 + it('Weekly Recap', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.WeeklyRecap() + + }) + + //Test Case 12 + it('Community Discovery', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.CommunityDiscovery() + + }) + + //Test Case 13 + it('Unsubscribe from all emails', () => { + const Emails = new EmailsObjects() + Emails.navigate() + + Emails.UnsubscribeFromAllEmails() + + }) + +}) diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/FeedSettingsActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/FeedSettingsActions.cy.js new file mode 100644 index 0000000..79fcbd2 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SettingsActions/FeedSettingsActions.cy.js @@ -0,0 +1,108 @@ +/// + +import FeedSettingsObjects from "../PageObjects/SettingsObjects/FeedSettingsObjects.cy" + +describe('Feed Settings Tab Tests', function () { + + //Test Case 1 + it('Adult content', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.AdultContent() + + + }) + + //Test Case 2 + it('Safe browsing mode', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.SafeBrowsingMode() + }) + + //Test Case 3 + it('Enable home feed recommendations', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.EnableHomeFeedRecommendations() + }) + + //Test Case 4 + it('Enable live recommendations', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.EnableLiveRecommendations() + }) + + //Test Case 5 + it('Autoplay media', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.AutoplayMedia() + }) + + //Test Case 6 + it('Reduce Animations', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.ReduceAnimations() + }) + + //Test Case 7 + it('Community themes', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.CommunityThemes() + }) + + //Test Case 8 + it('Community content sort', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.CommunityContentSort() + }) + + //Test Case 9 + it('Remember per community', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.RememberPerCommunity() + }) + + //Test Case 10 + it('Open posts in new tab', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.OpenPostsInNewTab() + }) + + //Test Case 11 + it('Default to markdown', () => { + + const FeedSettings = new FeedSettingsObjects() + FeedSettings.navigate() + + FeedSettings.DefaultToMarkdown() + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/ProfileActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/ProfileActions.cy.js new file mode 100644 index 0000000..95ff086 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SettingsActions/ProfileActions.cy.js @@ -0,0 +1,113 @@ +/// + +import ProfileObjects from "../PageObjects/SettingsObjects/ProfileObjects.cy" +describe('Feed Settings Tab Tests', function () { + + //----------------------------------------PROFILE INFORMATION Section----------------------------------------// + //Test Case 1 + //NOTE: it will have effect without clicking on any button + it('Display name (optional)', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //Test Case 2 + it('About (optional)', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //Test Case 3 + it('Social links (5 max)', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //----------------------------------------IMAGES Section----------------------------------------// + + //Test Case 4 + it('Profile picture', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //Test Case 5 + it('banner image', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //Test Case 6 + it('Profile picture and banner image', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //----------------------------------------PROFILE CATEGORY Section----------------------------------------// + + //Test Case 7 + it('NSFW', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //----------------------------------------ADVANCED Section----------------------------------------// + //Test Case 8 + it('Allow people to follow you', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //Test Case 9 + it('Content visibility', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //Test Case 10 + it('Active in communities visibility', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + + //----------------------------------------PROFILE MODERATION Section----------------------------------------// + //Test Case 11 + it('Profile Moderation page', () => { + + const Profile = new ProfileObjects() + Profile.navigate() + + + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SettingsActions/SafetyAndPrivacyActions.cy.js b/cypress/e2e/SWE_PROJECT/SettingsActions/SafetyAndPrivacyActions.cy.js new file mode 100644 index 0000000..565dbde --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SettingsActions/SafetyAndPrivacyActions.cy.js @@ -0,0 +1,92 @@ +/// + +import SafetyAndPrivacyObjects from "../PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy" + +describe('Safety And Privacy Settings Tab Tests', function () { + + //Test Case 1 + it(' Privacy & Security FAQs Hyper Link', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + SafetyAndPrivacy + + }) + + //----------------------------------------Safety Section----------------------------------------// + + //Test Case 2 + it('People You’ve Blocked - Block a User', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 3 + it('People You’ve Blocked - UnBlock(Remove) a User', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //----------------------------------------Privacy Section----------------------------------------// + //Test Case 4 + it('Personalize all of Reddit based on the outbound links you click on', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 5 + it('Personalize ads based on information from our partners', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 6 + it('Personalize ads based on your activity with our partners', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 7 + it('Personalize recommendations based on your general location', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 8 + it('Personalize recommendations based on your activity with our partners', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 9 + it('Use two-factor authentication', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + + //Test Case 10 + it('Manage third-party app authorization', () => { + + const SafetyAndPrivacy = new SafetyAndPrivacyObjects() + SafetyAndPrivacy.navigate() + + }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up.cy.js b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up.cy.js new file mode 100644 index 0000000..e9be82a --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up.cy.js @@ -0,0 +1,161 @@ + +import signUpObjects from '../PageObjects/SignUpObjects/signUpObjects' + +describe('Test Sign up first form', () => { + + //test visiting the sign_up page + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const signUp = new signUpObjects() + signUp.navigate() + }) + +//---------------------------------------- first form --------------------------------------- // +//filtered + // it('Press "CONTINUE" button with empty email', () => { + // const signUp = new signUpObjects() + // signUp.continue() + // //signUp.emailErrMsg('Looks like you've been doing that a lot. Take a break for 32 minutes before trying again.') + // signUp.goSecondForm() + // }) + +//filtered + // it('Press "CONTINUE" button with empty email and with valid username and strong password then submit', () => { + // const signUp = new signUpObjects() + // signUp.continue() + // //signUp.goSecondForm() + // signUp.enterUserName('Samaa_hazem22fxggf') + // signUp.enterPassword('asdfghje123') + // signUp.signUpBotton() + + // }) + + //filtered + //the error in the msg syntax + it('Without pressing "CONTINUE" with invalid email', () => { + const signUp = new signUpObjects() + signUp.enterEmail('hello') + //signUp.continue() + //filtered + //the error in the msg syntax + //signUp.emailErrMsg('Please fix your email to continue') + signUp.goNotSecondForm() + + }) + + it('Press "CONTINUE" with invalid email', () => { + const signUp = new signUpObjects() + signUp.enterEmail('hello') + //signUp.emailErrMsg('Please fix your email to continue') + signUp.continue() + //filtered + //the error in the msg syntax + //signUp.emailErrMsg('That email is invalid') + signUp.goNotSecondForm() + + }) + + it('Press "CONTINUE" with invalid email (with .com only)', () => { + const signUp = new signUpObjects() + signUp.enterEmail('hello.com') + signUp.continue() + //filtered + //the error in the msg syntax + //signUp.emailErrMsg('That email is invalid') + signUp.goNotSecondForm() + + }) + + it('Press "CONTINUE" with invalid email (with @ only)', () => { + const signUp = new signUpObjects() + signUp.enterEmail('hello.com') + signUp.continue() + //filtered + //the error in the msg syntax + //signUp.emailErrMsg('That email is invalid') + signUp.goNotSecondForm() + + }) + + it('Press "CONTINUE" with invalid email (with @ and .com)', () => { + const signUp = new signUpObjects() + signUp.enterEmail('hello.com') + signUp.continue() + //filtered + //the error in the msg syntax + //signUp.emailErrMsg('That email is invalid') + signUp.goNotSecondForm() + + }) + + //weird: this will pass :- + it('Press "CONTINUE" with valid non-existing email', () => { + const signUp = new signUpObjects() + signUp.enterEmail('hello.dfghj@gmail.com') + signUp.continue() + //.emailErrMsg('That email is invalid') + signUp.goSecondForm() + + }) + + it('Entering a valid email without pressing "CONTINUE"', () => { + const signUp = new signUpObjects() + + signUp.enterEmail('sama.hazem22@gmail.com') + signUp.goNotSecondForm() + }) + + it('Entering a valid email and press the "CONTINUE" ', () => { + const signUp = new signUpObjects() + signUp.enterEmail('sama.hazem22@gmail.com') + signUp.continue() + signUp.goSecondForm() + }) + + //filtered + // it('Entering a valid email of an existing account', () => { + // const signUp = new signUpObjects() + // signUp.enterEmail('sama.hazem22@gmail.com') + // signUp.continue() + // signUp.goSecondForm() + // }) + + //########################################### linking with other pages ####################################### + it('Click the "LOG IN" will load the Login page', () => { + const signUp = new signUpObjects() + signUp.loginPage() + signUp.urlChecker(Cypress.env('CYPRESSBASEURL') +'/login') + }) + + it('Clicking on the "User Agreement" will load the (User Agreement page)', () => { + const signUp = new signUpObjects() + signUp.userAgreementPage() + signUp.urlChecker('https://www.redditinc.com/policies/user-agreement') + }) + + it('Clicking on the "Privacy Policy" will load the (Privacy Policy)', () => { + const signUp = new signUpObjects() + signUp.privacyPolicyPage() + signUp.urlChecker('https://www.reddit.com/policies/privacy-policy') + }) + + + // it.only('Entering a valid Email after alot of Failed attempts', () => { + // const signUp = new signUpObjects() + // signUp.enterEmail('sama.hazem22@gmail.com') + // signUp.continue() + // //signUp.emailErrMsg('Looks like you've been doing that a lot. Take a break for 32 minutes before trying again.') + + // }) + + //?is this different ftom test2? + //?i think it should appear a different msg!! + + // it.only('Check without "enter" with invalid Email', () => { + //const signUp = new signUpObjects() + // signUp.enterEmail('hello') + // signUp.emailErrMsg('Please fix your email to continue') + + // }) +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up_second_form.cy.js b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up_second_form.cy.js new file mode 100644 index 0000000..3a9bce5 --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/SignUpActions/sign_up_second_form.cy.js @@ -0,0 +1,153 @@ + +import signUpObjects from '../PageObjects/SignUpObjects/signUpObjects' + +describe('Test Sign up second form', () => { +//NOTE:important : to test the second form , we temprory make special (continue) which called (contiuneTemporary) , but actually it should not pass any of this test cases + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const signUp = new signUpObjects() + signUp.navigate() + //before all cases here , we need to enter a valid Email to go to the second form + signUp.enterEmail('samaa.abdellatif975@gmail.com') + signUp.contiuneTemporary() + }) + + //-------------------------------------- second form --------------------------------------// + + it('Back to first form', () => { + const signUp = new signUpObjects() + signUp.backButton() + signUp.goFirstForm() + }) + + //filtered + //the error in the msg syntax + // it('Enter invalid username(with space)', () => { + // const signUp = new signUpObjects() + // signUp.enterUserName('njkh khj j jkh') + // signUp.userNameErrMsg("Letters, numbers, dashes, and underscores only. Please try again without symbols.") + // }) + + + //filtered + //the error in the msg syntax + // it('Enter invalid username(with # for example)', () => { + // const signUp = new signUpObjects() + // signUp.enterUserName('njkh#khjjjkh') + // signUp.userNameErrMsg("Letters, numbers, dashes, and underscores only. Please try again without symbols.") + // }) + +//NOTE:it is Valid to enter a user name started with numbers + it('Enter valid username-start with numbers-', () => { + const signUp = new signUpObjects() + signUp.enterUserName('1256ftyfjv') + signUp.noUserNameErrMsg() + }) + + //filtered + //the error in the msg syntax + //NOTE:change the name (Samaa_Hazem) to a name that already exist in the database of the backend + // it('Enter an existed username', () => { + // const signUp = new signUpObjects() + // signUp.enterUserName('Samaa_Hazem') + // signUp.userNameErrMsg("That username is already taken") + // }) + + it('Enter a long username', () => { + const signUp = new signUpObjects() + signUp.enterUserName('Samaa_Hazem323knjk4kkl') + signUp.signUpNotDone() + signUp.userNameErrMsg("Username must be between 3 and 20 characters") + }) + +//NOTE: the msg of empty password is same as the msg of short password!! + it('Enter valid username and empty password', () => { + const signUp = new signUpObjects() + signUp.enterUserName('Samaa_Hazem222') + //signUp.signUpEnable() + //signUp.signUpButton() + signUp.signUpNotDone() + //filtered + //the error in the msg syntax + //signUp.passwordErrMsg("Password must be at least 8 characters long") + }) + + it('Enter valid username and invalid -short- password', () => { + const signUp = new signUpObjects() + signUp.enterUserName('Samaa_Hazem222') + signUp.enterPassword('12') + // signUp.signUpEnable() + // signUp.signUpButton() + signUp.signUpNotDone() + //filtered + //the error in the msg syntax + //signUp.passwordErrMsg("Password must be at least 8 characters long") + }) + + it('Enter valid username and invalid -exactly(7)- character password', () => { + const signUp = new signUpObjects() + signUp.enterUserName('Samaa_Hazem222') + signUp.enterPassword('asdfghj') + // signUp.signUpEnable() + // signUp.signUpButton() + signUp.signUpNotDone() + //filtered + //the error in the msg syntax + //signUp.passwordErrMsg("Password must be at least 8 characters long") + }) + + + it('Enter valid username and valid -exactly(8)- character password', () => { + const signUp = new signUpObjects() + signUp.enterUserName('Samaa_Hazem222') + signUp.enterPassword('asdfghje') + signUp.noPasswordErrMsg() + }) + + it('Enter valid username and valid -exactly(8)- character password and do not check robot', () => { + const signUp = new signUpObjects() + signUp.enterUserName('Samaa_Hazem222') + signUp.enterPassword('asdfghje') + // signUp.signUpEnable() + // signUp.signUpButton() + signUp.signUpNotDone() + }) + + //filtered + // it('Ability to click on (Sign up) without writing any thing', () => { + // const signUp = new signUpObjects() + // signUp.signUpEnable() + // }) + + //later:check not robot + // it('Enter invalid username and valid password and check robot then sign up', () => { + // const signUp = new signUpObjects() + // signUp.enterUserName('Samaa hazem2325') + // signUp.enterPassword('asdfghje') + // signUp.notRobot() + // // signUp.signUpEnable() + // // signUp.signUpButton() + // signUp.signUpNotDone() + // signUp.userNameErrMsg("Letters, numbers, dashes, and underscores only. Please try again without symbols.") + // }) + + // //NOTE:is it a bug as after writing password the robot checker appeares in original cypress, but here , it needs to click any where first!! + // it('Enter valid username and valid password and check robot then sign up', () => { + // const signUp = new signUpObjects() + // signUp.enterUserName('Samaa_hazem22') + // signUp.enterPassword('asdfghje') + // signUp.notRobot() + // // signUp.signUpEnable() + // // signUp.signUpButton() + // signUp.signUpDone() + // }) + + //later:update username suggestions checker: + // it('Choose one of username suggestions', () => { + // const signUp = new signUpObjects() + // signUp.firstUsernameSugg() + // signUp.checkUsername() + // }) + +}) \ No newline at end of file diff --git a/cypress/e2e/SWE_PROJECT/UserProfileActions/userProfile.cy.js b/cypress/e2e/SWE_PROJECT/UserProfileActions/userProfile.cy.js new file mode 100644 index 0000000..951fa9a --- /dev/null +++ b/cypress/e2e/SWE_PROJECT/UserProfileActions/userProfile.cy.js @@ -0,0 +1,196 @@ + +import userProfileObject from '../PageObjects/UserProfileObjects/userProfileObject' + +describe('Test user profile page', () => { + + //test visiting the user Profile page + beforeEach(() => { + // Since we want to visit the same URL at the start of all our tests, + // we include it in our beforeEach function so that it runs before each test + const userProfile = new userProfileObject() + userProfile.navigate() + }) + + // ################################################# linking between user profile and other pages ################################################# + + it('Check opening (OVERVIEW) page', () => { + const userProfile = new userProfileObject() + userProfile.overview() + userProfile.overviewPage() + }) + + it('Check opening (POSTS) page', () => { + const userProfile = new userProfileObject() + userProfile.posts() + userProfile.postsPage() + }) + + it('Check opening (COMMENTS) page', () => { + const userProfile = new userProfileObject() + userProfile.comments() + userProfile.commentsPage() + }) + + it('Check opening (HISTORY) page', () => { + const userProfile = new userProfileObject() + userProfile.history() + userProfile.historyPage() + }) + + it('Check opening (HIDDEN) page', () => { + const userProfile = new userProfileObject() + userProfile.hidden() + userProfile.hiddenPage() + }) + + it('Check opening (SAVED) page', () => { + const userProfile = new userProfileObject() + userProfile.saved() + userProfile.savedPage() + }) + + it('Check opening (UPvoted) page', () => { + const userProfile = new userProfileObject() + userProfile.upvoted() + userProfile.upvotedPage() + }) + + it('Check opening (DOWNVOTED) page', () => { + const userProfile = new userProfileObject() + userProfile.downvoted() + userProfile.downvotedPage() + }) + + it('Check opening (AWARDS RECEIVED) page', () => { + const userProfile = new userProfileObject() + userProfile.awardsReceived() + userProfile.awardsReceivedPage() + }) + + it('Check opening (AWARDS GIVEN) page', () => { + const userProfile = new userProfileObject() + userProfile.awardsGiven() + userProfile.awardsGivenPage() + }) + + it('Check opening (create post) page', () => { + const userProfile = new userProfileObject() + userProfile.newPost() + userProfile.createPostPage() + }) + + it('Check opening (settings) page', () => { + const userProfile = new userProfileObject() + userProfile.goSettings() + userProfile.settingsPage() + }) + + it('Check opening (Home) page', () => { + const userProfile = new userProfileObject() + userProfile.goHome() + userProfile.HomePage() + }) + + // ################################################# profile options ################################################# + + it('View more options in right side bar', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + //?later: how to check that the options appeared? + }) + + it('View more options in right side bar', () => { + const userProfile = new userProfileObject() + //NOTE: to test (fewer options) you have to click on more options first + userProfile.moreOptions() + //?later: how to check that the options appeared? + userProfile.fewerOptions() + }) + + it('Ability to find profile moderation option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.profileModeration() + }) + + it('Ability to find add to custom feed option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.addCustomFeed() + }) + + it('Ability to find invite someone to chat option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.inviteSomeoneToChat() + }) + + it('Check profile moderation option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.profileModeration() + userProfile.profileModerationPage() + }) + + it('Check add to custom feed option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.addCustomFeed() + //?later: check the responce after click on addToCustomFeed + }) + + it('Check invite someone to chat option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.inviteSomeoneToChat() + userProfile.inviteSomeoneMsgSyntax() + }) + + it('Check (x) in the message of invite someone to chat', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.inviteSomeoneToChat() + userProfile.inviteSomeoneMsgSyntax() + userProfile.msgCancelbyX() + }) + + it('Check syntax of (profile moderation) option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.profileModerationSyntax() + }) + + it('Check syntax of (add to custom feed) option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.addCustomFeedSyntax() + }) + + it('Check syntax of (invite someone to chat) option', () => { + const userProfile = new userProfileObject() + userProfile.moreOptions() + userProfile.inviteSomeoneToChatSyntax() + }) + +// ################################################# Right side bar ################################################# + + it('Join a community by pewssing (join) button', () => { + const userProfile = new userProfileObject() + userProfile.joinAndUnjoin() + //?later:how to check that we are joined the community? + }) + + //later + // it('Check loading the community page when clicking on its url beside its (join) button', () => { + // const userProfile = new userProfileObject() + // userProfile.goToCommunity() + // userProfile.communityPage() + // }) + + it('Check loading the main user profile page when clicking on his url under his profile name', () => { + const userProfile = new userProfileObject() + userProfile.usernameUrl() + userProfile.overviewPage() + }) + +}) \ No newline at end of file diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 0000000..02e4254 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/fixtures/test1.jpeg b/cypress/fixtures/test1.jpeg new file mode 100644 index 0000000..fc5e798 Binary files /dev/null and b/cypress/fixtures/test1.jpeg differ diff --git a/cypress/output.html b/cypress/output.html new file mode 100644 index 0000000..c3f5cf6 --- /dev/null +++ b/cypress/output.html @@ -0,0 +1,17 @@ + +Mochawesome Report
\ No newline at end of file diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password (failed).png new file mode 100644 index 0000000..8314225 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password then click on help (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password then click on help (failed).png new file mode 100644 index 0000000..dd40734 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Forget Password then click on help (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Invalid Email - should appear error message (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Invalid Email - should appear error message (failed).png new file mode 100644 index 0000000..94431f5 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Invalid Email - should appear error message (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Valid Email - should not appear error message (failed).png b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Valid Email - should not appear error message (failed).png new file mode 100644 index 0000000..eef32f8 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ForgetPasswordActions.cy.js/Reset Password Page Tests -- Write Valid Email - should not appear error message (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Click on Reset Button With empty passwords (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Click on Reset Button With empty passwords (failed).png new file mode 100644 index 0000000..85c3dd9 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Click on Reset Button With empty passwords (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign In then return to Reset Password Page (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign In then return to Reset Password Page (failed).png new file mode 100644 index 0000000..80cc136 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign In then return to Reset Password Page (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign Up then return to Reset Password Page (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign Up then return to Reset Password Page (failed).png new file mode 100644 index 0000000..77836b0 Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Enter Password then click on Sign Up then return to Reset Password Page (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with different length (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with different length (failed).png new file mode 100644 index 0000000..b3ad88d Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with different length (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and different content (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and different content (failed).png new file mode 100644 index 0000000..7d42fde Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and different content (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and same content (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and same content (failed).png new file mode 100644 index 0000000..08e2e9e Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Reset pasword with same length and same content (failed).png differ diff --git a/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Verify the title of the page (failed).png b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Verify the title of the page (failed).png new file mode 100644 index 0000000..674f6ba Binary files /dev/null and b/cypress/screenshots/ForgetActions/ResetPasswordActions.cy.js/Reset Password Page Tests -- Verify the title of the page (failed).png differ diff --git a/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Clicking on the User Agreement will load the (User Agreement page) (failed).png b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Clicking on the User Agreement will load the (User Agreement page) (failed).png new file mode 100644 index 0000000..b28b0b2 Binary files /dev/null and b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Clicking on the User Agreement will load the (User Agreement page) (failed).png differ diff --git a/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Valid password with valid username (failed).png b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Valid password with valid username (failed).png new file mode 100644 index 0000000..7a66baf Binary files /dev/null and b/cypress/screenshots/LoginActions/login.cy.js/Test Login -- Valid password with valid username (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of hiding post message and its syntax (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of hiding post message and its syntax (failed).png new file mode 100644 index 0000000..0f5ee33 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of hiding post message and its syntax (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of saving post message and its syntax (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of saving post message and its syntax (failed).png new file mode 100644 index 0000000..8ea73e9 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of saving post message and its syntax (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of unsaving post message and its syntax (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of unsaving post message and its syntax (failed).png new file mode 100644 index 0000000..f7682f7 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Appearance of unsaving post message and its syntax (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check downvoted post in DOWNVOTE page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check downvoted post in DOWNVOTE page in user profile (failed).png new file mode 100644 index 0000000..a16a8aa Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check downvoted post in DOWNVOTE page in user profile (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check hiding arbitrary post in (HIDDEN) page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check hiding arbitrary post in (HIDDEN) page in user profile (failed).png new file mode 100644 index 0000000..0fe1564 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check hiding arbitrary post in (HIDDEN) page in user profile (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in hiding post message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in hiding post message (failed).png new file mode 100644 index 0000000..aac8064 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in hiding post message (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in saving post message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in saving post message (failed).png new file mode 100644 index 0000000..21ac8a5 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in saving post message (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in unsaving post message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in unsaving post message (failed).png new file mode 100644 index 0000000..a186d72 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check message after clicking on (Undo) in unsaving post message (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving arbitrary post in (SAVED) page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving arbitrary post in (SAVED) page in user profile (failed).png new file mode 100644 index 0000000..bedcaec Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving arbitrary post in (SAVED) page in user profile (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message (failed).png new file mode 100644 index 0000000..755c6b2 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check saving post in (SAVED) page in user profile after click on (Undo) in unsave message (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message (failed).png new file mode 100644 index 0000000..e2d07c6 Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check unsaving post in (SAVED) page in user profile after click on (Undo) in save message (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check upvoted post in UPVOTE page in user profile (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check upvoted post in UPVOTE page in user profile (failed).png new file mode 100644 index 0000000..5c168be Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Check upvoted post in UPVOTE page in user profile (failed).png differ diff --git a/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Disappearance of a hidden home post in home page (failed).png b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Disappearance of a hidden home post in home page (failed).png new file mode 100644 index 0000000..330496a Binary files /dev/null and b/cypress/screenshots/PostActions/postAction.cy.js/Test some actions on post -- Disappearance of a hidden home post in home page (failed).png differ diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests (failed).png new file mode 100644 index 0000000..717f8e2 Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests (failed).png differ diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests opened, THEN Who can send you private messages (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests opened, THEN Who can send you private messages (failed).png new file mode 100644 index 0000000..17e457f Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you chat requests opened, THEN Who can send you private messages (failed).png differ diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages (failed).png new file mode 100644 index 0000000..1199f50 Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages (failed).png differ diff --git a/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages opened, THEN click on Who can send you chat requests (failed).png b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages opened, THEN click on Who can send you chat requests (failed).png new file mode 100644 index 0000000..dcbf563 Binary files /dev/null and b/cypress/screenshots/SettingsActions/ChatAndMessagingActions.cy.js/Chat And Messaging Tab Tests -- Who can send you private messages opened, THEN click on Who can send you chat requests (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email and press the CONTINUE (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email and press the CONTINUE (failed).png new file mode 100644 index 0000000..15219bd Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email and press the CONTINUE (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email of an existing account (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email of an existing account (failed).png new file mode 100644 index 0000000..8019439 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Entering a valid email of an existing account (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email (failed).png new file mode 100644 index 0000000..e48e204 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email and with valid username and strong password then submit (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email and with valid username and strong password then submit (failed).png new file mode 100644 index 0000000..b0715e8 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE button with empty email and with valid username and strong password then submit (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (failed).png new file mode 100644 index 0000000..90728de Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with .com only) (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with .com only) (failed).png new file mode 100644 index 0000000..62ed44f Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with .com only) (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ and .com) (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ and .com) (failed).png new file mode 100644 index 0000000..33d29d7 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ and .com) (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ only) (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ only) (failed).png new file mode 100644 index 0000000..0605c6c Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with invalid email (with @ only) (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with valid non-existing email (failed).png b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with valid non-existing email (failed).png new file mode 100644 index 0000000..87e448a Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up.cy.js/Test Sign up first form -- Press CONTINUE with valid non-existing email (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Ability to click on (Sign up) without writing any thing (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Ability to click on (Sign up) without writing any thing (failed).png new file mode 100644 index 0000000..37eb864 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Ability to click on (Sign up) without writing any thing (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Choose one of username suggestions (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Choose one of username suggestions (failed).png new file mode 100644 index 0000000..5262e5e Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Choose one of username suggestions (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter an existed username (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter an existed username (failed).png new file mode 100644 index 0000000..4a1a547 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter an existed username (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username and valid password and check robot then sign up (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username and valid password and check robot then sign up (failed).png new file mode 100644 index 0000000..acd1b0f Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username and valid password and check robot then sign up (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with # for example) (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with # for example) (failed).png new file mode 100644 index 0000000..832c9d7 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with # for example) (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with space) (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with space) (failed).png new file mode 100644 index 0000000..965a30f Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter invalid username(with space) (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -short- password (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -short- password (failed).png new file mode 100644 index 0000000..db8d8e3 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -short- password (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and empty password (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and empty password (failed).png new file mode 100644 index 0000000..56ac88d Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and empty password (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -exactly(7)- character password (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -exactly(7)- character password (failed).png new file mode 100644 index 0000000..604c0c0 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and invalid -exactly(7)- character password (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid -exactly(8)- character password and do not check robot (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid -exactly(8)- character password and do not check robot (failed).png new file mode 100644 index 0000000..9f2d42b Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid -exactly(8)- character password and do not check robot (failed).png differ diff --git a/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid password and immeditly check robot then sign up (failed).png b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid password and immeditly check robot then sign up (failed).png new file mode 100644 index 0000000..882f470 Binary files /dev/null and b/cypress/screenshots/SignUpActions/sign_up_second_form.cy.js/Test Sign up second form -- Enter valid username and valid password and immeditly check robot then sign up (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check (x) in the message of invite someone to chat (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check (x) in the message of invite someone to chat (failed).png new file mode 100644 index 0000000..91b5181 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check (x) in the message of invite someone to chat (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check invite someone to chat option (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check invite someone to chat option (failed).png new file mode 100644 index 0000000..5cdec90 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check invite someone to chat option (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS GIVEN) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS GIVEN) page (failed).png new file mode 100644 index 0000000..c82177a Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS GIVEN) page (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS RECEIVED) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS RECEIVED) page (failed).png new file mode 100644 index 0000000..937e072 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (AWARDS RECEIVED) page (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (DOWNVOTED) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (DOWNVOTED) page (failed).png new file mode 100644 index 0000000..4f99447 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (DOWNVOTED) page (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (Home) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (Home) page (failed).png new file mode 100644 index 0000000..51c2293 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (Home) page (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (create post) page (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (create post) page (failed).png new file mode 100644 index 0000000..4b21171 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check opening (create post) page (failed).png differ diff --git a/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check syntax of (profile moderation) option (failed).png b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check syntax of (profile moderation) option (failed).png new file mode 100644 index 0000000..d205a25 Binary files /dev/null and b/cypress/screenshots/UserProfileActions/userProfile.cy.js/Test user profile page -- Check syntax of (profile moderation) option (failed).png differ diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 0000000..66ea16e --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js new file mode 100644 index 0000000..0e7290a --- /dev/null +++ b/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/cypress/videos/ForgetActions/ForgetPasswordActions.cy.js.mp4 b/cypress/videos/ForgetActions/ForgetPasswordActions.cy.js.mp4 new file mode 100644 index 0000000..bd02d3f Binary files /dev/null and b/cypress/videos/ForgetActions/ForgetPasswordActions.cy.js.mp4 differ diff --git a/cypress/videos/ForgetActions/ResetPasswordActions.cy.js.mp4 b/cypress/videos/ForgetActions/ResetPasswordActions.cy.js.mp4 new file mode 100644 index 0000000..2fc5ccd Binary files /dev/null and b/cypress/videos/ForgetActions/ResetPasswordActions.cy.js.mp4 differ diff --git a/cypress/videos/HomePageActions/BackToTopButton.cy.js.mp4 b/cypress/videos/HomePageActions/BackToTopButton.cy.js.mp4 new file mode 100644 index 0000000..5e288d6 Binary files /dev/null and b/cypress/videos/HomePageActions/BackToTopButton.cy.js.mp4 differ diff --git a/cypress/videos/LoginActions/login.cy.js.mp4 b/cypress/videos/LoginActions/login.cy.js.mp4 new file mode 100644 index 0000000..12e34ea Binary files /dev/null and b/cypress/videos/LoginActions/login.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js.mp4 b/cypress/videos/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js.mp4 new file mode 100644 index 0000000..f68babe Binary files /dev/null and b/cypress/videos/PageObjects/ForgetObjects/ForgetUserNameObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js.mp4 b/cypress/videos/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js.mp4 new file mode 100644 index 0000000..fbdd016 Binary files /dev/null and b/cypress/videos/PageObjects/ForgetObjects/ResetPasswordObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js.mp4 b/cypress/videos/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js.mp4 new file mode 100644 index 0000000..ad17d45 Binary files /dev/null and b/cypress/videos/PageObjects/HomeObjects/BackToTopButtonObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/SettingsObjects/AccountObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/AccountObjects.cy.js.mp4 new file mode 100644 index 0000000..d11a3f6 Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/AccountObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js.mp4 new file mode 100644 index 0000000..94f9922 Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/ChatAndMessagingObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/SettingsObjects/EmailsObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/EmailsObjects.cy.js.mp4 new file mode 100644 index 0000000..6facc7e Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/EmailsObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js.mp4 new file mode 100644 index 0000000..bfea428 Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/FeedSettingsObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/SettingsObjects/ProfileObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/ProfileObjects.cy.js.mp4 new file mode 100644 index 0000000..c552137 Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/ProfileObjects.cy.js.mp4 differ diff --git a/cypress/videos/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js.mp4 b/cypress/videos/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js.mp4 new file mode 100644 index 0000000..5539274 Binary files /dev/null and b/cypress/videos/PageObjects/SettingsObjects/SafetyAndPrivacyObjects.cy.js.mp4 differ diff --git a/cypress/videos/PostActions/createPost.cy.js.mp4 b/cypress/videos/PostActions/createPost.cy.js.mp4 new file mode 100644 index 0000000..18fa79a Binary files /dev/null and b/cypress/videos/PostActions/createPost.cy.js.mp4 differ diff --git a/cypress/videos/PostActions/postAction.cy.js.mp4 b/cypress/videos/PostActions/postAction.cy.js.mp4 new file mode 100644 index 0000000..68ad412 Binary files /dev/null and b/cypress/videos/PostActions/postAction.cy.js.mp4 differ diff --git a/cypress/videos/SettingsActions/AccountActions.cy.js.mp4 b/cypress/videos/SettingsActions/AccountActions.cy.js.mp4 new file mode 100644 index 0000000..444bfab Binary files /dev/null and b/cypress/videos/SettingsActions/AccountActions.cy.js.mp4 differ diff --git a/cypress/videos/SettingsActions/ChatAndMessagingActions.cy.js.mp4 b/cypress/videos/SettingsActions/ChatAndMessagingActions.cy.js.mp4 new file mode 100644 index 0000000..1d87ff8 Binary files /dev/null and b/cypress/videos/SettingsActions/ChatAndMessagingActions.cy.js.mp4 differ diff --git a/cypress/videos/SettingsActions/EmailsActions.cy.js.mp4 b/cypress/videos/SettingsActions/EmailsActions.cy.js.mp4 new file mode 100644 index 0000000..2bf49e3 Binary files /dev/null and b/cypress/videos/SettingsActions/EmailsActions.cy.js.mp4 differ diff --git a/cypress/videos/SettingsActions/FeedSettingsActions.cy.js.mp4 b/cypress/videos/SettingsActions/FeedSettingsActions.cy.js.mp4 new file mode 100644 index 0000000..7a9c5ec Binary files /dev/null and b/cypress/videos/SettingsActions/FeedSettingsActions.cy.js.mp4 differ diff --git a/cypress/videos/SettingsActions/ProfileActions.cy.js.mp4 b/cypress/videos/SettingsActions/ProfileActions.cy.js.mp4 new file mode 100644 index 0000000..2a6c3a9 Binary files /dev/null and b/cypress/videos/SettingsActions/ProfileActions.cy.js.mp4 differ diff --git a/cypress/videos/SettingsActions/SafetyAndPrivacyActions.cy.js.mp4 b/cypress/videos/SettingsActions/SafetyAndPrivacyActions.cy.js.mp4 new file mode 100644 index 0000000..f885a69 Binary files /dev/null and b/cypress/videos/SettingsActions/SafetyAndPrivacyActions.cy.js.mp4 differ diff --git a/cypress/videos/SignUpActions/sign_up.cy.js.mp4 b/cypress/videos/SignUpActions/sign_up.cy.js.mp4 new file mode 100644 index 0000000..16789b4 Binary files /dev/null and b/cypress/videos/SignUpActions/sign_up.cy.js.mp4 differ diff --git a/cypress/videos/SignUpActions/sign_up_second_form.cy.js.mp4 b/cypress/videos/SignUpActions/sign_up_second_form.cy.js.mp4 new file mode 100644 index 0000000..699cbf0 Binary files /dev/null and b/cypress/videos/SignUpActions/sign_up_second_form.cy.js.mp4 differ diff --git a/cypress/videos/UserProfileActions/userProfile.cy.js.mp4 b/cypress/videos/UserProfileActions/userProfile.cy.js.mp4 new file mode 100644 index 0000000..de4d030 Binary files /dev/null and b/cypress/videos/UserProfileActions/userProfile.cy.js.mp4 differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..1d19b86 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3173 @@ +{ + "name": "Desktop", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "cypress": "^10.11.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cypress": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz", + "integrity": "sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", + "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, + "dependencies": { + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true + }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, + "ci-info": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", + "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cypress": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz", + "integrity": "sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==", + "dev": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dayjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.6.tgz", + "integrity": "sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true + }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..abaeecc --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": { + "cypress": "^10.11.0" + }, + "scripts": { + "openCypress": "cypress open", + "test": "node_modules\\.bin\\cypress run", + "runtests": "npm run test --", + "runCypressInTerminal": "cypress run", + "runCypressInBrowser": "cypress run --headed", + "runSpecificCase": "cypress run --spec ", + "runChrome": "cypress run --browser chrome", + "runEdge": "cypress run --browser edge" + } +}