diff --git a/.gitignore b/.gitignore index 85198aa..d577cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ docs/ # Dotenv file .env +lib/ diff --git a/foundry.lock b/foundry.lock new file mode 100644 index 0000000..b18036c --- /dev/null +++ b/foundry.lock @@ -0,0 +1,5 @@ +{ + "lib/forge-std": { + "rev": "8e40513d678f392f398620b3ef2b418648b33e89" + } +} \ No newline at end of file diff --git a/lib/forge-std b/lib/forge-std deleted file mode 160000 index 8e40513..0000000 --- a/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8e40513d678f392f398620b3ef2b418648b33e89 diff --git a/script/Counter.s.sol b/script/Counter.s.sol deleted file mode 100644 index cdc1fe9..0000000 --- a/script/Counter.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Script, console} from "forge-std/Script.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterScript is Script { - Counter public counter; - - function setUp() public {} - - function run() public { - vm.startBroadcast(); - - counter = new Counter(); - - vm.stopBroadcast(); - } -} diff --git a/script/Deploy.s.sol b/script/Deploy.s.sol new file mode 100644 index 0000000..8769721 --- /dev/null +++ b/script/Deploy.s.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import "forge-std/Script.sol"; +import "../src/AmbienceChat.sol"; + +contract DeployAmbienceChat is Script { + function run() external { + // Get the private key from environment variable + uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); + + // Start broadcasting transactions + vm.startBroadcast(deployerPrivateKey); + + // Deploy the contract + AmbienceChat ambienceChat = new AmbienceChat(); + + // Log the deployed contract address + console.log("AmbienceChat deployed to:", address(ambienceChat)); + + vm.stopBroadcast(); + } +} diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded799..0000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/test/AmbienceChat.t.sol b/test/AmbienceChat.t.sol new file mode 100644 index 0000000..2e04624 --- /dev/null +++ b/test/AmbienceChat.t.sol @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; +import "../src/AmbienceChat.sol"; + +contract AmbienceChatTest is Test { + AmbienceChat public ambienceChat; + address public owner = address(1); + address public user1 = address(2); + address public user2 = address(3); + + function setUp() public { + vm.prank(owner); + ambienceChat = new AmbienceChat(); + + // Set up test users + vm.prank(user1); + ambienceChat.setUsername("user1"); + + vm.prank(user2); + ambienceChat.setUsername("user2"); + } + + function testUserProfile() public { + // Test user profile setting + address testUser = address(4); + string memory testUsername = "testuser"; + + vm.prank(testUser); + ambienceChat.setUsername(testUsername); + + (string memory username, bool isRegistered) = ambienceChat.userProfiles(testUser); + assertEq(username, testUsername); + assertTrue(isRegistered); + + // Test username uniqueness + address anotherUser = address(5); + vm.prank(anotherUser); + vm.expectRevert("Username already taken"); + ambienceChat.setUsername(testUsername); + } + + function testCreateRoom() public { + string memory roomName = "Test Room"; + bool isPrivate = false; + + vm.prank(user1); + uint256 roomId = ambienceChat.createRoom(roomName, isPrivate); + + (string memory name, address roomOwner, bool roomIsPrivate,,) = ambienceChat.rooms(roomId); + assertEq(name, roomName); + assertEq(roomOwner, user1); + assertEq(roomIsPrivate, isPrivate); + + // Test that the default "General" room exists + (name,, roomIsPrivate,,) = ambienceChat.rooms(0); + assertEq(name, "General"); + assertFalse(roomIsPrivate); + } + + function testSendMessage() public { + // Create a room + vm.prank(user1); + uint256 roomId = ambienceChat.createRoom("Test Room", false); + + // Send a message + string memory messageContent = "Hello, world!"; + vm.prank(user1); + uint256 messageId = ambienceChat.sendMessage(roomId, messageContent); + + // Verify message + (address sender, string memory content,,) = ambienceChat.messages(messageId); + assertEq(sender, user1); + assertEq(content, messageContent); + + // Check room message count + (,,, uint256 messageCount) = ambienceChat.getRoomInfo(roomId); + assertEq(messageCount, 1); + } + + function testPrivateRoomAccess() public { + // Create private room + vm.prank(user1); + uint256 roomId = ambienceChat.createRoom("Private Room", true); + + // User2 tries to send message (should fail) + vm.prank(user2); + vm.expectRevert("Access denied: not a member of this private room"); + ambienceChat.sendMessage(roomId, "Hello"); + + // Add user2 to private room + vm.prank(user1); + ambienceChat.addRoomMember(roomId, user2); + + // Now user2 should be able to send message + vm.prank(user2); + ambienceChat.sendMessage(roomId, "Hello from user2"); + } + + function testMessageCooldown() public { + // Use the default General room (roomId = 0) + uint256 roomId = 0; + + // First message + vm.prank(user1); + ambienceChat.sendMessage(roomId, "First message"); + + // Try to send another message immediately (should fail) + vm.prank(user1); + vm.expectRevert("Message cooldown period has not passed"); + ambienceChat.sendMessage(roomId, "Second message"); + + // Fast forward time (1 minute + 1 second) + vm.warp(block.timestamp + 61); + + // Now should work + vm.prank(user1); + ambienceChat.sendMessage(roomId, "Second message"); + } +} diff --git a/test/Counter.t.sol b/test/Counter.t.sol deleted file mode 100644 index 54b724f..0000000 --- a/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function test_Increment() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testFuzz_SetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -}