Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 1.29.0 #3206

Merged
merged 15 commits into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import * as main from '../pages/main.page'
import * as main from './main.page'

let etherscanLink = 'a[aria-label="View on sepolia.etherscan.io"]'
let etherscanLinkSepolia = 'a[aria-label="View on sepolia.etherscan.io"]'
export const balanceSingleRow = '[aria-labelledby="tableTitle"] > tbody tr'
const currencyDropdown = '[id="currency"]'
Expand All @@ -18,6 +17,8 @@ const hiddenTokenSaveBtn = 'span[data-track="assets: Save hide dialog"]'
const hiddenTokenCancelBtn = 'span[data-track="assets: Cancel hide dialog"]'
const hiddenTokenDeselectAllBtn = 'span[data-track="assets: Deselect all hide dialog"]'
const hiddenTokenIcon = 'svg[data-testid="VisibilityOffOutlinedIcon"]'
const currencySelector = '[data-testid="currency-selector"]'
const currencyItem = '[data-testid="currency-item"]'

const hideTokenDefaultString = 'Hide tokens'
const assetNameSortBtnStr = 'Asset'
Expand Down Expand Up @@ -92,6 +93,15 @@ export const currentcyGnosisFormat = '< 0.00001 GNO'
export const currencyOx = /^0x$/
export const currentcyOxFormat = '1.003 ZRX'

function clickOnCurrencySelector() {
cy.get(currencySelector).click()
}

export function changeCurrency(currency) {
clickOnCurrencySelector()
cy.get(currencyItem).contains(currency).click()
}

export function clickOnSendBtn(index) {
cy.get('button')
.contains(sendBtnStr)
Expand All @@ -109,6 +119,10 @@ export function showSendBtn(index) {
})
}

export function VerifySendButtonIsDisabled() {
cy.get('button').contains(sendBtnStr).should('be.disabled')
}

export function verifyTableRows(assetsLength) {
cy.get(balanceSingleRow).should('have.length', assetsLength)
}
Expand Down Expand Up @@ -207,14 +221,14 @@ export function verityTokenAltImageIsVisible(currency, alttext) {
})
}

export function verifyAssetNameHasExplorerLink(currency, columnName, sepolia = false) {
if (sepolia) etherscanLink = etherscanLinkSepolia
export function verifyAssetNameHasExplorerLink(currency, columnName) {
etherscanLinkSepolia
cy.get(tokenListTable)
.contains(currency)
.parents('tr')
.find('td')
.eq(columnName)
.find(etherscanLink)
.find(etherscanLinkSepolia)
.should('be.visible')
}

Expand All @@ -225,7 +239,7 @@ export function verifyAssetExplorerLinkNotAvailable(currency, columnName) {
.find('td')
.eq(columnName)
.within(() => {
cy.get(etherscanLink).should('not.exist')
cy.get(etherscanLinkSepolia).should('not.exist')
})
}

Expand Down
2 changes: 1 addition & 1 deletion cypress/e2e/pages/import_export.pages.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const appearenceTabStr = 'Appearance'
const showMoreTabsBtn = '[data-testid="KeyboardArrowRightIcon"]'
const dataTabStr = 'Data'
const tab = 'div[role="tablist"] a'
const safeHeaderInfo = '[data-testid="safe-header-info"]'
export const safeHeaderInfo = '[data-testid="safe-header-info"]'
export const prependChainPrefixStr = 'Prepend chain prefix to addresses'
export const copyAddressStr = 'Copy addresses with chain prefix'
export const darkModeStr = 'Dark mode'
Expand Down
7 changes: 0 additions & 7 deletions cypress/e2e/pages/load_safe.pages.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ const addressInput = 'input[name="address"]'
const sideBarIcon = '[data-testid="ChevronRightIcon"]'
const sidebarCheckIcon = '[data-testid="CheckIcon"]'
const addressStepNextBtn = '[data-testid="load-safe-next-btn"]'
const qrCodeBtn = '[data-testid="address-qr-scan"]'
const typeFile = '[type="file"]'
const nextBtnStr = 'Next'
const addBtnStr = 'Add'
Expand Down Expand Up @@ -65,12 +64,6 @@ export function verifyNameLengthErrorMessage() {
cy.get(nameInput).parent().prev('label').contains(invalidAddressNameLengthErrorMsg)
}

export function scanQRCode(image) {
cy.get(qrCodeBtn).click()
cy.contains('Upload an image').click()
cy.get(typeFile).attachFile(image)
}

export function inputAddress(address) {
cy.get(addressInput).clear().type(address)
}
Expand Down
15 changes: 13 additions & 2 deletions cypress/e2e/pages/main.page.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as constants from '../../support/constants'

const acceptSelection = 'Save settings'
const executeStr = 'Execute'
const connectedOwnerBlock = '[data-testid="open-account-center"]'
export const modalDialogCloseBtn = '[data-testid="modal-dialog-close-btn"]'

export function clickOnExecuteBtn() {
Expand Down Expand Up @@ -41,8 +42,8 @@ export function acceptCookies(index = 0) {
})
}

export function verifyGoerliWalletHeader() {
cy.contains(constants.goerlyE2EWallet)
export function verifyOwnerConnected(prefix = 'sep:') {
cy.get(connectedOwnerBlock).should('contain', prefix)
}

export function verifyHomeSafeUrl(safe) {
Expand Down Expand Up @@ -89,6 +90,10 @@ export function verifyElementsCount(element, count) {
cy.get(element).should('have.length', count)
}

export function verifyMinimumElementsCount(element, count) {
cy.get(element).should('have.length.at.least', count)
}

export function verifyValuesDoNotExist(element, values) {
values.forEach((value) => {
cy.get(element).should('not.contain', value)
Expand Down Expand Up @@ -166,3 +171,9 @@ export function checkTextOrder(selector, expectedTextArray) {
expect(text).to.eq(expectedTextArray[index])
})
}

export function verifyElementsStatus(elements, status) {
elements.forEach((element) => {
cy.get(element).should(status)
})
}
11 changes: 11 additions & 0 deletions cypress/e2e/pages/modals.page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export const modalTitle = '[data-testid="modal-title"]'
export const modal = '[data-testid="modal-view"]'

export const modalTitiles = {
editEntry: 'Edit entry',
deleteEntry: 'Delete entry',
}

export function verifyModalTitle(title) {
cy.get(modalTitle).should('contain', title)
}
20 changes: 19 additions & 1 deletion cypress/e2e/pages/navigation.page.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
export const sideNavSettingsIcon = '[data-testid="settings-nav-icon"]'
export const setupSection = '[data-testid="setup-section"]'
export const modalBackBtn = '[data-testid="modal-back-btn"]'
export const newTxBtn = '[data-testid="new-tx-btn"]'
const modalCloseIcon = '[data-testid="CloseIcon"]'
const newTxBtn = '[data-testid="new-tx-btn"]'
const expandMoreIcon = 'svg[data-testid="ExpandMoreIcon"]'
const sentinelStart = 'div[data-testid="sentinelStart"]'

const disconnectBtnStr = 'Disconnect'
const notConnectedStatus = 'Connect'

export function verifyTxBtnStatus(status) {
cy.get(newTxBtn).should(status)
}
export function clickOnSideNavigation(option) {
cy.get(option).should('exist').click()
}
Expand All @@ -15,3 +23,13 @@ export function clickOnModalCloseBtn() {
export function clickOnNewTxBtn() {
cy.get(newTxBtn).click()
}

export function clickOnWalletExpandMoreIcon() {
cy.get(expandMoreIcon).eq(0).click()
cy.get(sentinelStart).next().should('be.visible')
}

export function clickOnDisconnectBtn() {
cy.get('button').contains(disconnectBtnStr).click()
cy.get('button').contains(notConnectedStatus)
}
5 changes: 3 additions & 2 deletions cypress/e2e/pages/nfts.pages.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import * as constants from '../../support/constants'
import * as main from '../pages/main.page'
import * as modal from '../pages/modals.page'

const nftModalTitle = '[data-testid="modal-title"]'
const nftModal = '[data-testid="modal-view"]'
const nftModalTitle = modal.modalTitle
const nftModal = modal.modal

const nftModalCloseBtn = main.modalDialogCloseBtn
const recipientInput = 'input[name="recipient"]'
Expand Down
197 changes: 197 additions & 0 deletions cypress/e2e/pages/sidebar.pages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
import * as constants from '../../support/constants'
import * as main from './main.page'
import * as modal from '../pages/modals.page'
import * as navigation from './navigation.page'
import { safeHeaderInfo } from './import_export.pages'

const chainLogo = '[data-testid="chain-logo"]'
const safeIcon = '[data-testid="safe-icon"]'
const sidebarContainer = '[data-testid="sidebar-container"]'
const openSafesIcon = '[data-testid="open-safes-icon"]'
const qrModalBtn = '[data-testid="qr-modal-btn"]'
const copyAddressBtn = '[data-testid="copy-address-btn"]'
const explorerBtn = '[data-testid="explorer-btn"]'
const sideBarListItem = '[data-testid="sidebar-list-item"]'
const sideBarListItemWhatsNew = '[data-testid="list-item-whats-new"]'
const sideBarListItemNeedHelp = '[data-testid="list-item-need-help"]'
const sideSafeListItem = '[data-testid="safe-list-item"]'
const sidebarSafeHeader = '[data-testid="safe-header-info"]'
const sidebarSafeContainer = '[data-testid="sidebar-safe-container"]'
const safeItemOptionsBtn = '[data-testid="safe-options-btn"]'
const safeItemOptionsRenameBtn = '[data-testid="rename-btn"]'
const safeItemOptionsRemoveBtn = '[data-testid="remove-btn"]'
const nameInput = '[data-testid="name-input"]'
const saveBtn = '[data-testid="save-btn"]'
const cancelBtn = '[data-testid="cancel-btn"]'
const deleteBtn = '[data-testid="delete-btn"]'
const readOnlyVisibility = '[data-testid="read-only-visibility"]'
const currencySection = '[data-testid="currency-section"]'
const missingSignatureInfo = '[data-testid="missing-signature-info"]'
const queuedTxInfo = '[data-testid="queued-tx-info"]'

export const addedSafesGnosis = ['0x17b3...98C8', '0x11A6...F1BB', '0xB8d7...642A']
export const addedSafesSepolia = ['0x6d0b...6dC1', '0x5912...fFdb', '0x0637...708e', '0xD157...DE9a']
export const sideBarListItems = ['Home', 'Assets', 'Transactions', 'Address book', 'Apps', 'Settings']
export const testSafeHeaderDetails = ['2/2', constants.SEPOLIA_TEST_SAFE_13_SHORT]
const receiveAssetsStr = 'Receive assets'

export function verifyNetworkIsDisplayed(netwrok) {
cy.get(sidebarContainer)
.should('be.visible')
.within(() => {
cy.get(chainLogo).should('contain', netwrok)
})
}

export function verifySafeHeaderDetails(details) {
main.checkTextsExistWithinElement(safeHeaderInfo, details)
main.verifyElementsExist([safeIcon, currencySection])
}

export function clickOnQRCodeBtn() {
cy.get(sidebarContainer)
.should('be.visible')
.within(() => {
cy.get(qrModalBtn).click()
})
}

export function verifyQRModalDisplayed() {
cy.get(modal.modal).should('be.visible')
cy.get(modal.modalTitle).should('contain', receiveAssetsStr)
}

export function verifyCopyAddressBtn(data) {
cy.get(sidebarContainer)
.should('be.visible')
.within(() => {
cy.get(copyAddressBtn)
.click()
.then(() =>
cy.window().then((win) => {
win.navigator.clipboard.readText().then((text) => {
expect(text).to.contain(data)
})
}),
)
})
}

export function verifyEtherscanLinkExists() {
cy.get(sidebarContainer)
.should('be.visible')
.within(() => {
cy.get(explorerBtn).should('have.attr', 'href').and('include', constants.sepoliaEtherscanlLink)
})
}

export function verifyNewTxBtnStatus(status) {
main.verifyElementsStatus([navigation.newTxBtn], status)
}

export function verifySideListItems() {
main.verifyValuesExist(sideBarListItem, sideBarListItems)
main.verifyElementsExist([sideBarListItemWhatsNew, sideBarListItemNeedHelp])
}

export function verifyTxCounter(counter) {
cy.get(sideBarListItem).contains(sideBarListItems[2]).should('contain', counter)
}

export function verifySafeCount(count) {
main.verifyMinimumElementsCount(sideSafeListItem, count)
}

export function openSidebar() {
cy.get(openSafesIcon).click()
main.verifyElementsExist([sidebarSafeContainer])
}

export function verifyAddedSafesExist(safes) {
main.verifyValuesExist(sideSafeListItem, safes)
}

export function verifySafesByNetwork(netwrok, safes) {
cy.get(sidebarSafeContainer).within(() => {
cy.get(chainLogo)
.contains(netwrok)
.next()
.within(() => {
main.verifyValuesExist(sideSafeListItem, safes)
})
})
}

function getSafeItemByName(name) {
return cy.get(sidebarSafeContainer).find(sideSafeListItem).contains(name).parents('li')
}

export function verifySafeReadOnlyState(safe) {
getSafeItemByName(safe).find(readOnlyVisibility).should('exist')
}

export function verifyMissingSignature(safe) {
getSafeItemByName(safe).find(missingSignatureInfo).should('exist')
}

export function verifyQueuedTx(safe) {
return getSafeItemByName(safe).find(queuedTxInfo).should('exist')
}

function clickOnSafeItemOptionsBtn(name) {
getSafeItemByName(name).find(safeItemOptionsBtn).click()
}

export function renameSafeItem(oldName, newName) {
clickOnSafeItemOptionsBtn(oldName)
clickOnRenameBtn()
typeSafeName(newName)
}

export function removeSafeItem(name) {
clickOnSafeItemOptionsBtn(name)
clickOnRemoveBtn()
confirmSafeItemRemoval()
verifyModalRemoved()
}

function typeSafeName(name) {
cy.get(nameInput).find('input').clear().type(name)
}

function clickOnRenameBtn() {
cy.get(safeItemOptionsRenameBtn).click()
}

function clickOnRemoveBtn() {
cy.get(safeItemOptionsRemoveBtn).click()
}

function confirmSafeItemRemoval() {
cy.get(deleteBtn).click()
}

export function verifySafeNameExists(name) {
cy.get(sidebarSafeContainer).within(() => {
cy.get(sideSafeListItem).contains(name)
})
}

export function verifySafeRemoved(name) {
main.verifyValuesDoNotExist(sidebarSafeContainer, [name])
}

export function clickOnSaveBtn() {
cy.get(saveBtn).click()
verifyModalRemoved()
}

function verifyModalRemoved() {
main.verifyElementsCount(modal.modalTitle, 0)
}

export function checkCurrencyInHeader(currency) {
cy.get(sidebarSafeHeader).within(() => {
cy.get(currencySection).contains(currency)
})
}
Loading
Loading