non-fungible-apps/contracts/test/hardhat/contracts/FleekERC721/token-roles.t.ts

216 lines
5.8 KiB
TypeScript

import { loadFixture } from '@nomicfoundation/hardhat-network-helpers';
import { expect } from 'chai';
import { TestConstants, Fixtures, Errors } from './helpers';
const { TokenRoles } = TestConstants;
describe('FleekERC721.TokenRoles', () => {
let fixture: Awaited<ReturnType<typeof Fixtures.withMint>>;
beforeEach(async () => {
fixture = await loadFixture(Fixtures.withMint);
});
it('should match the token owner', async () => {
const { contract, owner, tokenId } = fixture;
const tokenOwner = await contract.ownerOf(tokenId);
expect(tokenOwner).to.equal(owner.address);
});
it('should match the owner role for minter', async () => {
const { contract, owner, tokenId } = fixture;
const tokenOwner = await contract.ownerOf(tokenId);
expect(tokenOwner).to.be.equal(owner.address);
});
it('should add a new controller', async () => {
const { contract, otherAccount, tokenId } = fixture;
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
);
expect(
await contract.hasTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
).to.be.true;
});
it('should add a list of controllers', async () => {
const { contract, tokenId } = fixture;
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
'0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049'
);
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
'0x2FEd6Ef3c495922263B403319FA6DDB323DD49E3'
);
expect(
await contract.hasTokenRole(
tokenId,
TokenRoles.Controller,
'0x7ED735b7095C05d78dF169F991f2b7f1A1F1A049'
)
).to.be.true;
expect(
await contract.hasTokenRole(
tokenId,
TokenRoles.Controller,
'0x2FEd6Ef3c495922263B403319FA6DDB323DD49E3'
)
).to.be.true;
});
it('should not match the owner role for other account', async () => {
const { contract, otherAccount, tokenId } = fixture;
const tokenOwner = await contract.ownerOf(tokenId);
expect(tokenOwner).to.not.be.equal(otherAccount.address);
});
it('should remove an added controller', async () => {
const { contract, otherAccount, tokenId } = fixture;
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
);
await contract.revokeTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
);
expect(
await contract.hasTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
).to.be.false;
});
it('should transfer the token owner role', async () => {
const { contract, owner, otherAccount, tokenId } = fixture;
await contract.transferFrom(owner.address, otherAccount.address, tokenId);
expect(await contract.ownerOf(tokenId)).to.equal(otherAccount.address);
});
it('should clean the token controller list after transfer', async () => {
const { contract, owner, otherAccount, tokenId } = fixture;
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
);
await contract.transferFrom(owner.address, otherAccount.address, tokenId);
expect(
await contract.hasTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
).to.be.false;
});
it('should not be able to add address role', async () => {
const { contract, otherAccount, tokenId } = fixture;
await expect(
contract
.connect(otherAccount)
.grantTokenRole(tokenId, TokenRoles.Controller, otherAccount.address)
).to.be.revertedWithCustomError(contract, Errors.MustBeTokenOwner);
});
it('should not be able to remove address role', async () => {
const { contract, otherAccount, tokenId } = fixture;
await expect(
contract
.connect(otherAccount)
.revokeTokenRole(tokenId, TokenRoles.Controller, otherAccount.address)
).to.be.revertedWithCustomError(contract, Errors.MustBeTokenOwner);
});
it('should emit event when token role is granted', async () => {
const { contract, owner, otherAccount, tokenId } = fixture;
await expect(
contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
)
.to.emit(contract, 'TokenRoleChanged')
.withArgs(
tokenId,
TokenRoles.Controller,
otherAccount.address,
true,
owner.address
);
});
it('should emit event when token role is revoked', async () => {
const { contract, owner, otherAccount, tokenId } = fixture;
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
);
await expect(
contract.revokeTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
)
.to.emit(contract, 'TokenRoleChanged')
.withArgs(
tokenId,
TokenRoles.Controller,
otherAccount.address,
false,
owner.address
);
});
it('should not be able to grant role twice', async () => {
const { contract, otherAccount, tokenId } = fixture;
await contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
);
await expect(
contract.grantTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
).to.be.revertedWithCustomError(contract, Errors.RoleAlreadySet);
});
it('should not be able to revoke role twice', async () => {
const { contract, otherAccount, tokenId } = fixture;
await expect(
contract.revokeTokenRole(
tokenId,
TokenRoles.Controller,
otherAccount.address
)
).to.be.revertedWithCustomError(contract, Errors.RoleAlreadySet);
});
});