From 9ea832871b7ad56cac5b47490d3292d15a52ba0d Mon Sep 17 00:00:00 2001 From: "razvan.tomegea" Date: Thu, 17 Oct 2024 19:47:26 +0300 Subject: [PATCH 1/2] Added issue collection tests --- CHANGELOG.md | 1 + .../hooks/useIssueCollectionForm.ts | 4 +- .../IssueCollectionFormValidation.e2e.ts | 215 ++++++++++++++++++ .../tests/IssueNFTCollection.e2e.ts | 45 ++++ .../tests/IssueSFTCollection.e2e.ts | 46 ++++ .../tests/IssueTokenFormValidation.e2e.ts | 21 ++ 6 files changed, 330 insertions(+), 2 deletions(-) create mode 100644 src/pages/IssueCollection/tests/IssueCollectionFormValidation.e2e.ts create mode 100644 src/pages/IssueCollection/tests/IssueNFTCollection.e2e.ts create mode 100644 src/pages/IssueCollection/tests/IssueSFTCollection.e2e.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f77c6c2..6d55833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- [Added issue collection tests](https://github.com/multiversx/mx-lite-wallet-dapp/pull/58) - [Added faucet and issue token tests](https://github.com/multiversx/mx-lite-wallet-dapp/pull/57) - [Allow only tokens and collections with prefix to be registered](https://github.com/multiversx/mx-lite-wallet-dapp/pull/56) diff --git a/src/pages/IssueCollection/hooks/useIssueCollectionForm.ts b/src/pages/IssueCollection/hooks/useIssueCollectionForm.ts index f8bfb56..3b297a4 100644 --- a/src/pages/IssueCollection/hooks/useIssueCollectionForm.ts +++ b/src/pages/IssueCollection/hooks/useIssueCollectionForm.ts @@ -35,14 +35,14 @@ export const useIssueCollectionForm = () => { validationSchema: object().shape({ tokenName: string() .required('Required') - .matches(/^[a-zA-Z]*$/, 'Only letters are allowed') + .matches(/^[a-zA-Z0-9]*$/, 'Alphanumeric characters only') .test( 'validLength', 'Must be between 3 - 50 characters long', (value) => Boolean(value && value.length >= 3 && value.length <= 50) ), tokenTicker: string() - .matches(/^[A-Z0-9]*$/, 'Only uppercase letters are allowed') + .matches(/^[A-Z0-9]*$/, 'Alphanumeric uppercase characters only') .required('Required') .test( 'validLength', diff --git a/src/pages/IssueCollection/tests/IssueCollectionFormValidation.e2e.ts b/src/pages/IssueCollection/tests/IssueCollectionFormValidation.e2e.ts new file mode 100644 index 0000000..a3e7c38 --- /dev/null +++ b/src/pages/IssueCollection/tests/IssueCollectionFormValidation.e2e.ts @@ -0,0 +1,215 @@ +import { DataTestIdsEnum } from 'localConstants/dataTestIds.enum'; +import { + changeInputText, + expectElementToContainText, + expectInputToHaveValue, + getByDataTestId, + loginWithKeystore +} from 'utils/testUtils/puppeteer'; +import { WALLET_SOURCE_ORIGIN } from '__mocks__/data'; + +describe('Issue Collection form validation test', () => { + it('should show errors and not create collection when data is invalid', async () => { + await page.goto(`${WALLET_SOURCE_ORIGIN}/logout`, { + waitUntil: 'domcontentloaded' + }); + + await loginWithKeystore(); + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expect(page.url()).toEqual( + `${WALLET_SOURCE_ORIGIN}/issue-collection` + ); + + const createCollectionBtn = await page.waitForSelector( + getByDataTestId(DataTestIdsEnum.issueCollectionBtn) + ); + + await createCollectionBtn?.click(); + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenNameError, + text: 'Required' + }); + + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Required' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'TEST-COLLECTION' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'T' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenNameInput, + value: 'TEST-COLLECTION' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + value: 'T' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenNameError, + text: 'Alphanumeric characters only' + }); + + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Must be between 3 - 10 characters long' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'tc' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'TEST-COLLECTION' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenNameInput, + value: 'tc' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + value: 'TEST-COLLECTION' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenNameError, + text: 'Must be between 3 - 50 characters long' + }); + + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Alphanumeric uppercase characters only' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'QWERTYUIOPS!' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'QWERTYUIOP!' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenNameError, + text: 'Alphanumeric characters only' + }); + + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Alphanumeric uppercase characters only' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'quertyuiop123' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'quert!' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Alphanumeric uppercase characters only' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIOPASDFGHJKLZXCVBNM' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'QWERTYUIOPASDFGHJKLZXCVBNM' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenNameInput, + value: 'QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIOPASDFGHJKLZXCVBNM' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + value: 'QWERTYUIOPASDFGHJKLZXCVBNM' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenNameError, + text: 'Must be between 3 - 50 characters long' + }); + + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Must be between 3 - 10 characters long' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.sftTypeInput)); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'TESTCOLLECTION' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'TEST' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenNameInput, + value: 'TESTCOLLECTION' + }); + + await expectInputToHaveValue({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + value: 'TEST' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + const tokenNameError = await page.$( + getByDataTestId(DataTestIdsEnum.tokenNameError) + ); + + const tokenTickerError = await page.$( + getByDataTestId(DataTestIdsEnum.tokenTickerError) + ); + + expect(tokenNameError).toEqual(null); + expect(tokenTickerError).toEqual(null); + }); +}); diff --git a/src/pages/IssueCollection/tests/IssueNFTCollection.e2e.ts b/src/pages/IssueCollection/tests/IssueNFTCollection.e2e.ts new file mode 100644 index 0000000..5a1a06f --- /dev/null +++ b/src/pages/IssueCollection/tests/IssueNFTCollection.e2e.ts @@ -0,0 +1,45 @@ +import { WALLET_SOURCE_ORIGIN } from '__mocks__/data'; +import { DataTestIdsEnum } from 'localConstants/dataTestIds.enum'; +import { + changeInputText, + expectElementToContainText, + getByDataTestId, + loginWithKeystore +} from 'utils/testUtils/puppeteer'; + +describe('Issue NFT Collection test', () => { + it('should create a new NFT collection successfully', async () => { + await page.goto(`${WALLET_SOURCE_ORIGIN}/logout`, { + waitUntil: 'domcontentloaded' + }); + + await loginWithKeystore(); + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expect(page.url()).toEqual( + `${WALLET_SOURCE_ORIGIN}/issue-collection` + ); + + const createCollectionBtn = await page.waitForSelector( + getByDataTestId(DataTestIdsEnum.issueCollectionBtn) + ); + + await createCollectionBtn?.click(); + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'TESTCOLLECTION' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'TEST' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.transactionToastTitle, + text: 'Processing transaction' + }); + }); +}); diff --git a/src/pages/IssueCollection/tests/IssueSFTCollection.e2e.ts b/src/pages/IssueCollection/tests/IssueSFTCollection.e2e.ts new file mode 100644 index 0000000..5e49156 --- /dev/null +++ b/src/pages/IssueCollection/tests/IssueSFTCollection.e2e.ts @@ -0,0 +1,46 @@ +import { WALLET_SOURCE_ORIGIN } from '__mocks__/data'; +import { DataTestIdsEnum } from 'localConstants/dataTestIds.enum'; +import { + changeInputText, + expectElementToContainText, + getByDataTestId, + loginWithKeystore +} from 'utils/testUtils/puppeteer'; + +describe('Issue SFT Collection test', () => { + it('should create a new SFT collection successfully', async () => { + await page.goto(`${WALLET_SOURCE_ORIGIN}/logout`, { + waitUntil: 'domcontentloaded' + }); + + await loginWithKeystore(); + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expect(page.url()).toEqual( + `${WALLET_SOURCE_ORIGIN}/issue-collection` + ); + + const createCollectionBtn = await page.waitForSelector( + getByDataTestId(DataTestIdsEnum.issueCollectionBtn) + ); + + await createCollectionBtn?.click(); + await page.click(getByDataTestId(DataTestIdsEnum.sftTypeInput)); + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenNameInput, + shouldOverride: true, + text: 'SFTTESTCOL' + }); + + await changeInputText({ + dataTestId: DataTestIdsEnum.tokenTickerInput, + shouldOverride: true, + text: 'SFT' + }); + + await page.click(getByDataTestId(DataTestIdsEnum.issueCollectionBtn)); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.transactionToastTitle, + text: 'Processing transaction' + }); + }); +}); diff --git a/src/pages/IssueToken/tests/IssueTokenFormValidation.e2e.ts b/src/pages/IssueToken/tests/IssueTokenFormValidation.e2e.ts index e1b4a78..3902392 100644 --- a/src/pages/IssueToken/tests/IssueTokenFormValidation.e2e.ts +++ b/src/pages/IssueToken/tests/IssueTokenFormValidation.e2e.ts @@ -23,6 +23,11 @@ describe('Issue Token form validation test', () => { text: 'Required' }); + await expectElementToContainText({ + dataTestId: DataTestIdsEnum.tokenTickerError, + text: 'Required' + }); + await changeInputText({ dataTestId: DataTestIdsEnum.tokenNameInput, shouldOverride: true, @@ -187,5 +192,21 @@ describe('Issue Token form validation test', () => { dataTestId: DataTestIdsEnum.numDecimalsError, text: 'Must be between 0 - 18' }); + + const tokenNameError = await page.$( + getByDataTestId(DataTestIdsEnum.tokenNameError) + ); + + const tokenTickerError = await page.$( + getByDataTestId(DataTestIdsEnum.tokenTickerError) + ); + + const mintedValueError = await page.$( + getByDataTestId(DataTestIdsEnum.mintedValueError) + ); + + expect(tokenNameError).toEqual(null); + expect(tokenTickerError).toEqual(null); + expect(mintedValueError).toEqual(null); }); }); From 455fafc7418480e0839eead750ffe31e3156249d Mon Sep 17 00:00:00 2001 From: "razvan.tomegea" Date: Thu, 17 Oct 2024 19:48:22 +0300 Subject: [PATCH 2/2] Fixed CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d55833..74d8f72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -- [Added issue collection tests](https://github.com/multiversx/mx-lite-wallet-dapp/pull/58) -- [Added faucet and issue token tests](https://github.com/multiversx/mx-lite-wallet-dapp/pull/57) +- [Added issue collection tests](https://github.com/multiversx/mx-lite-wallet-dapp/pull/59) +- [Added faucet and issue token tests](https://github.com/multiversx/mx-lite-wallet-dapp/pull/58) - [Allow only tokens and collections with prefix to be registered](https://github.com/multiversx/mx-lite-wallet-dapp/pull/56) ## [[1.0.2](https://github.com/multiversx/mx-lite-wallet-dapp/pull/54)] - 2024-10-03