git.delta.rocks / unique-network / refs/commits / 86d26e3a07ad

difftreelog

source

tests/src/rmrk/equipNft.test.ts10.9 KiBsourcehistory
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});