diff --git a/test/GreeterTest.js b/test/GreeterTest.js new file mode 100644 index 0000000..74f2e8d --- /dev/null +++ b/test/GreeterTest.js @@ -0,0 +1,77 @@ +const { expect } = require('chai'); +const { ethers } = require('hardhat'); + +describe('GreeterFactory', function () { + let GreeterFactory, greeterFactory; + let owner, user1, user2; + const INITIAL_GREETING = 'Hello, Chunk Network!'; + const NEW_GREETING = 'Updated Greeting for Testing'; + + beforeEach(async function () { + [owner, user1, user2] = await ethers.getSigners(); + + const GreeterFactoryContract = await ethers.getContractFactory('GreeterFactory'); + greeterFactory = await GreeterFactoryContract.deploy(); + await greeterFactory.deployed(); + }); + + describe('Greeter Creation', function () { + it('should create a new Greeter contract with initial greeting', async function () { + const tx = await greeterFactory.connect(user1).createGreeter(INITIAL_GREETING); + const receipt = await tx.wait(); + + const greeterAddress = receipt.events.find(e => e.event === 'GreeterCreated').args.greeterAddress; + const Greeter = await ethers.getContractAt('Greeter', greeterAddress); + + const currentGreeting = await Greeter.greet(); + expect(currentGreeting).to.equal(INITIAL_GREETING); + }); + + it('should track created Greeter contracts per user', async function () { + await greeterFactory.connect(user1).createGreeter(INITIAL_GREETING); + await greeterFactory.connect(user1).createGreeter(NEW_GREETING); + + const userGreeters = await greeterFactory.getUserGreeters(user1.address); + expect(userGreeters.length).to.equal(2); + }); + }); + + describe('Greeting Modification', function () { + let userGreeter; + + beforeEach(async function () { + const tx = await greeterFactory.connect(user1).createGreeter(INITIAL_GREETING); + const receipt = await tx.wait(); + + const greeterAddress = receipt.events.find(e => e.event === 'GreeterCreated').args.greeterAddress; + userGreeter = await ethers.getContractAt('Greeter', greeterAddress); + }); + + it('should allow owner to update greeting', async function () { + await userGreeter.connect(user1).setGreeting(NEW_GREETING); + const updatedGreeting = await userGreeter.greet(); + + expect(updatedGreeting).to.equal(NEW_GREETING); + }); + + it('should prevent non-owners from updating greeting', async function () { + await expect( + userGreeter.connect(user2).setGreeting(NEW_GREETING) + ).to.be.revertedWith('Only owner can update greeting'); + }); + }); + + describe('Factory Limits', function () { + it('should limit maximum Greeter contracts per user', async function () { + const MAX_GREETERS = 5; + + for (let i = 0; i < MAX_GREETERS; i++) { + await greeterFactory.connect(user1).createGreeter(`Greeting ${i}`); + } + + await expect( + greeterFactory.connect(user1).createGreeter('Extra Greeting') + ).to.be.revertedWith('Maximum Greeter contracts reached'); + }); + }); +}); \ No newline at end of file