tests: Unit tests for FollowNFT added - some cases still missing

This commit is contained in:
donosonaumczuk
2022-12-28 18:28:18 -03:00
parent ebfc4b0710
commit a955faa486

View File

@@ -55,7 +55,11 @@ contract FollowNFTTest is BaseTest, ERC721Test {
return targetFollowNFT;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Follow - General - Negatives
//////////////////////////////////////////////////////////
function testCannotCallFollowIfNotTheHub(address sender) public {
vm.assume(sender != address(hub));
@@ -86,77 +90,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
});
}
// Follow - General - Scenarios
function testUnwrappedTokenStillTiedToFollowerProfileAfterAFollowerProfileTransfer(
address newFollowerProfileOwner
) public {
vm.assume(newFollowerProfileOwner != followerProfileOwner);
vm.assume(newFollowerProfileOwner != address(0));
vm.prank(address(hub));
uint256 assignedTokenId = followNFT.follow({
followerProfileId: followerProfileId,
executor: followerProfileOwner,
followerProfileOwner: followerProfileOwner,
isExecutorApproved: false,
followTokenId: MINT_NEW_TOKEN
});
assertTrue(followNFT.isFollowing(followerProfileId));
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
assertEq(followerProfileIdSet, followerProfileId);
vm.prank(followerProfileOwner);
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
assertTrue(followNFT.isFollowing(followerProfileId));
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
vm.prank(newFollowerProfileOwner);
followNFT.untieAndWrap(assignedTokenId);
assertEq(followNFT.ownerOf(assignedTokenId), newFollowerProfileOwner);
}
function testWrappedTokenStillHeldByPreviousFollowerOwnerAfterAFollowerProfileTransfer(
address newFollowerProfileOwner
) public {
vm.assume(newFollowerProfileOwner != followerProfileOwner);
vm.assume(newFollowerProfileOwner != address(0));
vm.prank(address(hub));
uint256 assignedTokenId = followNFT.follow({
followerProfileId: followerProfileId,
executor: followerProfileOwner,
followerProfileOwner: followerProfileOwner,
isExecutorApproved: false,
followTokenId: MINT_NEW_TOKEN
});
vm.prank(followerProfileOwner);
followNFT.untieAndWrap(assignedTokenId);
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
assertTrue(followNFT.isFollowing(followerProfileId));
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
assertEq(followerProfileIdSet, followerProfileId);
vm.prank(followerProfileOwner);
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
assertTrue(followNFT.isFollowing(followerProfileId));
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
}
//////////////////////////////////////////////////////////
// Follow - Minting new token - Negatives
//////////////////////////////////////////////////////////
function testCannotFollowMintingNewTokenIfExecutorIsNotTheProfileOwnerOrHisApprovedExecutor(
address executor
@@ -178,7 +114,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
});
}
//////////////////////////////////////////////////////////
// Follow - Minting new token - Scenarios
//////////////////////////////////////////////////////////
function testNewMintedTokenIdIsLastAssignedPlusOne() public {
vm.prank(address(hub));
@@ -267,7 +205,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
followNFT.ownerOf(assignedTokenId);
}
//////////////////////////////////////////////////////////
// Follow - With unwrapped token - Negatives
//////////////////////////////////////////////////////////
function testCannotFollowWithUnwrappedTokenIfExecutorIsNotTheProfileOwnerOrHisApprovedExecutor(
address executor
@@ -293,7 +233,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
});
}
//////////////////////////////////////////////////////////
// Follow - With unwrapped token - Scenarios
//////////////////////////////////////////////////////////
function testFollowWithUnwrappedTokenWhenExecutorOwnsCurrentAndNewFollowerProfile() public {
vm.prank(followerProfileOwner);
@@ -448,7 +390,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
assertEq(followNFT.getFollowApproved(followTokenId), 0);
}
//////////////////////////////////////////////////////////
// Follow - With wrapped token - Negatives
//////////////////////////////////////////////////////////
function testCannotFollowWithWrappedTokenIfExecutorIsNotTheProfileOwnerOrHisApprovedExecutor(
address executor
@@ -475,7 +419,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
});
}
//////////////////////////////////////////////////////////
// Follow - With wrapped token - Scenarios
//////////////////////////////////////////////////////////
function testFollowWithWrappedTokenWhenFollowerOwnerOwnsFollowTokenAndIsActingAsExecutor()
public
@@ -686,7 +632,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
assertEq(followNFT.getFollowApproved(followTokenId), 0);
}
//////////////////////////////////////////////////////////
// Follow - Recovering token - Scenarios
//////////////////////////////////////////////////////////
function testFollowRecoveringToken() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
@@ -718,4 +666,419 @@ contract FollowNFTTest is BaseTest, ERC721Test {
assertEq(followNFT.getFollowTokenId(alreadyFollowingProfileId), followTokenId);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Unfollow - Negatives
//////////////////////////////////////////////////////////
function testCannotCallUnfollowIfNotTheHub(address sender) public {
vm.assume(sender != address(hub));
vm.assume(sender != address(0));
vm.prank(sender);
vm.expectRevert(Errors.NotHub.selector);
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: alreadyFollowingProfileOwner,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
}
function testCannotUnfollowIfNotAlreadyFollowing() public {
assertFalse(followNFT.isFollowing(followerProfileId));
vm.prank(address(hub));
vm.expectRevert(IFollowNFT.NotFollowing.selector);
followNFT.unfollow({
unfollowerProfileId: followerProfileId,
executor: followerProfileOwner,
isExecutorApproved: false,
unfollowerProfileOwner: followerProfileOwner
});
}
function testCannotUnfollowIfTokenIsWrappedAndExecutorIsNotApprovedOrUnfollowerOwnerOrTokenOwnerOrApprovedForAll(
address executor
) public {
vm.assume(executor != alreadyFollowingProfileOwner);
vm.assume(!hub.isDelegatedExecutorApproved(alreadyFollowingProfileOwner, executor));
vm.assume(!followNFT.isApprovedForAll(alreadyFollowingProfileOwner, executor));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(address(hub));
vm.expectRevert(IFollowNFT.DoesNotHavePermissions.selector);
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: executor,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
}
function testCannotUnfollowIfTokenIsUnwrappedAndExecutorIsNotApprovedOrUnfollowerOwner(
address executor
) public {
vm.assume(executor != alreadyFollowingProfileOwner);
vm.assume(!hub.isDelegatedExecutorApproved(alreadyFollowingProfileOwner, executor));
vm.prank(address(hub));
vm.expectRevert(IFollowNFT.DoesNotHavePermissions.selector);
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: executor,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
}
//////////////////////////////////////////////////////////
// Unfollow - Scenarios
//////////////////////////////////////////////////////////
function testUnfollowAsFollowerProfileOwnerWhenTokenIsWrapped() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: alreadyFollowingProfileOwner,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
}
function testUnfollowAsApprovedDelegatedExecutorOfFollowerOwnerWhenTokenIsWrapped(
address executorAsApprovedDelegatee
) public {
vm.assume(executorAsApprovedDelegatee != alreadyFollowingProfileOwner);
vm.assume(executorAsApprovedDelegatee != address(0));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: executorAsApprovedDelegatee,
isExecutorApproved: true,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
}
function testUnfollowAsFollowTokenOwnerWhenTokenIsWrapped(address followTokenOwner) public {
vm.assume(followTokenOwner != alreadyFollowingProfileOwner);
vm.assume(followTokenOwner != address(0));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.transferFrom(alreadyFollowingProfileOwner, followTokenOwner, followTokenId);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: followTokenOwner,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
}
function testUnfollowAsApprovedForAllByTokenOwnerWhenTokenIsWrapped(address approvedForAll)
public
{
vm.assume(approvedForAll != alreadyFollowingProfileOwner);
vm.assume(approvedForAll != address(0));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.setApprovalForAll(approvedForAll, true);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: approvedForAll,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
}
function testUnfollowAsFollowerProfileOwnerWhenTokenIsUnwrapped() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: alreadyFollowingProfileOwner,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), alreadyFollowingProfileId);
}
function testUnfollowAsApprovedDelegatedExecutorOfFollowerOwnerWhenTokenIsUnwrapped(
address executorAsApprovedDelegatee
) public {
vm.assume(executorAsApprovedDelegatee != alreadyFollowingProfileOwner);
vm.assume(executorAsApprovedDelegatee != address(0));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: executorAsApprovedDelegatee,
isExecutorApproved: true,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), alreadyFollowingProfileId);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Untie & Wrap - Negatives
//////////////////////////////////////////////////////////
function testCannotUntieAndWrapIfAlreadyWrapped() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(alreadyFollowingProfileOwner);
vm.expectRevert(IFollowNFT.AlreadyUntiedAndWrapped.selector);
followNFT.untieAndWrap(followTokenId);
}
function testCannotUntieAndWrapIfTokenDoesNotExist(uint256 unexistentTokenId) public {
vm.assume(followNFT.getFollowerProfileId(unexistentTokenId) == 0);
vm.assume(!followNFT.exists(unexistentTokenId));
vm.expectRevert(IFollowNFT.FollowTokenDoesNotExist.selector);
followNFT.untieAndWrap(unexistentTokenId);
}
function testCannotUntieAndWrapIfSenderIsNotFollowerOwner(address notFollowerOwner) public {
vm.assume(notFollowerOwner != alreadyFollowingProfileOwner);
vm.assume(notFollowerOwner != address(0));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(notFollowerOwner);
vm.expectRevert(IFollowNFT.DoesNotHavePermissions.selector);
followNFT.untieAndWrap(followTokenId);
}
//////////////////////////////////////////////////////////
// Untie & Wrap - Scenarios
//////////////////////////////////////////////////////////
function testWrappedTokenOwnerIsFollowerProfileOwnerAfterUntyingAndWrapping() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
assertEq(followNFT.ownerOf(followTokenId), alreadyFollowingProfileOwner);
}
function testWrappedTokenStillHeldByPreviousFollowerOwnerAfterAFollowerProfileTransfer(
address newFollowerProfileOwner
) public {
vm.assume(newFollowerProfileOwner != followerProfileOwner);
vm.assume(newFollowerProfileOwner != address(0));
vm.prank(address(hub));
uint256 assignedTokenId = followNFT.follow({
followerProfileId: followerProfileId,
executor: followerProfileOwner,
followerProfileOwner: followerProfileOwner,
isExecutorApproved: false,
followTokenId: MINT_NEW_TOKEN
});
vm.prank(followerProfileOwner);
followNFT.untieAndWrap(assignedTokenId);
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
assertTrue(followNFT.isFollowing(followerProfileId));
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
assertEq(followerProfileIdSet, followerProfileId);
vm.prank(followerProfileOwner);
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
assertTrue(followNFT.isFollowing(followerProfileId));
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Unwrap & Tie - Negatives
//////////////////////////////////////////////////////////
function testCannotUnwrapAndTieIfTokenDoesNotHaveAFollowerSet() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.prank(address(hub));
followNFT.unfollow({
unfollowerProfileId: alreadyFollowingProfileId,
executor: alreadyFollowingProfileOwner,
isExecutorApproved: false,
unfollowerProfileOwner: alreadyFollowingProfileOwner
});
vm.expectRevert(IFollowNFT.NotFollowing.selector);
vm.prank(alreadyFollowingProfileOwner);
followNFT.unwrapAndTie(alreadyFollowingProfileId);
}
function testCannotUnwrapAndTieIfTokenIsAlreadyUnwrappedAndTied() public {
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.expectRevert(Errors.ERC721Time_OperatorQueryForNonexistantToken.selector);
vm.prank(alreadyFollowingProfileOwner);
followNFT.unwrapAndTie(alreadyFollowingProfileId);
}
function testCannotUnwrapAndTieIfSenderIsNotTokenOwnerOrApprovedOrApprovedForAll(address sender)
public
{
// You can't approve a token that is not wrapped, so no need to check for `followNFT.getApproved(followTokenId)`
vm.assume(sender != alreadyFollowingProfileOwner);
vm.assume(sender != address(0));
vm.assume(!followNFT.isApprovedForAll(alreadyFollowingProfileOwner, sender));
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
vm.prank(alreadyFollowingProfileOwner);
followNFT.untieAndWrap(followTokenId);
vm.expectRevert(Errors.NotOwnerOrApproved.selector);
vm.prank(sender);
followNFT.unwrapAndTie(alreadyFollowingProfileId);
}
//////////////////////////////////////////////////////////
// Unwrap & Tie - Scenarios
//////////////////////////////////////////////////////////
/****************[ Token owner can unwrap ]*/
/****************[ Approved for all can unwrap ]*/
/****************[ Approved (by approve()) can unwrap ]*/
/****************[ Unwrap and tie back from wrapped ]*/
/****************[ Owner reverts, balance is 0 ]*/
function testUnwrappedTokenStillTiedToFollowerProfileAfterAFollowerProfileTransfer(
address newFollowerProfileOwner
) public {
vm.assume(newFollowerProfileOwner != followerProfileOwner);
vm.assume(newFollowerProfileOwner != address(0));
vm.prank(address(hub));
uint256 assignedTokenId = followNFT.follow({
followerProfileId: followerProfileId,
executor: followerProfileOwner,
followerProfileOwner: followerProfileOwner,
isExecutorApproved: false,
followTokenId: MINT_NEW_TOKEN
});
assertTrue(followNFT.isFollowing(followerProfileId));
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
assertEq(followerProfileIdSet, followerProfileId);
vm.prank(followerProfileOwner);
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
assertTrue(followNFT.isFollowing(followerProfileId));
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
vm.prank(newFollowerProfileOwner);
followNFT.untieAndWrap(assignedTokenId);
assertEq(followNFT.ownerOf(assignedTokenId), newFollowerProfileOwner);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Block - Negatives
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Block - Scenarios
//////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Approve follow - Negatives
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
// Approve follow - Scenarios
//////////////////////////////////////////////////////////
}