1234567891011121314151617import {usingPlaygrounds, expect, itSub, Pallets} from './util/playgrounds';18import {IKeyringPair} from '@polkadot/types/types';19import {ICollectionCreationOptions, IProperty} from './util/playgrounds/types';20import {DevUniqueHelper} from './util/playgrounds/unique.dev';2122async function mintCollectionHelper(helper: DevUniqueHelper, signer: IKeyringPair, options: ICollectionCreationOptions, type?: 'nft' | 'fungible' | 'refungible') {23 let collection;24 if (type === 'nft') {25 collection = await helper.nft.mintCollection(signer, options);26 } else if (type === 'fungible') {27 collection = await helper.ft.mintCollection(signer, options, 0);28 } else {29 collection = await helper.rft.mintCollection(signer, options);30 }31 const data = await collection.getData();32 expect(data?.normalizedOwner).to.be.equal(signer.address);33 expect(data?.name).to.be.equal(options.name);34 expect(data?.description).to.be.equal(options.description);35 expect(data?.raw.tokenPrefix).to.be.equal(options.tokenPrefix);36 if (options.properties) {37 expect(data?.raw.properties).to.be.deep.equal(options.properties);38 }3940 if (options.tokenPropertyPermissions) {41 expect(data?.raw.tokenPropertyPermissions).to.be.deep.equal(options.tokenPropertyPermissions);42 }4344 return collection;45}4647describe('integration test: ext. createCollection():', () => {48 let alice: IKeyringPair;4950 before(async () => {51 await usingPlaygrounds(async (helper, privateKey) => {52 const donor = privateKey('//Alice');53 [alice] = await helper.arrange.createAccounts([100n], donor);54 });55 });56 itSub('Create new NFT collection', async ({helper}) => {5758 await mintCollectionHelper(helper, alice, {name: 'col', description: 'descr', tokenPrefix: 'COL'}, 'nft');59 });60 itSub('Create new NFT collection whith collection_name of maximum length (64 bytes)', async ({helper}) => {6162 await mintCollectionHelper(helper, alice, {name: 'A'.repeat(64), description: 'descr', tokenPrefix: 'COL'}, 'nft');63 });64 itSub('Create new NFT collection whith collection_description of maximum length (256 bytes)', async ({helper}) => {6566 await mintCollectionHelper(helper, alice, {name: 'name', description: 'A'.repeat(256), tokenPrefix: 'COL'}, 'nft');67 });68 itSub('Create new NFT collection whith token_prefix of maximum length (16 bytes)', async ({helper}) => {6970 await mintCollectionHelper(helper, alice, {name: 'name', description: 'descr', tokenPrefix: 'A'.repeat(16)}, 'nft');71 });72 itSub('Create new Fungible collection', async ({helper}) => {7374 await mintCollectionHelper(helper, alice, {name: 'name', description: 'descr', tokenPrefix: 'COL'}, 'fungible');75 });76 itSub.ifWithPallets('Create new ReFungible collection', [Pallets.ReFungible], async ({helper}) => {7778 await mintCollectionHelper(helper, alice, {name: 'name', description: 'descr', tokenPrefix: 'COL'}, 'refungible');79 });8081 itSub('create new collection with properties', async ({helper}) => {8283 await mintCollectionHelper(helper, alice, {84 name: 'name', description: 'descr', tokenPrefix: 'COL',85 properties: [{key: 'key1', value: 'val1'}],86 tokenPropertyPermissions: [{key: 'key1', permission: {tokenOwner: true, mutable: false, collectionAdmin: true}}],87 }, 'nft');88 });8990 itSub('Create new collection with extra fields', async ({helper}) => {9192 const collection = await mintCollectionHelper(helper, alice, {name: 'name', description: 'descr', tokenPrefix: 'COL'}, 'fungible');93 await collection.setPermissions(alice, {access: 'AllowList'});94 await collection.setLimits(alice, {accountTokenOwnershipLimit: 3});95 const data = await collection.getData();96 const limits = await collection.getEffectiveLimits();97 const raw = data?.raw;9899 expect(data?.normalizedOwner).to.be.equal(alice.address);100 expect(data?.name).to.be.equal('name');101 expect(data?.description).to.be.equal('descr');102 expect(raw.permissions.access).to.be.equal('AllowList');103 expect(raw.mode).to.be.deep.equal({Fungible: '0'});104 expect(limits.accountTokenOwnershipLimit).to.be.equal(3);105 });106107 itSub('New collection is not external', async ({helper}) => {108109 const collection = await helper.nft.mintCollection(alice, {name: 'name', description: 'descr', tokenPrefix: 'COL'});110 const data = await collection.getData();111 expect(data?.raw.readOnly).to.be.false;112 });113});114115describe('(!negative test!) integration test: ext. createCollection():', () => {116 let alice: IKeyringPair;117118 before(async () => {119 await usingPlaygrounds(async (helper, privateKey) => {120 const donor = privateKey('//Alice');121 [alice] = await helper.arrange.createAccounts([100n], donor);122 });123 });124125 itSub('(!negative test!) create new NFT collection whith incorrect data (collection_name)', async ({helper}) => {126 const mintCollectionTx = async () => helper.nft.mintCollection(alice, {name: 'A'.repeat(65), description: 'descr', tokenPrefix: 'COL'});127 await expect(mintCollectionTx()).to.be.rejectedWith('Verification Error');128 });129 itSub('(!negative test!) create new NFT collection whith incorrect data (collection_description)', async ({helper}) => {130 const mintCollectionTx = async () => helper.nft.mintCollection(alice, {name: 'name', description: 'A'.repeat(257), tokenPrefix: 'COL'});131 await expect(mintCollectionTx()).to.be.rejectedWith('Verification Error');132 });133 itSub('(!negative test!) create new NFT collection whith incorrect data (token_prefix)', async ({helper}) => {134135 const mintCollectionTx = async () => helper.nft.mintCollection(alice, {name: 'name', description: 'descr', tokenPrefix: 'A'.repeat(17)});136 await expect(mintCollectionTx()).to.be.rejectedWith('Verification Error');137 });138 itSub('(!negative test!) fails when bad limits are set', async ({helper}) => {139140 const mintCollectionTx = async () => helper.nft.mintCollection(alice, {name: 'name', description: 'descr', tokenPrefix: 'COL', limits: {tokenLimit: 0}});141 await expect(mintCollectionTx()).to.be.rejectedWith(/common\.CollectionTokenLimitExceeded/);142 });143144 itSub('(!negative test!) create collection with incorrect property limit (64 elements)', async ({helper}) => {145 const props: IProperty[] = [];146147 for (let i = 0; i < 65; i++) {148 props.push({key: `key${i}`, value: `value${i}`});149 }150 const mintCollectionTx = async () => helper.nft.mintCollection(alice, {name: 'name', description: 'descr', tokenPrefix: 'COL', properties: props});151 await expect(mintCollectionTx()).to.be.rejectedWith('Verification Error');152 });153154 itSub('(!negative test!) create collection with incorrect property limit (40 kb)', async ({helper}) => {155 const props: IProperty[] = [];156157 for (let i = 0; i < 32; i++) {158 props.push({key: `key${i}`.repeat(80), value: `value${i}`.repeat(80)});159 }160161 const mintCollectionTx = async () => helper.nft.mintCollection(alice, {name: 'name', description: 'descr', tokenPrefix: 'COL', properties: props});162 await expect(mintCollectionTx()).to.be.rejectedWith('Verification Error');163 });164});