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 unequipNft15} 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 composableThumb89 );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 slotThumb105 );106}107108async function checkEquipStatus(109 api: ApiPromise,110 expectedStatus: "equipped" | "unequipped",111 collectionId: number,112 nftId: number113) {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("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});