1import {ApiPromise} from '@polkadot/api';2import {expect} from 'chai';3import {getApiConnection} from '../substrate/substrate-api';4import {getNft, getParts, NftIdTuple} from './util/fetch';5import {expectTxFailure} 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 before(async () => {126 api = await getApiConnection();127 });128129 it('equip nft', async () => {130 const collectionId = await createTestCollection(api);131 const nftParentId = await mintTestNft(api, collectionId);132 const nftChildId = await mintChildNft(api, collectionId, nftParentId);133134 const baseId = await createTestBase(api);135136 await addTestComposable(api, collectionId, nftParentId, baseId);137 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);138139 const equipperNFT: NftIdTuple = [collectionId, nftParentId];140 const itemNFT: NftIdTuple = [collectionId, nftChildId];141142 await equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);143144 await checkEquipStatus(api, 'equipped', collectionId, nftChildId);145 });146147 it('unequip nft', async () => {148 const collectionId = await createTestCollection(api);149 const nftParentId = await mintTestNft(api, collectionId);150 const nftChildId = await mintChildNft(api, collectionId, nftParentId);151152 const baseId = await createTestBase(api);153154 await addTestComposable(api, collectionId, nftParentId, baseId);155 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);156157 const equipperNFT: NftIdTuple = [collectionId, nftParentId];158 const itemNFT: NftIdTuple = [collectionId, nftChildId];159160 await equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);161162 await checkEquipStatus(api, 'equipped', collectionId, nftChildId);163164 await unequipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);165 await checkEquipStatus(api, 'unequipped', collectionId, nftChildId);166 });167168 it('[negative] equip NFT onto non-existing NFT', async () => {169 const collectionId = await createTestCollection(api);170171 const nftChildId = await mintNft(172 api,173 Alice,174 Alice,175 collectionId,176 'nft-metadata',177 );178179 const itemNFT: NftIdTuple = [collectionId, nftChildId];180 const invalidEquipperNFT: NftIdTuple = [collectionId, 9999999];181182 const baseId = 0;183 const resourceId = 0;184185 const tx = equipNft(api, Alice, itemNFT, invalidEquipperNFT, resourceId, baseId, slotId);186 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);187 });188189 it('[negative] equip non-existing NFT', async () => {190 const collectionId = await createTestCollection(api);191 const nftParentId = await mintNft(192 api,193 Alice,194 Alice,195 collectionId,196 'nft-metadata',197 );198199 const baseId = await createTestBase(api);200201 await addTestComposable(api, collectionId, nftParentId, baseId);202203 const equipperNFT: NftIdTuple = [collectionId, nftParentId];204 const invalidItemNFT: NftIdTuple = [collectionId, 99999999];205206 const resourceId = 0;207208 const tx = equipNft(api, Alice, invalidItemNFT, equipperNFT, resourceId, baseId, slotId);209 await expectTxFailure(/rmrkCore\.NoAvailableNftId/, tx);210 });211212 it('[negative] equip NFT by a not-an-owner user', async () => {213 const collectionId = await createTestCollection(api);214 const nftParentId = await mintTestNft(api, collectionId);215 const nftChildId = await mintChildNft(api, collectionId, nftParentId);216217 const baseId = await createTestBase(api);218219 await addTestComposable(api, collectionId, nftParentId, baseId);220221 const equipperNFT: NftIdTuple = [collectionId, nftParentId];222 const itemNFT: NftIdTuple = [collectionId, nftChildId];223224 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);225226 const tx = equipNft(api, Bob, itemNFT, equipperNFT, resourceId, baseId, slotId);227 await expectTxFailure(/rmrkEquip\.PermissionError/, tx);228 });229230 it('[negative] unable to equip NFT onto indirect parent NFT', async () => {231 const collectionId = await createTestCollection(api);232 const nftParentId = await mintTestNft(api, collectionId);233 const nftChildId = await mintChildNft(api, collectionId, nftParentId);234 const nftGrandchildId = await mintChildNft(api, collectionId, nftChildId);235236 const baseId = await createTestBase(api);237238 await addTestComposable(api, collectionId, nftParentId, baseId);239 const resourceId = await addTestSlot(api, collectionId, nftGrandchildId, baseId, slotId);240241 const equipperNFT: NftIdTuple = [collectionId, nftParentId];242 const itemNFT: NftIdTuple = [collectionId, nftGrandchildId];243244 const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);245 await expectTxFailure(/rmrkEquip\.MustBeDirectParent/, tx);246 });247248 it('[negative] unable to equip NFT onto parent NFT with another base', async () => {249 const collectionId = await createTestCollection(api);250 const nftParentId = await mintTestNft(api, collectionId);251 const nftChildId = await mintChildNft(api, collectionId, nftParentId);252253 const baseId = await createTestBase(api);254255 await addTestComposable(api, collectionId, nftParentId, baseId);256 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);257258 const equipperNFT: NftIdTuple = [collectionId, nftParentId];259 const itemNFT: NftIdTuple = [collectionId, nftChildId];260261 const invalidBaseId = 99999;262263 const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, invalidBaseId, slotId);264 await expectTxFailure(/rmrkEquip\.NoResourceForThisBaseFoundOnNft/, tx);265 });266267 it('[negative] unable to equip NFT into slot with another id', async () => {268 const collectionId = await createTestCollection(api);269 const nftParentId = await mintTestNft(api, collectionId);270 const nftChildId = await mintChildNft(api, collectionId, nftParentId);271272 const baseId = await createTestBase(api);273274 await addTestComposable(api, collectionId, nftParentId, baseId);275 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);276277 const equipperNFT: NftIdTuple = [collectionId, nftParentId];278 const itemNFT: NftIdTuple = [collectionId, nftChildId];279280 const incorrectSlotId = slotId + 1;281 const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, incorrectSlotId);282 await expectTxFailure(/rmrkEquip\.ItemHasNoResourceToEquipThere/, tx);283 });284285 it('[negative] unable to equip NFT with incorrect slot (fixed part)', async () => {286 const collectionId = await createTestCollection(api);287 const nftParentId = await mintTestNft(api, collectionId);288 const nftChildId = await mintChildNft(api, collectionId, nftParentId);289290 const baseId = await createBase(api, Alice, 'test-base', 'DTBase', [291 {292 FixedPart: {293 id: slotId,294 equippable: 'All',295 z: 1,296 src: slotSrc,297 },298 },299 ]);300301 await addTestComposable(api, collectionId, nftParentId, baseId);302 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);303304 const equipperNFT: NftIdTuple = [collectionId, nftParentId];305 const itemNFT: NftIdTuple = [collectionId, nftChildId];306307 const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);308 await expectTxFailure(/rmrkEquip\.CantEquipFixedPart/, tx);309 });310311 it('[negative] unable to equip NFT from a collection that is not allowed by the slot', async () => {312 const collectionId = await createTestCollection(api);313 const nftParentId = await mintTestNft(api, collectionId);314 const nftChildId = await mintChildNft(api, collectionId, nftParentId);315316 const baseId = await createBase(api, Alice, 'test-base', 'DTBase', [317 {318 SlotPart: {319 id: 1,320 z: 1,321 equippable: 'Empty',322 src: slotSrc,323 },324 },325 ]);326327 await addTestComposable(api, collectionId, nftParentId, baseId);328 const resourceId = await addTestSlot(api, collectionId, nftChildId, baseId, slotId);329330 const equipperNFT: NftIdTuple = [collectionId, nftParentId];331 const itemNFT: NftIdTuple = [collectionId, nftChildId];332333 const tx = equipNft(api, Alice, itemNFT, equipperNFT, resourceId, baseId, slotId);334 await expectTxFailure(/rmrkEquip\.CollectionNotEquippable/, tx);335 });336337 after(() => {338 api.disconnect();339 });340});