1import {ApiPromise} from '@polkadot/api';2import {expect} from 'chai';3import {getApiConnection} from '../substrate/substrate-api';4import {getNft, NftIdTuple} from './util/fetch';5import {expectTxFailure, requirePallets, Pallets} from './util/helpers';6import {7 addNftComposableResource,8 addNftSlotResource,9 createBase,10 createCollection,11 equipNft,12 mintNft,13 sendNft,14 unequipNft,15} from './util/tx';1617const alice = '//Alice';18const bob = '//Bob';1920const composableParts: number[] = [5, 2, 7];21const composableSrc = 'test-cmp-src';22const composableMetadata = 'test-cmp-metadata';23const composableLicense = 'test-comp-license';24const composableThumb = 'test-comp-thumb';2526const slotSrc = 'test-slot-src';27const slotLicense = 'test-slot-license';28const slotMetadata = 'test-slot-metadata';29const slotThumb = 'test-slot-thumb';3031const slotId = 1;3233async function createTestCollection(api: ApiPromise): Promise<number> {34 return createCollection(35 api,36 alice,37 'test-metadata',38 null,39 'test-symbol',40 );41}4243async function mintTestNft(api: ApiPromise, collectionId: number): Promise<number> {44 return await mintNft(45 api,46 alice,47 alice,48 collectionId,49 'nft-metadata',50 );51}5253async function mintChildNft(api: ApiPromise, collectionId: number, parentNftId: number): Promise<number> {54 const nftChildId = await mintTestNft(api, collectionId);5556 const parentNFT: NftIdTuple = [collectionId, parentNftId];5758 await sendNft(api, 'sent', alice, collectionId, nftChildId, parentNFT);5960 return nftChildId;61}6263async function createTestBase(api: ApiPromise): Promise<number> {64 return createBase(api, alice, 'test-base', 'DTBase', [65 {66 SlotPart: {67 id: slotId,68 equippable: 'All',69 z: 1,70 src: slotSrc,71 },72 },73 ]);74}7576async function addTestComposable(api: ApiPromise, collectionId: number, nftId: number, baseId: number) {77 await addNftComposableResource(78 api,79 alice,80 'added',81 collectionId,82 nftId,83 composableParts,84 baseId,85 composableSrc,86 composableMetadata,87 composableLicense,88 composableThumb,89 );90}9192async function addTestSlot(api: ApiPromise, collectionId: number, nftId: number, baseId: number, slotId: number): Promise<number> {93 return await addNftSlotResource(94 api,95 alice,96 'added',97 collectionId,98 nftId,99 baseId,100 slotId,101 slotSrc,102 slotMetadata,103 slotLicense,104 slotThumb,105 );106}107108async function checkEquipStatus(109 api: ApiPromise,110 expectedStatus: 'equipped' | 'unequipped',111 collectionId: number,112 nftId: number,113) {114 const itemNftDataOpt = await getNft(api, collectionId, nftId);115 expect(itemNftDataOpt.isSome, 'Error: unable to fetch item NFT data');116117 const itemNftData = itemNftDataOpt.unwrap();118 expect(itemNftData.equipped.isTrue, `Error: item NFT should be ${expectedStatus}`)119 .to.be.equal(expectedStatus === 'equipped');120}121122describe.skip('integration test: Equip NFT', () => {123124 let api: any;125 126 before(async function () {127 api = await getApiConnection();128 await requirePallets(this, [Pallets.RmrkCore, Pallets.RmrkEquip]);129 });130131 it('equip nft', async () => {132 const collectionId = await createTestCollection(api);133 const nftParentId = await mintTestNft(api, collectionId);134 const nftChildId = await mintChildNft(api, collectionId, nftParentId);135136 const baseId = await createTestBase(api);137138 await addTestComposable(api, collectionId, nftParentId, baseId);139 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);140141 const equipperNFT: NftIdTuple = [collectionId, nftParentId];142 const itemNFT: NftIdTuple = [collectionId, nftChildId];143144 await equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);145146 await checkEquipStatus(api, 'equipped', collectionId, nftChildId);147 });148149 it('unequip nft', async () => {150 const collectionId = await createTestCollection(api);151 const nftParentId = await mintTestNft(api, collectionId);152 const nftChildId = await mintChildNft(api, collectionId, nftParentId);153154 const baseId = await createTestBase(api);155156 await addTestComposable(api, collectionId, nftParentId, baseId);157 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);158159 const equipperNFT: NftIdTuple = [collectionId, nftParentId];160 const itemNFT: NftIdTuple = [collectionId, nftChildId];161162 await equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);163164 await checkEquipStatus(api, 'equipped', collectionId, nftChildId);165166 await unequipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);167 await checkEquipStatus(api, 'unequipped', collectionId, nftChildId);168 });169170 it('[negative] equip NFT onto non-existing NFT', async () => {171 const collectionId = await createTestCollection(api);172173 const nftChildId = await mintNft(174 api,175 alice,176 alice,177 collectionId,178 'nft-metadata',179 );180181 const itemNFT: NftIdTuple = [collectionId, nftChildId];182 const invalidEquipperNFT: NftIdTuple = [collectionId, 9999999];183184 const baseId = 0;185 const resourceId = 0;186187 const tx = equipNft(api, alice, itemNFT, invalidEquipperNFT, resourceId, baseId, slotId);188 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);189 });190191 it('[negative] equip non-existing NFT', async () => {192 const collectionId = await createTestCollection(api);193 const nftParentId = await mintNft(194 api,195 alice,196 alice,197 collectionId,198 'nft-metadata',199 );200201 const baseId = await createTestBase(api);202203 await addTestComposable(api, collectionId, nftParentId, baseId);204205 const equipperNFT: NftIdTuple = [collectionId, nftParentId];206 const invalidItemNFT: NftIdTuple = [collectionId, 99999999];207208 const resourceId = 0;209210 const tx = equipNft(api, alice, invalidItemNFT, equipperNFT, resourceId, baseId, slotId);211 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);212 });213214 it('[negative] equip NFT by a not-an-owner user', async () => {215 const collectionId = await createTestCollection(api);216 const nftParentId = await mintTestNft(api, collectionId);217 const nftChildId = await mintChildNft(api, collectionId, nftParentId);218219 const baseId = await createTestBase(api);220221 await addTestComposable(api, collectionId, nftParentId, baseId);222223 const equipperNFT: NftIdTuple = [collectionId, nftParentId];224 const itemNFT: NftIdTuple = [collectionId, nftChildId];225226 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);227228 const tx = equipNft(api, bob, itemNFT, equipperNFT, resourceId, baseId, slotId);229 await expectTxFailure(/rmrkEquip\.PermissionError/, tx);230 });231232 it('[negative] unable to equip NFT onto indirect parent NFT', async () => {233 const collectionId = await createTestCollection(api);234 const nftParentId = await mintTestNft(api, collectionId);235 const nftChildId = await mintChildNft(api, collectionId, nftParentId);236 const nftGrandchildId = await mintChildNft(api, collectionId, nftChildId);237238 const baseId = await createTestBase(api);239240 await addTestComposable(api, collectionId, nftParentId, baseId);241 const resourceId = await addTestSlot(api, collectionId, nftGrandchildId, baseId, slotId);242243 const equipperNFT: NftIdTuple = [collectionId, nftParentId];244 const itemNFT: NftIdTuple = [collectionId, nftGrandchildId];245246 const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);247 await expectTxFailure(/rmrkEquip\.MustBeDirectParent/, tx);248 });249250 it('[negative] unable to equip NFT onto parent NFT with another base', async () => {251 const collectionId = await createTestCollection(api);252 const nftParentId = await mintTestNft(api, collectionId);253 const nftChildId = await mintChildNft(api, collectionId, nftParentId);254255 const baseId = await createTestBase(api);256257 await addTestComposable(api, collectionId, nftParentId, baseId);258 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);259260 const equipperNFT: NftIdTuple = [collectionId, nftParentId];261 const itemNFT: NftIdTuple = [collectionId, nftChildId];262263 const invalidBaseId = 99999;264265 const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, invalidBaseId, slotId);266 await expectTxFailure(/rmrkEquip\.NoResourceForThisBaseFoundOnNft/, tx);267 });268269 it('[negative] unable to equip NFT into slot with another id', async () => {270 const collectionId = await createTestCollection(api);271 const nftParentId = await mintTestNft(api, collectionId);272 const nftChildId = await mintChildNft(api, collectionId, nftParentId);273274 const baseId = await createTestBase(api);275276 await addTestComposable(api, collectionId, nftParentId, baseId);277 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);278279 const equipperNFT: NftIdTuple = [collectionId, nftParentId];280 const itemNFT: NftIdTuple = [collectionId, nftChildId];281282 const incorrectSlotId = slotId + 1;283 const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, incorrectSlotId);284 await expectTxFailure(/rmrkEquip\.ItemHasNoResourceToEquipThere/, tx);285 });286287 it('[negative] unable to equip NFT with incorrect slot (fixed part)', async () => {288 const collectionId = await createTestCollection(api);289 const nftParentId = await mintTestNft(api, collectionId);290 const nftChildId = await mintChildNft(api, collectionId, nftParentId);291292 const baseId = await createBase(api, alice, 'test-base', 'DTBase', [293 {294 FixedPart: {295 id: slotId,296 equippable: 'All',297 z: 1,298 src: slotSrc,299 },300 },301 ]);302303 await addTestComposable(api, collectionId, nftParentId, baseId);304 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);305306 const equipperNFT: NftIdTuple = [collectionId, nftParentId];307 const itemNFT: NftIdTuple = [collectionId, nftChildId];308309 const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);310 await expectTxFailure(/rmrkEquip\.CantEquipFixedPart/, tx);311 });312313 it('[negative] unable to equip NFT from a collection that is not allowed by the slot', async () => {314 const collectionId = await createTestCollection(api);315 const nftParentId = await mintTestNft(api, collectionId);316 const nftChildId = await mintChildNft(api, collectionId, nftParentId);317318 const baseId = await createBase(api, alice, 'test-base', 'DTBase', [319 {320 SlotPart: {321 id: 1,322 z: 1,323 equippable: 'Empty',324 src: slotSrc,325 },326 },327 ]);328329 await addTestComposable(api, collectionId, nftParentId, baseId);330 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);331332 const equipperNFT: NftIdTuple = [collectionId, nftParentId];333 const itemNFT: NftIdTuple = [collectionId, nftChildId];334335 const tx = equipNft(api, alice, itemNFT, equipperNFT, resourceId, baseId, slotId);336 await expectTxFailure(/rmrkEquip\.CollectionNotEquippable/, tx);337 });338339 after(async() => { await api.disconnect(); });340});