const { expect } = require('chai'); describe('SitesNFTs contract', function () { describe('Deployment', () => { it('Deployment should assign the name and the symbol of the ERC721 contract', async () => { const [owner] = await ethers.getSigners(); const name = 'Sites NFTs'; const symbol = 'SNFT'; const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const contractName = await hardhatSitesNFTs.name(); const contractSymbol = await hardhatSitesNFTs.symbol(); expect(contractName).to.equal(name); expect(contractSymbol).to.equal(symbol); }); it('Deployment should assign the deployer DEFAULT_ADMIN_ROLE', async () => { const [owner] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const DEFAULT_ADMIN_ROLE_STRING = ''; const hasAdminRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE_STRING), await owner.getAddress() ); expect(hasAdminRole).to.equal(true); }); it('Deployment should assign initial tokenId to 0', async () => { const [owner] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const currentTokenId = await hardhatSitesNFTs.getCurrentTokenId(); expect(currentTokenId).to.equal(0); }); }); describe('Access control', () => { it('User with DEFAULT_ADMIN_ROLE should be able to assign MINTER_ROLE to another user', async () => { const [owner, address1] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const MINTER_ROLE = 'MINTER_ROLE'; await hardhatSitesNFTs.grantRole( ethers.utils.formatBytes32String(MINTER_ROLE), await address1.getAddress() ); const hasMinterRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(MINTER_ROLE), await address1.getAddress() ); expect(hasMinterRole).to.equal(true); }); it('User with DEFAULT_ADMIN_ROLE should be able to assign MINTER_ROLE to himself and still have DEFAULT_ADMIN_ROLE', async () => { const [owner] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const MINTER_ROLE = 'MINTER_ROLE'; const DEFAULT_ADMIN_ROLE = ''; await hardhatSitesNFTs.grantRole( ethers.utils.formatBytes32String(MINTER_ROLE), await owner.getAddress() ); const hasMinterRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(MINTER_ROLE), await owner.getAddress() ); const hasAdminRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await owner.getAddress() ); expect(hasMinterRole).to.equal(true); expect(hasAdminRole).to.equal(true); }); it('User with DEFAULT_ADMIN_ROLE should be able to assign DEFAULT_ADMIN_ROLE to another user', async () => { const [owner, address1] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const DEFAULT_ADMIN_ROLE = ''; await hardhatSitesNFTs.grantRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await address1.getAddress() ); const hasAdminRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await address1.getAddress() ); expect(hasAdminRole).to.equal(true); }); it('User with DEFAULT_ADMIN_ROLE should be able to assign DEFAULT_ADMIN_ROLE to another user and still have DEFAULT_ADMIN_ROLE', async () => { const [owner, address1] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const DEFAULT_ADMIN_ROLE = ''; await hardhatSitesNFTs.grantRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await address1.getAddress() ); let hasAdminRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await address1.getAddress() ); expect(hasAdminRole).to.equal(true); hasAdminRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await owner.getAddress() ); expect(hasAdminRole).to.equal(true); }); it('User without DEFAULT_ADMIN_ROLE shouldnt be able to assign DEFAULT_ADMIN_ROLE to another user', async () => { const [owner, address1, address2] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const DEFAULT_ADMIN_ROLE = ''; try { await hardhatSitesNFTs .connect(address1) .grantRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await address2.getAddress() ); } catch (e) {} const hasAdminRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(DEFAULT_ADMIN_ROLE), await address2.getAddress() ); expect(hasAdminRole).to.equal(false); }); it('User without DEFAULT_ADMIN_ROLE shouldnt be able to assign MINTER_ROLE to another user', async () => { const [owner, address1, address2] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const MINTER_ROLE = 'MINTER_ROLE'; try { await hardhatSitesNFTs .connect(address1) .grantRole( ethers.utils.formatBytes32String(MINTER_ROLE), await address2.getAddress() ); } catch (e) {} const hasMinterRole = await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(MINTER_ROLE), await address2.getAddress() ); expect(hasMinterRole).to.equal(false); }); }); describe('Minting', () => { it('User with DEFAULT_ADMIN_ROLE should be able to mint', async () => { const [owner, address1] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const tokenURI = 'tokenURI'; await hardhatSitesNFTs.mint(tokenURI, await address1.getAddress()); const balance = await hardhatSitesNFTs.balanceOf( await address1.getAddress() ); expect(balance).to.equal(1); }); it('User with MINTER_ROLE should be able to mint', async () => { const [owner, address1, address2] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const MINTER_ROLE = 'MINTER_ROLE'; const tokenURI = 'tokenURI'; await hardhatSitesNFTs.grantRole( ethers.utils.formatBytes32String(MINTER_ROLE), await address1.getAddress() ); await hardhatSitesNFTs.hasRole( ethers.utils.formatBytes32String(MINTER_ROLE), await address1.getAddress() ); await hardhatSitesNFTs .connect(address1) .mint(tokenURI, await address2.getAddress()); const balance = await hardhatSitesNFTs.balanceOf( await address2.getAddress() ); expect(balance).to.equal(1); }); it('User without MINTER_ROLE or DEFAULT_ADMIN_ROLE shouldnt be able to mint', async () => { const [owner, address1, address2] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const tokenURI = 'tokenURI'; try { await hardhatSitesNFTs .connect(address1) .mint(tokenURI, await address2.getAddress()); } catch (e) {} const balance = await hardhatSitesNFTs.balanceOf( await address2.getAddress() ); expect(balance).to.equal(0); }); it('Minted NFT should have data:application/json;base64, baseURI', async () => { const [owner, address1] = await ethers.getSigners(); const SitesNFTs = await ethers.getContractFactory('SitesNFTs'); const hardhatSitesNFTs = await SitesNFTs.deploy('Sites NFTs', 'SNFT'); const tokenURI = 'tokenURI'; await hardhatSitesNFTs.mint(tokenURI, await address1.getAddress()); const mintedNFT = await hardhatSitesNFTs.tokenURI(0); expect(mintedNFT.includes('data:application/json;base64,')).to.equal( true ); }); }); });