From 71f425f89b518b23203ca7eef174d62f7eefc462 Mon Sep 17 00:00:00 2001 From: Fahrrader Date: Mon, 30 May 2022 13:55:10 +0000 Subject: [PATCH] fix(tests): repair createMultipleItem + ..Ex, remove features made obsolete by properties --- --- a/tests/src/contracts.test.ts +++ b/tests/src/contracts.test.ts @@ -139,9 +139,9 @@ await addToAllowListExpectSuccess(alice, collectionId, bob.address); const transferTx = contract.tx.createMultipleItems(value, gasLimit, bob.address, collectionId, [ - {Nft: {const_data: '0x010203'}}, - {Nft: {const_data: '0x010204'}}, - {Nft: {const_data: '0x010205'}}, + {NFT: {/*const_data: '0x010203'*/}}, + {NFT: {/*const_data: '0x010204'*/}}, + {NFT: {/*const_data: '0x010205'*/}}, ]); const events = await submitTransactionAsync(alice, transferTx); const result = getGenericResult(events); @@ -153,15 +153,15 @@ expect(tokensAfter).to.be.deep.equal([ { Owner: bob.address, - ConstData: '0x010203', + //ConstData: '0x010203', }, { Owner: bob.address, - ConstData: '0x010204', + //ConstData: '0x010204', }, { Owner: bob.address, - ConstData: '0x010205', + //ConstData: '0x010205', }, ]); }); --- a/tests/src/createCollection.test.ts +++ b/tests/src/createCollection.test.ts @@ -63,17 +63,17 @@ const bob = privateKey('//Bob'); const tx = api.tx.unique.createCollectionEx({ mode: {Fungible: 8}, - access: 'AllowList', + //access: 'AllowList', name: [1], description: [2], tokenPrefix: '0x000000', - offchainSchema: '0x111111', - schemaVersion: 'Unique', + //offchainSchema: '0x111111', + //schemaVersion: 'Unique', pendingSponsor: bob.address, limits: { accountTokenOwnershipLimit: 3, }, - constOnChainSchema: '0x333333', + //constOnChainSchema: '0x333333', }); const events = await submitTransactionAsync(alice, tx); const result = getCreateCollectionResult(events); @@ -81,15 +81,15 @@ const collection = (await getDetailedCollectionInfo(api, result.collectionId))!; expect(collection.owner.toString()).to.equal(alice.address); expect(collection.mode.asFungible.toNumber()).to.equal(8); - expect(collection.access.isAllowList).to.be.true; + //expect(collection.access.isAllowList).to.be.true; expect(collection.name.map(v => v.toNumber())).to.deep.equal([1]); expect(collection.description.map(v => v.toNumber())).to.deep.equal([2]); expect(collection.tokenPrefix.toString()).to.equal('0x000000'); - expect(collection.offchainSchema.toString()).to.equal('0x111111'); - expect(collection.schemaVersion.isUnique).to.be.true; + //expect(collection.offchainSchema.toString()).to.equal('0x111111'); + //expect(collection.schemaVersion.isUnique).to.be.true; expect(collection.sponsorship.asUnconfirmed.toString()).to.equal(bob.address); expect(collection.limits.accountTokenOwnershipLimit.unwrap().toNumber()).to.equal(3); - expect(collection.constOnChainSchema.toString()).to.equal('0x333333'); + //expect(collection.constOnChainSchema.toString()).to.equal('0x333333'); }); }); }); --- a/tests/src/createMultipleItems.test.ts +++ b/tests/src/createMultipleItems.test.ts @@ -30,29 +30,34 @@ getBalance, getTokenOwner, getLastTokenId, - getConstMetadata, getCreatedCollectionCount, createCollectionWithPropsExpectSuccess, - getCreateItemsResult, createMultipleItemsWithPropsExpectSuccess, - createMultipleItemsWithPropsExpectFailure, + getTokenProperties, } from './util/helpers'; chai.use(chaiAsPromised); const expect = chai.expect; describe('Integration Test createMultipleItems(collection_id, owner, items_data):', () => { - it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => { + it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionExpectSuccess(); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); + const alice = privateKey('//Alice'); - const args = [{Nft: {const_data: '0x31'}}, - {Nft: {const_data: '0x32'}}, - {Nft: {const_data: '0x33'}}]; - const createMultipleItemsTx = api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + await submitTransactionAsync( + alice, + api.tx.unique.setPropertyPermissions(collectionId, [{key: 'data', permission: {tokenOwner: true}}]) + ); + + const args = [ + {NFT: {properties: [{key: 'data', value: '1'}]}}, + {NFT: {properties: [{key: 'data', value: '2'}]}}, + {NFT: {properties: [{key: 'data', value: '3'}]}} + ]; + const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); await submitTransactionAsync(alice, createMultipleItemsTx); const itemsListIndexAfter = await getLastTokenId(api, collectionId); expect(itemsListIndexAfter).to.be.equal(3); @@ -61,13 +66,13 @@ expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address)); expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address)); - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect((await getTokenProperties(api, collectionId, 1, ['data']))[0].value).to.be.equal('1'); + expect((await getTokenProperties(api, collectionId, 2, ['data']))[0].value).to.be.equal('2'); + expect((await getTokenProperties(api, collectionId, 3, ['data']))[0].value).to.be.equal('3'); }); }); - it('Create 0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => { + it('Create 0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); const itemsListIndexBefore = await getLastTokenId(api, collectionId); @@ -87,16 +92,16 @@ }); }); - it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => { + it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); const alice = privateKey('//Alice'); const args = [ - {ReFungible: {const_data: [0x31], pieces: 1}}, - {ReFungible: {const_data: [0x32], pieces: 1}}, - {ReFungible: {const_data: [0x33], pieces: 1}}, + {ReFungible: {pieces: 1}}, + {ReFungible: {pieces: 2}}, + {ReFungible: {pieces: 3}}, ]; const createMultipleItemsTx = api.tx.unique .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); @@ -105,12 +110,8 @@ expect(itemsListIndexAfter).to.be.equal(3); expect(await getBalance(api, collectionId, alice.address, 1)).to.be.equal(1n); - expect(await getBalance(api, collectionId, alice.address, 2)).to.be.equal(1n); - expect(await getBalance(api, collectionId, alice.address, 3)).to.be.equal(1n); - - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect(await getBalance(api, collectionId, alice.address, 2)).to.be.equal(2n); + expect(await getBalance(api, collectionId, alice.address, 3)).to.be.equal(3n); }); }); @@ -123,8 +124,8 @@ tokenLimit: 2, }); const args = [ - {NFT: {const_data: 'A'}}, - {NFT: {const_data: 'B'}}, + {NFT: {}}, + {NFT: {}}, ]; const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); const events = await submitTransactionAsync(alice, createMultipleItemsTx); @@ -133,16 +134,17 @@ }); }); - it('Create 0x31, 0x32, 0x33 items in active NFT with property Admin', async () => { + it('Create 0x31, 0x32, 0x33 items in active NFT with property Admin', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]}); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); const alice = privateKey('//Alice'); - const bob = privateKey('//Bob'); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}}, - {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}}, - {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}]; + const args = [ + {NFT: {properties: [{key: 'k', value: 'v1'}]}}, + {NFT: {properties: [{key: 'k', value: 'v2'}]}}, + {NFT: {properties: [{key: 'k', value: 'v3'}]}} + ]; await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args); const itemsListIndexAfter = await getLastTokenId(api, collectionId); @@ -152,13 +154,13 @@ expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address)); expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address)); - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect((await getTokenProperties(api, collectionId, 1, ['k']))[0].value).to.be.equal('v1'); + expect((await getTokenProperties(api, collectionId, 2, ['k']))[0].value).to.be.equal('v2'); + expect((await getTokenProperties(api, collectionId, 3, ['k']))[0].value).to.be.equal('v3'); }); }); - it('Create 0x31, 0x32, 0x33 items in active NFT with property AdminConst', async () => { + it('Create 0x31, 0x32, 0x33 items in active NFT with property AdminConst', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: false, collectionAdmin: true, tokenOwner: false}}]}); const itemsListIndexBefore = await getLastTokenId(api, collectionId); @@ -166,9 +168,11 @@ const alice = privateKey('//Alice'); const bob = privateKey('//Bob'); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}}, - {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}}, - {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}]; + const args = [ + {NFT: {properties: [{key: 'k', value: 'v1'}]}}, + {NFT: {properties: [{key: 'k', value: 'v2'}]}}, + {NFT: {properties: [{key: 'k', value: 'v3'}]}} + ]; await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args); const itemsListIndexAfter = await getLastTokenId(api, collectionId); @@ -178,22 +182,25 @@ expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address)); expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address)); - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect((await getTokenProperties(api, collectionId, 1, ['k']))[0].value).to.be.equal('v1'); + expect((await getTokenProperties(api, collectionId, 2, ['k']))[0].value).to.be.equal('v2'); + expect((await getTokenProperties(api, collectionId, 3, ['k']))[0].value).to.be.equal('v3'); }); }); - it('Create 0x31, 0x32, 0x33 items in active NFT with property itemOwnerOrAdmin', async () => { + it('Create 0x31, 0x32, 0x33 items in active NFT with property itemOwnerOrAdmin', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]}); + const collectionId = await createCollectionWithPropsExpectSuccess( + {propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]} + ); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); const alice = privateKey('//Alice'); - const bob = privateKey('//Bob'); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v1'}]}}, - {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'v2'}]}}, - {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'v3'}]}}]; + const args = [ + {NFT: {properties: [{key: 'k', value: 'v1'}]}}, + {NFT: {properties: [{key: 'k', value: 'v2'}]}}, + {NFT: {properties: [{key: 'k', value: 'v3'}]}} + ]; await createMultipleItemsWithPropsExpectSuccess(alice, collectionId, args); const itemsListIndexAfter = await getLastTokenId(api, collectionId); @@ -203,15 +210,14 @@ expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(alice.address)); expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(alice.address)); - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect((await getTokenProperties(api, collectionId, 1, ['k']))[0].value).to.be.equal('v1'); + expect((await getTokenProperties(api, collectionId, 2, ['k']))[0].value).to.be.equal('v2'); + expect((await getTokenProperties(api, collectionId, 3, ['k']))[0].value).to.be.equal('v3'); }); }); }); describe('Integration Test createMultipleItems(collection_id, owner, items_data) with collection admin permissions:', () => { - let alice: IKeyringPair; let bob: IKeyringPair; @@ -222,15 +228,19 @@ }); }); - it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => { + it('Create 0x31, 0x32, 0x33 items in active NFT collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionExpectSuccess(); + const collectionId = await createCollectionWithPropsExpectSuccess( + {propPerm: [{key: 'data', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]} + ); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - const args = [{Nft: {const_data: '0x31'}}, - {Nft: {const_data: '0x32'}}, - {Nft: {const_data: '0x33'}}]; + const args = [ + {NFT: {properties: [{key: 'data', value: 'v1'}]}}, + {NFT: {properties: [{key: 'data', value: 'v2'}]}}, + {NFT: {properties: [{key: 'data', value: 'v3'}]}} + ]; const createMultipleItemsTx = api.tx.unique .createMultipleItems(collectionId, normalizeAccountId(bob.address), args); await submitTransactionAsync(bob, createMultipleItemsTx); @@ -241,13 +251,13 @@ expect(await getTokenOwner(api, collectionId, 2)).to.be.deep.equal(normalizeAccountId(bob.address)); expect(await getTokenOwner(api, collectionId, 3)).to.be.deep.equal(normalizeAccountId(bob.address)); - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect((await getTokenProperties(api, collectionId, 1, ['data']))[0].value).to.be.equal('v1'); + expect((await getTokenProperties(api, collectionId, 2, ['data']))[0].value).to.be.equal('v2'); + expect((await getTokenProperties(api, collectionId, 3, ['data']))[0].value).to.be.equal('v3'); }); }); - it('Create 0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => { + it('Create 0x01, 0x02, 0x03 items in active Fungible collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}}); const itemsListIndexBefore = await getLastTokenId(api, collectionId); @@ -267,16 +277,16 @@ }); }); - it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => { + it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}}); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); const args = [ - {ReFungible: {const_data: [0x31], pieces: 1}}, - {ReFungible: {const_data: [0x32], pieces: 1}}, - {ReFungible: {const_data: [0x33], pieces: 1}}, + {ReFungible: {pieces: 1}}, + {ReFungible: {pieces: 2}}, + {ReFungible: {pieces: 3}}, ]; const createMultipleItemsTx = api.tx.unique .createMultipleItems(collectionId, normalizeAccountId(bob.address), args); @@ -285,18 +295,13 @@ expect(itemsListIndexAfter).to.be.equal(3); expect(await getBalance(api, collectionId, bob.address, 1)).to.be.equal(1n); - expect(await getBalance(api, collectionId, bob.address, 2)).to.be.equal(1n); - expect(await getBalance(api, collectionId, bob.address, 3)).to.be.equal(1n); - - expect(await getConstMetadata(api, collectionId, 1)).to.be.deep.equal([0x31]); - expect(await getConstMetadata(api, collectionId, 2)).to.be.deep.equal([0x32]); - expect(await getConstMetadata(api, collectionId, 3)).to.be.deep.equal([0x33]); + expect(await getBalance(api, collectionId, bob.address, 2)).to.be.equal(2n); + expect(await getBalance(api, collectionId, bob.address, 3)).to.be.equal(3n); }); }); }); describe('Negative Integration Test createMultipleItems(collection_id, owner, items_data):', () => { - let alice: IKeyringPair; let bob: IKeyringPair; @@ -312,12 +317,11 @@ const collectionId = await createCollectionExpectSuccess(); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); - const args = [{Nft: {const_data: '0x31'}}, - {Nft: {const_data: '0x32'}}, - {Nft: {const_data: '0x33'}}]; - const createMultipleItemsTx = api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); - await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected; + const args = [{NFT: {}}, + {NFT: {}}, + {NFT: {}}]; + const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + await expect(executeTransaction(api, bob, createMultipleItemsTx)).to.be.rejectedWith(/common\.PublicMintingNotAllowed/); }); }); @@ -331,9 +335,8 @@ {Fungible: {value: 2}}, {Fungible: {value: 3}}, ]; - const createMultipleItemsTx = api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); - await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected; + const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + await expect(executeTransaction(api, bob, createMultipleItemsTx)).to.be.rejectedWith(/common\.PublicMintingNotAllowed/); }); }); @@ -343,37 +346,38 @@ const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); const args = [ - {ReFungible: {const_data: [0x31], pieces: 1}}, - {ReFungible: {const_data: [0x32], pieces: 1}}, - {ReFungible: {const_data: [0x33], pieces: 1}}, + {ReFungible: {pieces: 1}}, + {ReFungible: {pieces: 1}}, + {ReFungible: {pieces: 1}}, ]; - const createMultipleItemsTx = api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); - await expect(submitTransactionAsync(bob, createMultipleItemsTx)).to.be.rejected; + const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + await expect(executeTransaction(api, bob, createMultipleItemsTx)).to.be.rejectedWith(/common\.PublicMintingNotAllowed/); }); }); it('Create token in not existing collection', async () => { await usingApi(async (api: ApiPromise) => { const collectionId = await getCreatedCollectionCount(api) + 1; - const createMultipleItemsTx = api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'NFT', 'NFT']); - await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected; + const createMultipleItemsTx = api.tx.unique.createMultipleItems( + collectionId, normalizeAccountId(alice.address), ['NFT', 'NFT', 'NFT'] + ); + await expect(executeTransaction(api, alice, createMultipleItemsTx)).to.be.rejectedWith(/common\.CollectionNotFound/); }); }); it('Create NFT and Re-fungible tokens that has reached the maximum data limit', async () => { await usingApi(async (api: ApiPromise) => { // NFT - const collectionId = await createCollectionExpectSuccess(); + const collectionId = await createCollectionWithPropsExpectSuccess({ + propPerm: [{key: 'key', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}] + }); const alice = privateKey('//Alice'); const args = [ - {NFT: {const_data: 'A'.repeat(2049)}}, - {NFT: {const_data: 'B'.repeat(2049)}}, - {NFT: {const_data: 'C'.repeat(2049)}}, + {NFT: {properties: [{key: 'key', value: 'A'.repeat(32769)}]}}, + {NFT: {properties: [{key: 'key', value: 'B'.repeat(32769)}]}}, + {NFT: {properties: [{key: 'key', value: 'C'.repeat(32769)}]}}, ]; - const createMultipleItemsTx = api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected; // ReFungible @@ -395,68 +399,61 @@ const collectionId = await createCollectionExpectSuccess(); const createMultipleItemsTx = api.tx.unique .createMultipleItems(collectionId, normalizeAccountId(alice.address), ['NFT', 'Fungible', 'ReFungible']); - await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected; - // garbage collection :-D + await expect( + executeTransaction(api, alice, createMultipleItemsTx) + ).to.be.rejectedWith( + /nonfungible\.NotNonfungibleDataUsedToMintFungibleCollectionToken/ + ); + // garbage collection :-D // lol await destroyCollectionExpectSuccess(collectionId); }); }); it('Create tokens with different data limits <> maximum data limit', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionExpectSuccess(); + const collectionId = await createCollectionWithPropsExpectSuccess({ + propPerm: [{key: 'key', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}] + }); const args = [ - {NFT: {const_data: 'A'}}, - {NFT: {const_data: 'B'.repeat(2049)}}, + {NFT: {properties: [{key: 'key', value: 'A'}]}}, + {NFT: {properties: [{key: 'key', value: 'B'.repeat(32769)}]}}, ]; - const createMultipleItemsTx = await api.tx.unique - .createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected; }); }); it('Fails when minting tokens exceeds collectionLimits amount', async () => { await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); await setCollectionLimitsExpectSuccess(alice, collectionId, { tokenLimit: 1, }); const args = [ - {NFT: {const_data: 'A'}}, - {NFT: {const_data: 'B'}}, + {NFT: {}}, + {NFT: {}}, ]; const createMultipleItemsTx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); - await expect(submitTransactionExpectFailAsync(alice, createMultipleItemsTx)).to.be.rejected; - }); - }); - - it('No editing rights', async () => { - await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}], - propPerm: [{key: 'key1', permission: {mutable: false, collectionAdmin: false, tokenOwner: true}}]}); - const itemsListIndexBefore = await getLastTokenId(api, collectionId); - expect(itemsListIndexBefore).to.be.equal(0); - await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'key1', value: 'v2'}]}}, - {Nft: {const_data: '0x32'}}, - {Nft: {const_data: '0x33'}}]; - - await createMultipleItemsWithPropsExpectFailure(bob, collectionId, args); + await expect(executeTransaction(api, alice, createMultipleItemsTx)).to.be.rejectedWith(/common\.CollectionTokenLimitExceeded/); }); }); it('User doesnt have editing rights', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}], - propPerm: [{key: 'key1', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}]}); + const collectionId = await createCollectionWithPropsExpectSuccess({ + propPerm: [{key: 'key1', permission: {mutable: true, collectionAdmin: false, tokenOwner: false}}] + }); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'key1', value: 'v2'}]}}, - {Nft: {const_data: '0x32'}}, - {Nft: {const_data: '0x33'}}]; + const args = [ + {NFT: {properties: [{key: 'key1', value: 'v2'}]}}, + {NFT: {}}, + {NFT: {}} + ]; - await createMultipleItemsWithPropsExpectFailure(bob, collectionId, args); + const tx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(bob.address), args); + await expect(executeTransaction(api, bob, tx)).to.be.rejectedWith(/common\.NoPermission/); }); }); @@ -466,18 +463,27 @@ const itemsListIndexBefore = await getLastTokenId(api, collectionId); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); expect(itemsListIndexBefore).to.be.equal(0); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'v'}]}}, - {Nft: {const_data: '0x32'}}, - {Nft: {const_data: '0x33'}}]; + const args = [{NFT: {properties: [{key: 'k', value: 'v'}]}}, + {NFT: {}}, + {NFT: {}}]; - await createMultipleItemsWithPropsExpectFailure(bob, collectionId, args); + const tx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(bob.address), args); + await expect(executeTransaction(api, bob, tx)).to.be.rejectedWith(/common\.NoPermission/); }); }); it('Adding more than 64 prps', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionWithPropsExpectSuccess({properties: [{key: 'key1', value: 'v'}], - propPerm: [{key: 'key1', permission: {mutable: true, collectionAdmin: true, tokenOwner: false}}]}); + const propPerms = [{key: 'key', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]; + for (let i = 0; i < 65; i++) { + propPerms.push({key: `key${i}`, permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}); + } + + const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); + + const tx1 = api.tx.unique.setPropertyPermissions(collectionId, propPerms); + await expect(executeTransaction(api, alice, tx1)).to.be.rejectedWith(/common\.PropertyLimitReached/); + const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); @@ -488,24 +494,31 @@ prps.push({key: `key${i}`, value: `value${i}`}); } - const args = [{Nft: {const_data: '0x31', properties: prps}}, - {Nft: {const_data: '0x32', properties: prps}}, - {Nft: {const_data: '0x33', properties: prps}}]; + const args = [ + {NFT: {properties: prps}}, + {NFT: {properties: prps}}, + {NFT: {properties: prps}} + ]; - createMultipleItemsWithPropsExpectFailure(alice, collectionId, args); + // there are no permissions, but will fail anyway because of too much weight for a block + const tx2 = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args);; + await expect(submitTransactionExpectFailAsync(alice, tx2)).to.be.rejected; }); }); it('Trying to add bigger property than allowed', async () => { await usingApi(async (api: ApiPromise) => { - const collectionId = await createCollectionWithPropsExpectSuccess({propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]}); + const collectionId = await createCollectionWithPropsExpectSuccess({ + propPerm: [{key: 'k', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}] + }); const itemsListIndexBefore = await getLastTokenId(api, collectionId); expect(itemsListIndexBefore).to.be.equal(0); - const args = [{Nft: {const_data: '0x31', properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}, - {Nft: {const_data: '0x32', properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}, - {Nft: {const_data: '0x33', properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}]; + const args = [{NFT: {properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}, + {NFT: {properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}, + {NFT: {properties: [{key: 'k', value: 'vvvvvv'.repeat(5000)}, {key: 'k2', value: 'vvv'.repeat(5000)}]}}]; - createMultipleItemsWithPropsExpectFailure(alice, collectionId, args); + const tx = api.tx.unique.createMultipleItems(collectionId, normalizeAccountId(alice.address), args); + await expect(executeTransaction(api, alice, tx)).to.be.rejectedWith(/common\.NoPermission/); }); }); }); --- a/tests/src/createMultipleItemsEx.test.ts +++ b/tests/src/createMultipleItemsEx.test.ts @@ -29,13 +29,13 @@ const data = [ { owner: {substrate: alice.address}, - constData: '0x0000', + // constData: '0x0000', }, { owner: {substrate: bob.address}, - constData: '0x2222', + // constData: '0x2222', }, { owner: {substrate: charlie.address}, - constData: '0x4444', + // constData: '0x4444', }, ]; @@ -57,15 +57,15 @@ const data = [ { owner: {substrate: alice.address}, - constData: '0x1111', + // constData: '0x1111', properties: [{key: 'k', value: 'v1'}], }, { owner: {substrate: bob.address}, - constData: '0x2222', + // constData: '0x2222', properties: [{key: 'k', value: 'v2'}], }, { owner: {substrate: charlie.address}, - constData: '0x4444', + // constData: '0x4444', properties: [{key: 'k', value: 'v3'}], }, ]; @@ -88,15 +88,15 @@ const data = [ { owner: {substrate: alice.address}, - constData: '0x0000', + // constData: '0x0000', properties: [{key: 'k', value: 'v1'}], }, { owner: {substrate: bob.address}, - constData: '0x2222', + // constData: '0x2222', properties: [{key: 'k', value: 'v2'}], }, { owner: {substrate: charlie.address}, - constData: '0x4444', + // constData: '0x4444', properties: [{key: 'k', value: 'v3'}], }, ]; @@ -119,15 +119,15 @@ const data = [ { owner: {substrate: alice.address}, - constData: '0x0000', + // constData: '0x0000', properties: [{key: 'k', value: 'v1'}], }, { owner: {substrate: bob.address}, - constData: '0x2222', + // constData: '0x2222', properties: [{key: 'k', value: 'v2'}], }, { owner: {substrate: charlie.address}, - constData: '0x4444', + // constData: '0x4444', properties: [{key: 'k', value: 'v3'}], }, ]; @@ -154,10 +154,10 @@ owner: {substrate: alice.address}, properties: [{key: 'key1', value: 'v2'}], }, { - owner: {substrate: alice.address}, + owner: {substrate: bob.address}, properties: [{key: 'key1', value: 'v2'}], }, { - owner: {substrate: alice.address}, + owner: {substrate: charlie.address}, properties: [{key: 'key1', value: 'v2'}], }, ]; @@ -165,7 +165,8 @@ const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data}); // await executeTransaction(api, alice, tx); - await submitTransactionExpectFailAsync(alice, tx); + //await submitTransactionExpectFailAsync(alice, tx); + await expect(executeTransaction(api, alice, tx)).to.be.rejectedWith(/common\.NoPermission/); }); }); @@ -193,7 +194,8 @@ const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data}); // await executeTransaction(api, alice, tx); - await submitTransactionExpectFailAsync(alice, tx); + //await submitTransactionExpectFailAsync(alice, tx); + await expect(executeTransaction(api, alice, tx)).to.be.rejectedWith(/common\.NoPermission/); }); }); @@ -219,41 +221,24 @@ const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data}); - await submitTransactionExpectFailAsync(alice, tx); + await expect(executeTransaction(api, alice, tx)).to.be.rejectedWith(/common\.NoPermission/); + //await submitTransactionExpectFailAsync(alice, tx); }); }); - it('Adding more than 64 prps', async () => { - const prps = [{key: 'key', value: 'v'}]; - const propPerm = [{key: 'key', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]; + it('Adding more than 64 properties', async () => { + const propPerms = [{key: 'key', permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}]; for (let i = 0; i < 65; i++) { - prps.push({key: `key${i}`, value: `value${i}`}); - propPerm.push({key: `key${i}`, permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}); + propPerms.push({key: `key${i}`, permission: {mutable: true, collectionAdmin: true, tokenOwner: true}}); } - const collection = await createCollectionWithPropsExpectSuccess({propPerm: propPerm}); const alice = privateKey('//Alice'); - const bob = privateKey('//Bob'); - const charlie = privateKey('//Charlie'); - await addCollectionAdminExpectSuccess(alice, collection, bob.address); + const collection = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); await usingApi(async (api) => { - const data = [ - { - owner: {substrate: alice.address}, - properties: prps, - }, { - owner: {substrate: alice.address}, - properties: prps, - }, { - owner: {substrate: alice.address}, - properties: prps, - }, - ]; - - const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data}); - - await submitTransactionExpectFailAsync(alice, tx); + await expect( + executeTransaction(api, alice, api.tx.unique.setPropertyPermissions(collection, propPerms)) + ).to.be.rejectedWith(/common\.PropertyLimitReached/); }); }); @@ -276,7 +261,8 @@ const tx = api.tx.unique.createMultipleItemsEx(collection, {NFT: data}); - await submitTransactionExpectFailAsync(alice, tx); + //await submitTransactionExpectFailAsync(alice, tx); + await expect(executeTransaction(api, alice, tx)).to.be.rejectedWith(/common\.NoPermission/); }); }); @@ -289,13 +275,13 @@ const data = [ { owner: {substrate: alice.address}, - constData: '0x0000', + // constData: '0x0000', }, { owner: {substrate: bob.address}, - constData: '0x2222', + // constData: '0x2222', }, { owner: {substrate: charlie.address}, - constData: '0x4444', + // constData: '0x4444', }, ]; @@ -317,13 +303,13 @@ const data = [ { owner: {substrate: alice.address}, - constData: '0x0000', + // constData: '0x0000', }, { owner: {substrate: bob.address}, - constData: '0x2222', + // constData: '0x2222', }, { owner: {substrate: charlie.address}, - constData: '0x4444', + // constData: '0x4444', }, ]; --- a/tests/src/nesting/properties.test.ts +++ b/tests/src/nesting/properties.test.ts @@ -792,7 +792,7 @@ ]), )).to.be.rejectedWith(/common\.NoSpaceForProperty/); - expect((await api.rpc.unique.tokenProperties(collection, token, ['a_holy_book', 'young years'])).toJSON()).to.be.empty; + expect((await api.rpc.unique.tokenProperties(collection, token, ['a_holy_book', 'young_years'])).toJSON()).to.be.empty; const propertiesMap = (await api.query.nonfungible.tokenProperties(collection, token)).toJSON(); expect(propertiesMap.consumedSpace).to.be.equal(originalSpace); }); --- a/tests/src/setConstOnChainSchema.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// This file is part of Unique Network. - -// Unique Network is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Unique Network is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Unique Network. If not, see . - -import {Keyring} from '@polkadot/api'; -import {IKeyringPair} from '@polkadot/types/types'; -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import {default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api'; -import { - createCollectionExpectSuccess, - destroyCollectionExpectSuccess, - addCollectionAdminExpectSuccess, - queryCollectionExpectSuccess, - getCreatedCollectionCount, -} from './util/helpers'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -let alice: IKeyringPair; -let bob: IKeyringPair; -let schema: any; -let largeSchema: any; - -before(async () => { - await usingApi(async () => { - const keyring = new Keyring({type: 'sr25519'}); - alice = keyring.addFromUri('//Alice'); - bob = keyring.addFromUri('//Bob'); - schema = '0x31'; - largeSchema = new Array(1024 * 1024 + 10).fill(0xff); - }); -}); -describe('Integration Test ext. setConstOnChainSchema()', () => { - - it('Run extrinsic with parameters of the collection id, set the scheme', async () => { - await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); - const collection = await queryCollectionExpectSuccess(api, collectionId); - expect(collection.owner.toString()).to.be.eq(alice.address); - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, schema); - await submitTransactionAsync(alice, setSchema); - }); - }); - - it('Collection admin can set the scheme', async () => { - await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); - const collection = await queryCollectionExpectSuccess(api, collectionId); - expect(collection.owner.toString()).to.be.eq(alice.address); - await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, schema); - await submitTransactionAsync(bob, setSchema); - }); - }); - - it('Checking collection data using the ConstOnChainSchema parameter', async () => { - await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, schema); - await submitTransactionAsync(alice, setSchema); - const collection = await queryCollectionExpectSuccess(api, collectionId); - expect(collection.constOnChainSchema.toString()).to.be.eq(schema); - }); - }); -}); - -describe('Negative Integration Test ext. setConstOnChainSchema()', () => { - - it('Set a non-existent collection', async () => { - await usingApi(async (api) => { - // tslint:disable-next-line: radix - const collectionId = await getCreatedCollectionCount(api) + 1; - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, schema); - await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected; - }); - }); - - it('Set a previously deleted collection', async () => { - await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); - await destroyCollectionExpectSuccess(collectionId); - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, schema); - await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected; - }); - }); - - it('Set invalid data in schema (size too large:> 1MB)', async () => { - await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, largeSchema); - await expect(submitTransactionExpectFailAsync(alice, setSchema)).to.be.rejected; - }); - }); - - it('Execute method not on behalf of the collection owner', async () => { - await usingApi(async (api) => { - const collectionId = await createCollectionExpectSuccess(); - const collection = await queryCollectionExpectSuccess(api, collectionId); - expect(collection.owner.toString()).to.be.eq(alice.address); - const setSchema = api.tx.unique.setConstOnChainSchema(collectionId, schema); - await expect(submitTransactionExpectFailAsync(bob, setSchema)).to.be.rejected; - }); - }); - -}); --- a/tests/src/setOffchainSchema.test.ts +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// This file is part of Unique Network. - -// Unique Network is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Unique Network is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Unique Network. If not, see . - -import {IKeyringPair} from '@polkadot/types/types'; -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import privateKey from './substrate/privateKey'; -import usingApi from './substrate/substrate-api'; -import { - createCollectionExpectSuccess, - destroyCollectionExpectSuccess, - findNotExistingCollection, - queryCollectionExpectSuccess, - setOffchainSchemaExpectFailure, - setOffchainSchemaExpectSuccess, - addCollectionAdminExpectSuccess, -} from './util/helpers'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -const DATA = [1, 2, 3, 4]; - -describe('Integration Test setOffchainSchema', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - before(async () => { - await usingApi(async () => { - alice = privateKey('//Alice'); - bob = privateKey('//Bob'); - }); - }); - - it('execute setOffchainSchema, verify data was set', async () => { - await usingApi(async api => { - const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); - await setOffchainSchemaExpectSuccess(alice, collectionId, DATA); - const collection = await queryCollectionExpectSuccess(api, collectionId); - - expect('0x' + Buffer.from(collection.offchainSchema).toString('hex')).to.be.equal('0x' + Buffer.from(DATA).toString('hex')); - }); - }); - - it('execute setOffchainSchema (collection admin), verify data was set', async () => { - await usingApi(async api => { - const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); - await addCollectionAdminExpectSuccess(alice, collectionId, bob.address); - await setOffchainSchemaExpectSuccess(bob, collectionId, DATA); - const collection = await queryCollectionExpectSuccess(api, collectionId); - - expect('0x' + Buffer.from(collection.offchainSchema).toString('hex')).to.be.equal('0x' + Buffer.from(DATA).toString('hex')); - }); - }); -}); - -describe('Negative Integration Test setOffchainSchema', () => { - let alice: IKeyringPair; - let bob: IKeyringPair; - - let validCollectionId: number; - - before(async () => { - await usingApi(async () => { - alice = privateKey('//Alice'); - bob = privateKey('//Bob'); - - validCollectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); - }); - }); - - it('fails on not existing collection id', async () => { - const nonExistingCollectionId = await usingApi(findNotExistingCollection); - - await setOffchainSchemaExpectFailure(alice, nonExistingCollectionId, DATA); - }); - - it('fails on destroyed collection id', async () => { - const destroyedCollectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}}); - await destroyCollectionExpectSuccess(destroyedCollectionId); - - await setOffchainSchemaExpectFailure(alice, destroyedCollectionId, DATA); - }); - - it('fails on too long data', async () => { - const tooLongData = new Array(8 * 1024 + 10).fill(0xff); - - await setOffchainSchemaExpectFailure(alice, validCollectionId, tooLongData); - }); - - it('fails on execution by non-owner', async () => { - await setOffchainSchemaExpectFailure(bob, validCollectionId, DATA); - }); -}); --- a/tests/src/setSchemaVersion.test.ts +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2019-2022 Unique Network (Gibraltar) Ltd. -// This file is part of Unique Network. - -// Unique Network is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Unique Network is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Unique Network. If not, see . - -// https://unique-network.readthedocs.io/en/latest/jsapi.html#setschemaversion -import {ApiPromise, Keyring} from '@polkadot/api'; -import {IKeyringPair} from '@polkadot/types/types'; -import chai from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import usingApi, {submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api'; -import { - createCollectionExpectSuccess, - destroyCollectionExpectSuccess, - getCreatedCollectionCount, - getCreateItemResult, - getDetailedCollectionInfo, - addCollectionAdminExpectSuccess, -} from './util/helpers'; - -chai.use(chaiAsPromised); -const expect = chai.expect; - -let alice: IKeyringPair; -let bob: IKeyringPair; -let charlie: IKeyringPair; - -/* -1. We create collection. -2. Save just created collection id. -3. Use this id for setSchemaVersion. -*/ -describe('setSchemaVersion positive', () => { - let tx; - before(async () => { - await usingApi(async () => { - const keyring = new Keyring({type: 'sr25519'}); - alice = keyring.addFromUri('//Alice'); - }); - }); - it('execute setSchemaVersion with image url and unique ', async () => { - await usingApi(async (api: ApiPromise) => { - const collectionIdForTesting = await createCollectionExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'NFT'}}); - tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'Unique'); - const events = await submitTransactionAsync(alice, tx); - const result = getCreateItemResult(events); - const collectionInfo = await getDetailedCollectionInfo(api, collectionIdForTesting); - // tslint:disable-next-line:no-unused-expression - expect(result.success).to.be.true; - // tslint:disable-next-line:no-unused-expression - expect(collectionInfo).to.be.exist; - // tslint:disable-next-line:no-unused-expression - expect(collectionInfo ? collectionInfo.schemaVersion.toString() : '').to.be.equal('Unique'); - }); - }); -}); - -describe('Collection admin setSchemaVersion positive', () => { - let tx; - let collectionIdForTesting: any; - - before(async () => { - await usingApi(async () => { - const keyring = new Keyring({type: 'sr25519'}); - alice = keyring.addFromUri('//Alice'); - bob = keyring.addFromUri('//Bob'); - collectionIdForTesting = await createCollectionExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'NFT'}}); - await addCollectionAdminExpectSuccess(alice, collectionIdForTesting, bob.address); - }); - }); - it('execute setSchemaVersion with image url and unique ', async () => { - await usingApi(async (api: ApiPromise) => { - tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'Unique'); - const events = await submitTransactionAsync(bob, tx); - const result = getCreateItemResult(events); - const collectionInfo = await getDetailedCollectionInfo(api, collectionIdForTesting); - // tslint:disable-next-line:no-unused-expression - expect(result.success).to.be.true; - // tslint:disable-next-line:no-unused-expression - expect(collectionInfo).to.be.exist; - // tslint:disable-next-line:no-unused-expression - expect(collectionInfo ? collectionInfo.schemaVersion.toString() : '').to.be.equal('Unique'); - }); - }); - - it('validate schema version with just entered data', async () => { - await usingApi(async (api: ApiPromise) => { - tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'ImageURL'); - const events = await submitTransactionAsync(bob, tx); - const result = getCreateItemResult(events); - const collectionInfo = await getDetailedCollectionInfo(api, collectionIdForTesting); - // tslint:disable-next-line:no-unused-expression - expect(result.success).to.be.true; - // tslint:disable-next-line:no-unused-expression - expect(collectionInfo).to.be.exist; - // tslint:disable-next-line:no-unused-expression - expect(collectionInfo ? collectionInfo.schemaVersion.toString() : '').to.be.equal('ImageURL'); - }); - }); -}); - -describe('setSchemaVersion negative', () => { - let tx; - let collectionIdForTesting: any; - before(async () => { - await usingApi(async () => { - const keyring = new Keyring({type: 'sr25519'}); - alice = keyring.addFromUri('//Alice'); - charlie = keyring.addFromUri('//Charlie'); - collectionIdForTesting = await createCollectionExpectSuccess({name: 'A', description: 'B', tokenPrefix: 'C', mode: {type: 'NFT'}}); - }); - }); - it('execute setSchemaVersion for not exists collection', async () => { - await usingApi(async (api: ApiPromise) => { - const collectionCount = await getCreatedCollectionCount(api); - const nonExistedCollectionId = collectionCount + 1; - tx = api.tx.unique.setSchemaVersion(nonExistedCollectionId, 'ImageURL'); - await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected; - }); - }); - it('execute setSchemaVersion for deleted collection', async () => { - await usingApi(async (api: ApiPromise) => { - await destroyCollectionExpectSuccess(collectionIdForTesting); - tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'ImageURL'); - await expect(submitTransactionExpectFailAsync(alice, tx)).to.be.rejected; - }); - }); - it('Regular user can`t execute setSchemaVersion with image url and unique ', async () => { - await usingApi(async (api: ApiPromise) => { - tx = api.tx.unique.setSchemaVersion(collectionIdForTesting, 'Unique'); - await expect(submitTransactionAsync(charlie, tx)).to.be.rejected; - }); - }); -}); --- a/tests/src/util/helpers.ts +++ b/tests/src/util/helpers.ts @@ -27,7 +27,7 @@ import privateKey from '../substrate/privateKey'; import {default as usingApi, executeTransaction, submitTransactionAsync, submitTransactionExpectFailAsync} from '../substrate/substrate-api'; import {hexToStr, strToUTF16, utf16ToStr} from './util'; -import {UpDataStructsRpcCollection, UpDataStructsCreateItemData} from '@polkadot/types/lookup'; +import {UpDataStructsRpcCollection, UpDataStructsCreateItemData, UpDataStructsProperty} from '@polkadot/types/lookup'; chai.use(chaiAsPromised); const expect = chai.expect; @@ -141,7 +141,6 @@ export interface IReFungibleTokenDataType { owner: IReFungibleOwner[]; - constData: number[]; } export function uniqueEventMessage(events: EventRecord[]): IGetMessage { @@ -784,7 +783,7 @@ }); } -export async function setOffchainSchemaExpectSuccess(sender: IKeyringPair, collectionId: number, data: number[]) { +/*export async function setOffchainSchemaExpectSuccess(sender: IKeyringPair, collectionId: number, data: number[]) { await usingApi(async (api) => { const tx = api.tx.unique.setOffchainSchema(collectionId, '0x' + Buffer.from(data).toString('hex')); const events = await submitTransactionAsync(sender, tx); @@ -799,7 +798,7 @@ const tx = api.tx.unique.setOffchainSchema(collectionId, '0x' + Buffer.from(data).toString('hex')); await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected; }); -} +}*/ export interface CreateFungibleData { readonly Value: bigint; @@ -1111,12 +1110,20 @@ ): Promise { return (await api.rpc.unique.adminlist(collectionId)).toHuman() as any; } -export async function getConstMetadata( +/*export async function getConstMetadata( api: ApiPromise, collectionId: number, tokenId: number, ): Promise { return [...(await api.rpc.unique.constMetadata(collectionId, tokenId))]; +}*/ +export async function getTokenProperties( + api: ApiPromise, + collectionId: number, + tokenId: number, + propertyKeys: string[], +): Promise { + return (await api.rpc.unique.tokenProperties(collectionId, tokenId, propertyKeys)).toHuman() as any; } export async function createFungibleItemExpectSuccess( @@ -1150,18 +1157,6 @@ }); } -export async function createMultipleItemsWithPropsExpectFailure(sender: IKeyringPair, collectionId: number, itemsData: any, owner: CrossAccountId | string = sender.address) { - await usingApi(async (api) => { - const to = normalizeAccountId(owner); - const tx = api.tx.unique.createMultipleItems(collectionId, to, itemsData); - - const events = await expect(await submitTransactionExpectFailAsync(sender, tx)).to.be.rejected; - const result = getCreateItemsResult(events); - - expect(result).to.be.equal(false); - }); -} - export async function createMultipleItemsExWithPropsExpectSuccess(sender: IKeyringPair, collectionId: number, itemsData: any) { await usingApi(async (api) => { const tx = api.tx.unique.createMultipleItemsEx(collectionId, itemsData); @@ -1187,10 +1182,10 @@ const createData = {fungible: {value: 10}}; tx = api.tx.unique.createItem(collectionId, to, createData as any); } else if (createMode === 'ReFungible') { - const createData = {refungible: {const_data: [], pieces: 100}}; + const createData = {refungible: {pieces: 100}}; tx = api.tx.unique.createItem(collectionId, to, createData as any); } else { - const data = api.createType('UpDataStructsCreateItemData', {NFT: {constData: 'test', properties: props}}); + const data = api.createType('UpDataStructsCreateItemData', {NFT: {properties: props}}); tx = api.tx.unique.createItem(collectionId, to, data as UpDataStructsCreateItemData); } @@ -1225,7 +1220,7 @@ let tx; if (createMode === 'NFT') { - const data = api.createType('UpDataStructsCreateItemData', {NFT: {constData: 'test', properties: props}}); + const data = api.createType('UpDataStructsCreateItemData', {NFT: {properties: props}}); tx = api.tx.unique.createItem(collectionId, normalizeAccountId(owner), data); } else { tx = api.tx.unique.createItem(collectionId, normalizeAccountId(owner), createMode); @@ -1251,10 +1246,10 @@ const createData = {fungible: {value: 10}}; tx = api.tx.unique.createItem(collectionId, to, createData as any); } else if (createMode === 'ReFungible') { - const createData = {refungible: {const_data: [], pieces: 100}}; + const createData = {refungible: {pieces: 100}}; tx = api.tx.unique.createItem(collectionId, to, createData as any); } else { - const createData = {nft: {const_data: []}}; + const createData = {nft: {}}; tx = api.tx.unique.createItem(collectionId, to, createData as any); } -- gitstuff