Repository: OpenZeppelin/cairo-contracts (language: python)

Issue:
Improve mocks organization



Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2079d48b1..b35b45f1e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,10 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Changed
 
-- Bump scarb to v2.8.3 (#1166)
+- Bump scarb to v2.8.4 (#1146)
 
 ### Changed (Breaking)
 
+- Bump snforge to 0.31.0
 - Remove openzeppelin_utils::selectors (#1163)
 - Remove `DualCase dispatchers` (#1163)
   - Remove `try_selector_with_fallback` from `openzeppelin_utils`
diff --git a/Scarb.lock b/Scarb.lock
index 4d1eb7904..fabb1d34d 100644
--- a/Scarb.lock
+++ b/Scarb.lock
@@ -60,6 +60,7 @@ version = "0.17.0"
 dependencies = [
  "openzeppelin_access",
  "openzeppelin_introspection",
+ "openzeppelin_test_common",
  "openzeppelin_testing",
  "openzeppelin_utils",
  "snforge_std",
@@ -69,6 +70,7 @@ dependencies = [
 name = "openzeppelin_introspection"
 version = "0.17.0"
 dependencies = [
+ "openzeppelin_test_common",
  "snforge_std",
 ]
 
@@ -99,6 +101,7 @@ dependencies = [
 name = "openzeppelin_security"
 version = "0.17.0"
 dependencies = [
+ "openzeppelin_test_common",
  "openzeppelin_testing",
  "snforge_std",
 ]
@@ -110,6 +113,8 @@ dependencies = [
  "openzeppelin_access",
  "openzeppelin_account",
  "openzeppelin_finance",
+ "openzeppelin_introspection",
+ "openzeppelin_security",
  "openzeppelin_testing",
  "openzeppelin_token",
  "openzeppelin_upgrades",
@@ -150,21 +155,22 @@ dependencies = [
 name = "openzeppelin_utils"
 version = "0.17.0"
 dependencies = [
+ "openzeppelin_test_common",
  "openzeppelin_testing",
  "snforge_std",
 ]
 
 [[package]]
 name = "snforge_scarb_plugin"
-version = "0.2.0"
+version = "0.31.0"
 source = "registry+https://scarbs.xyz/"
-checksum = "sha256:2e4ce3ebe3f49548bd26908391b5d78537a765d827df0d96c32aeb88941d0d67"
+checksum = "sha256:1fce075fcbf7fce1b0935f6f9a034549704837fb221da212d3b6e9134cebfdaa"
 
 [[package]]
 name = "snforge_std"
-version = "0.30.0"
+version = "0.31.0"
 source = "registry+https://scarbs.xyz/"
-checksum = "sha256:2f3c4846881813ac0f5d1460981249c9f5e2a6831e752beedf9b70975495b4ec"
+checksum = "sha256:60ac980b297281f9a59a5f1668cb56bdea1b28fd2f8008008270f9a3c91ad3ba"
 dependencies = [
  "snforge_scarb_plugin",
 ]
diff --git a/Scarb.toml b/Scarb.toml
index 7fb7c15a4..8106757db 100644
--- a/Scarb.toml
+++ b/Scarb.toml
@@ -24,8 +24,8 @@ keywords.workspace = true
 [workspace.package]
 version = "0.17.0"
 edition = "2024_07"
-cairo-version = "2.8.2"
-scarb-version = "2.8.3"
+cairo-version = "2.8.4"
+scarb-version = "2.8.4"
 authors = ["OpenZeppelin Community <maintainers@openzeppelin.org>"]
 description = "OpenZeppelin Contracts written in Cairo for Starknet, a decentralized ZK Rollup"
 documentation = "https://docs.openzeppelin.com/contracts-cairo"
@@ -40,9 +40,9 @@ keywords = [
 ]
 
 [workspace.dependencies]
-assert_macros = "2.8.2"
-starknet = "2.8.2"
-snforge_std = "0.30.0"
+assert_macros = "2.8.4"
+starknet = "2.8.4"
+snforge_std = "0.31.0"
 
 [dependencies]
 starknet.workspace = true
@@ -59,7 +59,6 @@ openzeppelin_upgrades = { path = "packages/upgrades" }
 openzeppelin_utils = { path = "packages/utils" }
 
 [dev-dependencies]
-assert_macros.workspace = true
 snforge_std.workspace = true
 openzeppelin_test_common = { path = "packages/test_common" }
 openzeppelin_testing = { path = "packages/testing" }
diff --git a/docs/modules/ROOT/pages/index.adoc b/docs/modules/ROOT/pages/index.adoc
index 59e49dd23..9c673c5c8 100644
--- a/docs/modules/ROOT/pages/index.adoc
+++ b/docs/modules/ROOT/pages/index.adoc
@@ -21,8 +21,8 @@ before proceeding, and run the following command to check that the installation
 ----
 $ scarb --version
 
-scarb 2.8.3 (54938ce3b 2024-09-26)
-cairo: 2.8.2 (https://crates.io/crates/cairo-lang-compiler/2.8.2)
+scarb 2.8.4 (2aa4e193e 2024-10-07)
+cairo: 2.8.4 (https://crates.io/crates/cairo-lang-compiler/2.8.4)
 sierra: 1.6.0
 ----
 
diff --git a/packages/access/src/lib.cairo b/packages/access/src/lib.cairo
index b9ab604d4..5c758695e 100644
--- a/packages/access/src/lib.cairo
+++ b/packages/access/src/lib.cairo
@@ -1,4 +1,5 @@
 pub mod accesscontrol;
 pub mod ownable;
 
-pub mod tests;
+#[cfg(test)]
+mod tests;
diff --git a/packages/account/Scarb.toml b/packages/account/Scarb.toml
index df108ed9f..f6d5645f5 100644
--- a/packages/account/Scarb.toml
+++ b/packages/account/Scarb.toml
@@ -38,3 +38,12 @@ openzeppelin_test_common = { path = "../test_common" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_account_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::account::DualCaseAccountMock",
+    "openzeppelin_test_common::mocks::account::DualCaseEthAccountMock",
+    "openzeppelin_test_common::mocks::src9::SRC9AccountMock",
+    "openzeppelin_test_common::mocks::simple::SimpleMock",
+]
diff --git a/packages/account/src/lib.cairo b/packages/account/src/lib.cairo
index 366b3eb8f..f26af3904 100644
--- a/packages/account/src/lib.cairo
+++ b/packages/account/src/lib.cairo
@@ -3,7 +3,8 @@ pub mod eth_account;
 pub mod extensions;
 pub mod interface;
 
-pub mod tests;
+#[cfg(test)]
+mod tests;
 pub mod utils;
 
 pub use account::AccountComponent;
diff --git a/packages/finance/Scarb.toml b/packages/finance/Scarb.toml
index e1cdf8cb5..6b357bdce 100644
--- a/packages/finance/Scarb.toml
+++ b/packages/finance/Scarb.toml
@@ -37,3 +37,11 @@ openzeppelin_test_common = { path = "../test_common" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_finance_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::vesting::LinearVestingMock",
+    "openzeppelin_test_common::mocks::vesting::StepsVestingMock",
+    "openzeppelin_test_common::mocks::vesting::ERC20OptionalTransferPanicMock",
+]
diff --git a/packages/finance/src/lib.cairo b/packages/finance/src/lib.cairo
index a5a96a4c0..c8f018c2e 100644
--- a/packages/finance/src/lib.cairo
+++ b/packages/finance/src/lib.cairo
@@ -1,2 +1,4 @@
+#[cfg(test)]
 mod tests;
+
 pub mod vesting;
diff --git a/packages/governance/Scarb.toml b/packages/governance/Scarb.toml
index dfc2f80b5..c35180b44 100644
--- a/packages/governance/Scarb.toml
+++ b/packages/governance/Scarb.toml
@@ -29,8 +29,9 @@ openzeppelin_introspection = { path = "../introspection" }
 [dev-dependencies]
 assert_macros.workspace = true
 snforge_std.workspace = true
-openzeppelin_testing = { path = "../testing" }
 openzeppelin_utils = { path = "../utils" }
+openzeppelin_testing = { path = "../testing" }
+openzeppelin_test_common = { path = "../test_common" }
 
 [lib]
 
@@ -38,3 +39,11 @@ openzeppelin_utils = { path = "../utils" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_governance_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::timelock::TimelockControllerMock",
+    "openzeppelin_test_common::mocks::timelock::MockContract",
+    "openzeppelin_test_common::mocks::timelock::TimelockAttackerMock",
+]
diff --git a/packages/governance/src/lib.cairo b/packages/governance/src/lib.cairo
index 852e24521..1320484fb 100644
--- a/packages/governance/src/lib.cairo
+++ b/packages/governance/src/lib.cairo
@@ -1,3 +1,4 @@
+#[cfg(test)]
 mod tests;
 
 pub mod timelock;
diff --git a/packages/introspection/Scarb.toml b/packages/introspection/Scarb.toml
index c9567c1e9..32049773b 100644
--- a/packages/introspection/Scarb.toml
+++ b/packages/introspection/Scarb.toml
@@ -28,6 +28,7 @@ starknet.workspace = true
 [dev-dependencies]
 assert_macros.workspace = true
 snforge_std.workspace = true
+openzeppelin_test_common = { path = "../test_common" }
 
 [lib]
 
diff --git a/packages/introspection/src/lib.cairo b/packages/introspection/src/lib.cairo
index 6134bb225..01a03e7d8 100644
--- a/packages/introspection/src/lib.cairo
+++ b/packages/introspection/src/lib.cairo
@@ -1,4 +1,5 @@
 pub mod interface;
 pub mod src5;
 
+#[cfg(test)]
 mod tests;
diff --git a/packages/presets/Scarb.toml b/packages/presets/Scarb.toml
index 2b7d7c2d9..7ed4414f4 100644
--- a/packages/presets/Scarb.toml
+++ b/packages/presets/Scarb.toml
@@ -42,3 +42,19 @@ openzeppelin_test_common = { path = "../test_common" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_presets_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::account::DualCaseAccountMock",
+    "openzeppelin_test_common::mocks::account::SnakeAccountMock",
+    "openzeppelin_test_common::mocks::account::SnakeEthAccountMock",
+    "openzeppelin_test_common::mocks::erc20::DualCaseERC20Mock",
+    "openzeppelin_test_common::mocks::erc20::SnakeERC20Mock",
+    "openzeppelin_test_common::mocks::erc721::SnakeERC721Mock",
+    "openzeppelin_test_common::mocks::erc721::DualCaseERC721ReceiverMock",
+    "openzeppelin_test_common::mocks::erc1155::DualCaseERC1155ReceiverMock",
+    "openzeppelin_test_common::mocks::erc1155::SnakeERC1155Mock",
+    "openzeppelin_test_common::mocks::src5::SRC5Mock",
+    "openzeppelin_test_common::mocks::non_implementing::NonImplementingMock",
+]
diff --git a/packages/presets/src/lib.cairo b/packages/presets/src/lib.cairo
index 5dd344f9d..20d787138 100644
--- a/packages/presets/src/lib.cairo
+++ b/packages/presets/src/lib.cairo
@@ -5,7 +5,9 @@ pub mod erc721;
 pub mod eth_account;
 pub mod interfaces;
 
+#[cfg(test)]
 mod tests;
+
 pub mod universal_deployer;
 pub mod vesting;
 
diff --git a/packages/security/Scarb.toml b/packages/security/Scarb.toml
index 1e8262f2e..37d03ab2f 100644
--- a/packages/security/Scarb.toml
+++ b/packages/security/Scarb.toml
@@ -28,6 +28,7 @@ starknet.workspace = true
 assert_macros.workspace = true
 snforge_std.workspace = true
 openzeppelin_testing = { path = "../testing" }
+openzeppelin_test_common = { path = "../test_common" }
 
 [lib]
 
@@ -35,3 +36,10 @@ openzeppelin_testing = { path = "../testing" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_security_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::security::ReentrancyMock",
+    "openzeppelin_test_common::mocks::security::Attacker",
+]
diff --git a/packages/security/src/lib.cairo b/packages/security/src/lib.cairo
index f8ecbcedc..d479f9e05 100644
--- a/packages/security/src/lib.cairo
+++ b/packages/security/src/lib.cairo
@@ -3,6 +3,7 @@ pub mod interface;
 pub mod pausable;
 pub mod reentrancyguard;
 
+#[cfg(test)]
 mod tests;
 
 pub use initializable::InitializableComponent;
diff --git a/packages/token/Scarb.toml b/packages/token/Scarb.toml
index 158519166..92e74c40b 100644
--- a/packages/token/Scarb.toml
+++ b/packages/token/Scarb.toml
@@ -41,3 +41,13 @@ openzeppelin_test_common = { path = "../test_common" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_token_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::account::DualCaseAccountMock",
+    "openzeppelin_test_common::mocks::erc721::DualCaseERC721ReceiverMock",
+    "openzeppelin_test_common::mocks::erc1155::DualCaseERC1155ReceiverMock",
+    "openzeppelin_test_common::mocks::non_implementing::NonImplementingMock",
+    "openzeppelin_test_common::mocks::src5::SRC5Mock",
+]
diff --git a/packages/token/src/common/erc2981/erc2981.cairo b/packages/token/src/common/erc2981/erc2981.cairo
index 42ef33c36..2355e50b8 100644
--- a/packages/token/src/common/erc2981/erc2981.cairo
+++ b/packages/token/src/common/erc2981/erc2981.cairo
@@ -247,7 +247,7 @@ pub impl DefaultConfig of ERC2981Component::ImmutableConfig {
 
 #[cfg(test)]
 mod tests {
-    use crate::tests::mocks::erc2981_mocks::ERC2981Mock;
+    use openzeppelin_test_common::mocks::erc2981::ERC2981Mock;
     use starknet::contract_address_const;
     use super::ERC2981Component::InternalImpl;
     use super::ERC2981Component;
diff --git a/packages/token/src/lib.cairo b/packages/token/src/lib.cairo
index e158d0e7d..43b3de05d 100644
--- a/packages/token/src/lib.cairo
+++ b/packages/token/src/lib.cairo
@@ -3,4 +3,5 @@ pub mod erc1155;
 pub mod erc20;
 pub mod erc721;
 
+#[cfg(test)]
 pub mod tests;
diff --git a/packages/upgrades/Scarb.toml b/packages/upgrades/Scarb.toml
index a059c95c0..7e253af2d 100644
--- a/packages/upgrades/Scarb.toml
+++ b/packages/upgrades/Scarb.toml
@@ -36,3 +36,10 @@ openzeppelin_test_common = { path = "../test_common" }
 allowed-libfuncs-list.name = "experimental"
 sierra = true
 casm = false
+
+[[test]]
+name = "openzeppelin_upgrades_unittest"
+build-external-contracts = [
+    "openzeppelin_test_common::mocks::upgrades::UpgradesV1",
+    "openzeppelin_test_common::mocks::upgrades::UpgradesV2",
+]
diff --git a/packages/upgrades/src/lib.cairo b/packages/upgrades/src/lib.cairo
index 1f6920e8c..bd960aff0 100644
--- a/packages/upgrades/src/lib.cairo
+++ b/packages/upgrades/src/lib.cairo
@@ -1,5 +1,6 @@
 pub mod interface;
 
+#[cfg(test)]
 pub mod tests;
 pub mod upgradeable;
 
diff --git a/packages/utils/Scarb.toml b/packages/utils/Scarb.toml
index ac9b18f1f..0454fc82d 100644
--- a/packages/utils/Scarb.toml
+++ b/packages/utils/Scarb.toml
@@ -29,6 +29,7 @@ starknet.workspace = true
 assert_macros.workspace = true
 snforge_std.workspace = true
 openzeppelin_testing = { path = "../testing" }
+openzeppelin_test_common = { path = "../test_common" }
 
 [lib]
 


Test patch:
diff --git a/packages/access/src/tests.cairo b/packages/access/src/tests.cairo
index 4cb72b65b..173ef02da 100644
--- a/packages/access/src/tests.cairo
+++ b/packages/access/src/tests.cairo
@@ -1,8 +1,3 @@
-pub(crate) mod mocks;
-
-#[cfg(test)]
 mod test_accesscontrol;
-#[cfg(test)]
 mod test_ownable;
-#[cfg(test)]
 mod test_ownable_twostep;
diff --git a/packages/access/src/tests/mocks.cairo b/packages/access/src/tests/mocks.cairo
deleted file mode 100644
index 4f4ebc2d9..000000000
--- a/packages/access/src/tests/mocks.cairo
+++ /dev/null
@@ -1,2 +0,0 @@
-pub(crate) mod accesscontrol_mocks;
-pub(crate) mod ownable_mocks;
diff --git a/packages/access/src/tests/mocks/accesscontrol_mocks.cairo b/packages/access/src/tests/mocks/accesscontrol_mocks.cairo
deleted file mode 100644
index 13f0b8722..000000000
--- a/packages/access/src/tests/mocks/accesscontrol_mocks.cairo
+++ /dev/null
@@ -1,39 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseAccessControlMock {
-    use crate::accesscontrol::AccessControlComponent;
-    use crate::accesscontrol::DEFAULT_ADMIN_ROLE;
-    use openzeppelin_introspection::src5::SRC5Component;
-    use starknet::ContractAddress;
-
-    component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // AccessControlMixin
-    #[abi(embed_v0)]
-    impl AccessControlMixinImpl =
-        AccessControlComponent::AccessControlMixinImpl<ContractState>;
-    impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub accesscontrol: AccessControlComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        AccessControlEvent: AccessControlComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, admin: ContractAddress) {
-        self.accesscontrol.initializer();
-        self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, admin);
-    }
-}
diff --git a/packages/access/src/tests/mocks/ownable_mocks.cairo b/packages/access/src/tests/mocks/ownable_mocks.cairo
deleted file mode 100644
index 996a23f91..000000000
--- a/packages/access/src/tests/mocks/ownable_mocks.cairo
+++ /dev/null
@@ -1,60 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseOwnableMock {
-    use crate::ownable::OwnableComponent;
-    use starknet::ContractAddress;
-
-    component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
-
-    #[abi(embed_v0)]
-    impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;
-    impl InternalImpl = OwnableComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub ownable: OwnableComponent::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        OwnableEvent: OwnableComponent::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, owner: ContractAddress) {
-        self.ownable.initializer(owner);
-    }
-}
-
-#[starknet::contract]
-pub(crate) mod DualCaseTwoStepOwnableMock {
-    use crate::ownable::OwnableComponent;
-    use starknet::ContractAddress;
-
-    component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
-
-    #[abi(embed_v0)]
-    impl OwnableTwoStepMixinImpl =
-        OwnableComponent::OwnableTwoStepMixinImpl<ContractState>;
-    impl InternalImpl = OwnableComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        ownable: OwnableComponent::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        OwnableEvent: OwnableComponent::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, owner: ContractAddress) {
-        self.ownable.initializer(owner);
-    }
-}
diff --git a/packages/access/src/tests/test_accesscontrol.cairo b/packages/access/src/tests/test_accesscontrol.cairo
index 9f06a54da..81adcddfb 100644
--- a/packages/access/src/tests/test_accesscontrol.cairo
+++ b/packages/access/src/tests/test_accesscontrol.cairo
@@ -3,8 +3,8 @@ use crate::accesscontrol::AccessControlComponent::{
 };
 use crate::accesscontrol::interface::{IAccessControl, IAccessControlCamel, IACCESSCONTROL_ID};
 use crate::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};
-use crate::tests::mocks::accesscontrol_mocks::DualCaseAccessControlMock;
 use openzeppelin_introspection::interface::ISRC5;
+use openzeppelin_test_common::mocks::access::DualCaseAccessControlMock;
 use openzeppelin_testing::constants::{
     ADMIN, AUTHORIZED, OTHER, OTHER_ADMIN, ROLE, OTHER_ROLE, ZERO
 };
diff --git a/packages/access/src/tests/test_ownable.cairo b/packages/access/src/tests/test_ownable.cairo
index 0c7fed3aa..46c9d56da 100644
--- a/packages/access/src/tests/test_ownable.cairo
+++ b/packages/access/src/tests/test_ownable.cairo
@@ -2,8 +2,7 @@ use core::num::traits::Zero;
 use crate::ownable::OwnableComponent::InternalTrait;
 use crate::ownable::OwnableComponent;
 use crate::ownable::interface::{IOwnable, IOwnableCamelOnly};
-use crate::tests::mocks::ownable_mocks::DualCaseOwnableMock;
-
+use openzeppelin_test_common::mocks::access::DualCaseOwnableMock;
 use openzeppelin_test_common::ownable::OwnableSpyHelpers;
 use openzeppelin_testing::constants::{ZERO, OTHER, OWNER, RECIPIENT};
 use snforge_std::{spy_events, test_address, start_cheat_caller_address};
diff --git a/packages/access/src/tests/test_ownable_twostep.cairo b/packages/access/src/tests/test_ownable_twostep.cairo
index eff125e82..ec6d6242b 100644
--- a/packages/access/src/tests/test_ownable_twostep.cairo
+++ b/packages/access/src/tests/test_ownable_twostep.cairo
@@ -2,7 +2,7 @@ use core::num::traits::Zero;
 use crate::ownable::OwnableComponent::{InternalTrait, OwnershipTransferStarted};
 use crate::ownable::OwnableComponent;
 use crate::ownable::interface::{IOwnableTwoStep, IOwnableTwoStepCamelOnly};
-use crate::tests::mocks::ownable_mocks::DualCaseTwoStepOwnableMock;
+use openzeppelin_test_common::mocks::access::DualCaseTwoStepOwnableMock;
 use openzeppelin_test_common::ownable::OwnableSpyHelpers;
 use openzeppelin_testing::constants::{ZERO, OWNER, OTHER, NEW_OWNER};
 use openzeppelin_testing::events::EventSpyExt;
diff --git a/packages/account/src/tests.cairo b/packages/account/src/tests.cairo
index 660465d02..0780cf6a0 100644
--- a/packages/account/src/tests.cairo
+++ b/packages/account/src/tests.cairo
@@ -1,11 +1,6 @@
 mod extensions;
-pub(crate) mod mocks;
 
-#[cfg(test)]
 mod test_account;
-#[cfg(test)]
 mod test_eth_account;
-#[cfg(test)]
 mod test_secp256k1;
-#[cfg(test)]
 mod test_signature;
diff --git a/packages/account/src/tests/extensions.cairo b/packages/account/src/tests/extensions.cairo
index ea5d3f334..b3ecde616 100644
--- a/packages/account/src/tests/extensions.cairo
+++ b/packages/account/src/tests/extensions.cairo
@@ -1,4 +1,2 @@
-#[cfg(test)]
 mod test_snip12_utils;
-#[cfg(test)]
 mod test_src9;
diff --git a/packages/account/src/tests/extensions/test_src9.cairo b/packages/account/src/tests/extensions/test_src9.cairo
index 74f098489..9547ce586 100644
--- a/packages/account/src/tests/extensions/test_src9.cairo
+++ b/packages/account/src/tests/extensions/test_src9.cairo
@@ -3,8 +3,8 @@ use crate::extensions::SRC9Component;
 use crate::extensions::src9::interface::{ISRC9_V2Dispatcher, ISRC9_V2DispatcherTrait};
 use crate::extensions::src9::interface::{OutsideExecution, ISRC9_V2_ID};
 use crate::extensions::src9::snip12_utils::OutsideExecutionStructHash;
-use crate::tests::mocks::src9_mocks::SRC9AccountMock;
 use openzeppelin_introspection::interface::{ISRC5, ISRC5_ID};
+use openzeppelin_test_common::mocks::src9::SRC9AccountMock;
 use openzeppelin_testing as utils;
 use openzeppelin_testing::constants::{RECIPIENT, OWNER, OTHER, FELT_VALUE};
 use openzeppelin_utils::cryptography::snip12::OffchainMessageHash;
diff --git a/packages/account/src/tests/mocks.cairo b/packages/account/src/tests/mocks.cairo
deleted file mode 100644
index e9e44bf5d..000000000
--- a/packages/account/src/tests/mocks.cairo
+++ /dev/null
@@ -1,4 +0,0 @@
-pub(crate) mod account_mocks;
-pub(crate) mod eth_account_mocks;
-pub(crate) mod simple_mock;
-pub(crate) mod src9_mocks;
diff --git a/packages/account/src/tests/mocks/account_mocks.cairo b/packages/account/src/tests/mocks/account_mocks.cairo
deleted file mode 100644
index 893a339c1..000000000
--- a/packages/account/src/tests/mocks/account_mocks.cairo
+++ /dev/null
@@ -1,45 +0,0 @@
-#[starknet::contract(account)]
-pub(crate) mod DualCaseAccountMock {
-    use crate::AccountComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: AccountComponent, storage: account, event: AccountEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // Account
-    #[abi(embed_v0)]
-    impl SRC6Impl = AccountComponent::SRC6Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeclarerImpl = AccountComponent::DeclarerImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeployableImpl = AccountComponent::DeployableImpl<ContractState>;
-    impl AccountInternalImpl = AccountComponent::InternalImpl<ContractState>;
-
-    // SCR5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub account: AccountComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        AccountEvent: AccountComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, public_key: felt252) {
-        self.account.initializer(public_key);
-    }
-}
diff --git a/packages/account/src/tests/mocks/eth_account_mocks.cairo b/packages/account/src/tests/mocks/eth_account_mocks.cairo
deleted file mode 100644
index 71ddeb787..000000000
--- a/packages/account/src/tests/mocks/eth_account_mocks.cairo
+++ /dev/null
@@ -1,43 +0,0 @@
-#[starknet::contract(account)]
-pub(crate) mod DualCaseEthAccountMock {
-    use crate::EthAccountComponent;
-    use crate::interface::EthPublicKey;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    #[abi(embed_v0)]
-    impl SRC6Impl = EthAccountComponent::SRC6Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeclarerImpl = EthAccountComponent::DeclarerImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeployableImpl = EthAccountComponent::DeployableImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-    impl EthAccountInternalImpl = EthAccountComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub eth_account: EthAccountComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        EthAccountEvent: EthAccountComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, public_key: EthPublicKey) {
-        self.eth_account.initializer(public_key);
-    }
-}
diff --git a/packages/account/src/tests/test_account.cairo b/packages/account/src/tests/test_account.cairo
index 9b906e756..4924f3ab4 100644
--- a/packages/account/src/tests/test_account.cairo
+++ b/packages/account/src/tests/test_account.cairo
@@ -4,11 +4,11 @@ use crate::AccountComponent::{PublicKeyCamelImpl, PublicKeyImpl};
 use crate::AccountComponent;
 use crate::interface::{AccountABIDispatcherTrait, AccountABIDispatcher};
 use crate::interface::{ISRC6, ISRC6_ID};
-use crate::tests::mocks::account_mocks::DualCaseAccountMock;
-use crate::tests::mocks::simple_mock::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait};
 use openzeppelin_introspection::interface::{ISRC5, ISRC5_ID};
 use openzeppelin_test_common::account::{AccountSpyHelpers, SignedTransactionData};
 use openzeppelin_test_common::account::{SIGNED_TX_DATA, get_accept_ownership_signature};
+use openzeppelin_test_common::mocks::account::DualCaseAccountMock;
+use openzeppelin_test_common::mocks::simple::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait};
 use openzeppelin_testing as utils;
 use openzeppelin_testing::constants::stark::{KEY_PAIR, KEY_PAIR_2};
 use openzeppelin_testing::constants::{
diff --git a/packages/account/src/tests/test_eth_account.cairo b/packages/account/src/tests/test_eth_account.cairo
index cae546168..cfa32e99e 100644
--- a/packages/account/src/tests/test_eth_account.cairo
+++ b/packages/account/src/tests/test_eth_account.cairo
@@ -3,8 +3,6 @@ use crate::EthAccountComponent::{PublicKeyCamelImpl, PublicKeyImpl};
 use crate::EthAccountComponent;
 use crate::interface::{EthAccountABIDispatcherTrait, EthAccountABIDispatcher};
 use crate::interface::{ISRC6, ISRC6_ID};
-use crate::tests::mocks::eth_account_mocks::DualCaseEthAccountMock;
-use crate::tests::mocks::simple_mock::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait};
 use crate::utils::secp256k1::{DebugSecp256k1Point, Secp256k1PointPartialEq};
 use crate::utils::signature::EthSignature;
 use openzeppelin_introspection::interface::{ISRC5, ISRC5_ID};
@@ -12,6 +10,8 @@ use openzeppelin_test_common::eth_account::EthAccountSpyHelpers;
 use openzeppelin_test_common::eth_account::{
     SIGNED_TX_DATA, SignedTransactionData, get_accept_ownership_signature
 };
+use openzeppelin_test_common::mocks::account::DualCaseEthAccountMock;
+use openzeppelin_test_common::mocks::simple::{ISimpleMockDispatcher, ISimpleMockDispatcherTrait};
 use openzeppelin_testing as utils;
 use openzeppelin_testing::constants::secp256k1::{KEY_PAIR, KEY_PAIR_2};
 use openzeppelin_testing::constants::{
diff --git a/packages/finance/src/tests.cairo b/packages/finance/src/tests.cairo
index 2ccfca4b9..cb61539ba 100644
--- a/packages/finance/src/tests.cairo
+++ b/packages/finance/src/tests.cairo
@@ -1,7 +1,4 @@
-#[cfg(test)]
 pub(crate) mod common;
-pub(crate) mod mocks;
-#[cfg(test)]
+
 mod test_vesting_linear;
-#[cfg(test)]
 mod test_vesting_steps;
diff --git a/packages/finance/src/tests/common.cairo b/packages/finance/src/tests/common.cairo
index 8dc623a80..bad9056f6 100644
--- a/packages/finance/src/tests/common.cairo
+++ b/packages/finance/src/tests/common.cairo
@@ -51,7 +51,7 @@ fn deploy_erc20_mock(recipient: ContractAddress, initial_supply: u256) -> IERC20
     calldata.append_serde(initial_supply);
     calldata.append_serde(recipient);
 
-    let contract_address = utils::declare_and_deploy("ERC20Mock", calldata);
+    let contract_address = utils::declare_and_deploy("ERC20OptionalTransferPanicMock", calldata);
     IERC20Dispatcher { contract_address }
 }
 
diff --git a/packages/finance/src/tests/mocks.cairo b/packages/finance/src/tests/mocks.cairo
deleted file mode 100644
index c5a78361f..000000000
--- a/packages/finance/src/tests/mocks.cairo
+++ /dev/null
@@ -1,2 +0,0 @@
-pub(crate) mod erc20_mocks;
-pub(crate) mod vesting_mocks;
diff --git a/packages/finance/src/tests/mocks/erc20_mocks.cairo b/packages/finance/src/tests/mocks/erc20_mocks.cairo
deleted file mode 100644
index 21bdec7d9..000000000
--- a/packages/finance/src/tests/mocks/erc20_mocks.cairo
+++ /dev/null
@@ -1,91 +0,0 @@
-#[starknet::contract]
-pub(crate) mod ERC20Mock {
-    use openzeppelin_token::erc20::interface::IERC20;
-    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
-    use starknet::ContractAddress;
-    use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
-
-    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
-
-    #[abi(embed_v0)]
-    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
-
-    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
-
-    #[storage]
-    struct Storage {
-        transfer_should_fail: bool,
-        #[substorage(v0)]
-        erc20: ERC20Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC20Event: ERC20Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        initial_supply: u256,
-        recipient: ContractAddress
-    ) {
-        self.erc20.initializer(name, symbol);
-        self.erc20.mint(recipient, initial_supply);
-    }
-
-    #[abi(embed_v0)]
-    impl ERC20Impl of IERC20<ContractState> {
-        fn total_supply(self: @ContractState) -> u256 {
-            self.erc20.total_supply()
-        }
-
-        fn balance_of(self: @ContractState, account: ContractAddress) -> u256 {
-            self.erc20.balance_of(account)
-        }
-
-        fn allowance(
-            self: @ContractState, owner: ContractAddress, spender: ContractAddress
-        ) -> u256 {
-            self.erc20.allowance(owner, spender)
-        }
-
-        fn transfer(ref self: ContractState, recipient: ContractAddress, amount: u256) -> bool {
-            if self.transfer_should_fail.read() {
-                false
-            } else {
-                self.erc20.transfer(recipient, amount)
-            }
-        }
-
-        fn transfer_from(
-            ref self: ContractState,
-            sender: ContractAddress,
-            recipient: ContractAddress,
-            amount: u256
-        ) -> bool {
-            if self.transfer_should_fail.read() {
-                false
-            } else {
-                self.erc20.transfer_from(sender, recipient, amount)
-            }
-        }
-
-        fn approve(ref self: ContractState, spender: ContractAddress, amount: u256) -> bool {
-            self.erc20.approve(spender, amount)
-        }
-    }
-
-    #[generate_trait]
-    #[abi(per_item)]
-    impl ExternalImpl of ExternalTrait {
-        #[external(v0)]
-        fn set_transfer_should_fail(ref self: ContractState, should_fail: bool) {
-            self.transfer_should_fail.write(should_fail);
-        }
-    }
-}
diff --git a/packages/finance/src/tests/test_vesting_linear.cairo b/packages/finance/src/tests/test_vesting_linear.cairo
index 8ed5ecf4b..fc4045c8a 100644
--- a/packages/finance/src/tests/test_vesting_linear.cairo
+++ b/packages/finance/src/tests/test_vesting_linear.cairo
@@ -1,9 +1,9 @@
 use crate::tests::common::{VestingStrategy, TestData, setup, set_transfer_to_fail};
-use crate::tests::mocks::vesting_mocks::LinearVestingMock;
 use crate::vesting::VestingComponent::InternalImpl;
 use crate::vesting::VestingComponent;
 use crate::vesting::interface::IVestingDispatcherTrait;
 use openzeppelin_access::ownable::interface::{IOwnableDispatcher, IOwnableDispatcherTrait};
+use openzeppelin_test_common::mocks::vesting::LinearVestingMock;
 use openzeppelin_test_common::vesting::VestingSpyHelpers;
 use openzeppelin_testing::constants::{OWNER, OTHER};
 use openzeppelin_token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
diff --git a/packages/finance/src/tests/test_vesting_steps.cairo b/packages/finance/src/tests/test_vesting_steps.cairo
index 9c71eb043..a1ec4cbfc 100644
--- a/packages/finance/src/tests/test_vesting_steps.cairo
+++ b/packages/finance/src/tests/test_vesting_steps.cairo
@@ -1,9 +1,9 @@
 use crate::tests::common::{VestingStrategy, TestData, setup, set_transfer_to_fail};
-use crate::tests::mocks::vesting_mocks::StepsVestingMock;
 use crate::vesting::VestingComponent::InternalImpl;
 use crate::vesting::VestingComponent;
 use crate::vesting::interface::IVestingDispatcherTrait;
 use openzeppelin_access::ownable::interface::{IOwnableDispatcher, IOwnableDispatcherTrait};
+use openzeppelin_test_common::mocks::vesting::StepsVestingMock;
 use openzeppelin_test_common::vesting::VestingSpyHelpers;
 use openzeppelin_testing::constants::{OWNER, OTHER};
 use openzeppelin_token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
diff --git a/packages/governance/src/tests.cairo b/packages/governance/src/tests.cairo
index 221670eec..3aa8297b3 100644
--- a/packages/governance/src/tests.cairo
+++ b/packages/governance/src/tests.cairo
@@ -1,6 +1,2 @@
-pub(crate) mod mocks;
-
-#[cfg(test)]
 mod test_timelock;
-#[cfg(test)]
 mod test_utils;
diff --git a/packages/governance/src/tests/mocks.cairo b/packages/governance/src/tests/mocks.cairo
deleted file mode 100644
index 6d38a6715..000000000
--- a/packages/governance/src/tests/mocks.cairo
+++ /dev/null
@@ -1,2 +0,0 @@
-pub(crate) mod non_implementing_mock;
-pub(crate) mod timelock_mocks;
diff --git a/packages/governance/src/tests/test_timelock.cairo b/packages/governance/src/tests/test_timelock.cairo
index a110683b5..5851ab178 100644
--- a/packages/governance/src/tests/test_timelock.cairo
+++ b/packages/governance/src/tests/test_timelock.cairo
@@ -1,8 +1,5 @@
 use core::hash::{HashStateTrait, HashStateExTrait};
 use core::pedersen::PedersenTrait;
-use crate::tests::mocks::timelock_mocks::{IMockContractDispatcher, IMockContractDispatcherTrait};
-use crate::tests::mocks::timelock_mocks::{ITimelockAttackerDispatcher};
-use crate::tests::mocks::timelock_mocks::{TimelockControllerMock};
 use crate::timelock::OperationState;
 use crate::timelock::TimelockControllerComponent::{
     CallScheduled, CallExecuted, CallSalt, CallCancelled, MinDelayChanged
@@ -21,6 +18,11 @@ use openzeppelin_access::accesscontrol::interface::IACCESSCONTROL_ID;
 use openzeppelin_access::accesscontrol::interface::IAccessControl;
 use openzeppelin_introspection::interface::ISRC5_ID;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
+use openzeppelin_test_common::mocks::timelock::ITimelockAttackerDispatcher;
+use openzeppelin_test_common::mocks::timelock::TimelockControllerMock;
+use openzeppelin_test_common::mocks::timelock::{
+    IMockContractDispatcher, IMockContractDispatcherTrait
+};
 use openzeppelin_testing as utils;
 use openzeppelin_testing::constants::{ADMIN, ZERO, OTHER, SALT, FELT_VALUE as VALUE};
 use openzeppelin_testing::events::EventSpyExt;
diff --git a/packages/introspection/src/tests.cairo b/packages/introspection/src/tests.cairo
index 72a21d551..32094b462 100644
--- a/packages/introspection/src/tests.cairo
+++ b/packages/introspection/src/tests.cairo
@@ -1,4 +1,1 @@
-pub(crate) mod mocks;
-
-#[cfg(test)]
 mod test_src5;
diff --git a/packages/introspection/src/tests/mocks.cairo b/packages/introspection/src/tests/mocks.cairo
deleted file mode 100644
index dc995e8e3..000000000
--- a/packages/introspection/src/tests/mocks.cairo
+++ /dev/null
@@ -1,1 +0,0 @@
-pub(crate) mod src5_mocks;
diff --git a/packages/introspection/src/tests/mocks/src5_mocks.cairo b/packages/introspection/src/tests/mocks/src5_mocks.cairo
deleted file mode 100644
index 81e65d236..000000000
--- a/packages/introspection/src/tests/mocks/src5_mocks.cairo
+++ /dev/null
@@ -1,22 +0,0 @@
-#[starknet::contract]
-pub(crate) mod SRC5Mock {
-    use crate::src5::SRC5Component;
-
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-}
diff --git a/packages/introspection/src/tests/test_src5.cairo b/packages/introspection/src/tests/test_src5.cairo
index 1f131eeab..0473c8f31 100644
--- a/packages/introspection/src/tests/test_src5.cairo
+++ b/packages/introspection/src/tests/test_src5.cairo
@@ -1,7 +1,7 @@
 use crate::interface::{ISRC5_ID, ISRC5};
 use crate::src5::SRC5Component::InternalTrait;
 use crate::src5::SRC5Component;
-use crate::tests::mocks::src5_mocks::SRC5Mock;
+use openzeppelin_test_common::mocks::src5::SRC5Mock;
 
 const OTHER_ID: felt252 = 0x12345678;
 
diff --git a/packages/presets/src/tests.cairo b/packages/presets/src/tests.cairo
index 68fc25020..211c76d41 100644
--- a/packages/presets/src/tests.cairo
+++ b/packages/presets/src/tests.cairo
@@ -1,16 +1,7 @@
-mod mocks;
-
-#[cfg(test)]
 mod test_account;
-#[cfg(test)]
 mod test_erc1155;
-#[cfg(test)]
 mod test_erc20;
-#[cfg(test)]
 mod test_erc721;
-#[cfg(test)]
 mod test_eth_account;
-#[cfg(test)]
 mod test_universal_deployer;
-#[cfg(test)]
 mod test_vesting;
diff --git a/packages/presets/src/tests/mocks.cairo b/packages/presets/src/tests/mocks.cairo
deleted file mode 100644
index 2037caeeb..000000000
--- a/packages/presets/src/tests/mocks.cairo
+++ /dev/null
@@ -1,9 +0,0 @@
-pub(crate) mod account_mocks;
-pub(crate) mod erc1155_mocks;
-pub(crate) mod erc1155_receiver_mocks;
-pub(crate) mod erc20_mocks;
-pub(crate) mod erc721_mocks;
-pub(crate) mod erc721_receiver_mocks;
-pub(crate) mod eth_account_mocks;
-pub(crate) mod non_implementing_mock;
-pub(crate) mod src5_mocks;
diff --git a/packages/presets/src/tests/mocks/account_mocks.cairo b/packages/presets/src/tests/mocks/account_mocks.cairo
deleted file mode 100644
index c92013f39..000000000
--- a/packages/presets/src/tests/mocks/account_mocks.cairo
+++ /dev/null
@@ -1,87 +0,0 @@
-#[starknet::contract(account)]
-pub(crate) mod DualCaseAccountMock {
-    use openzeppelin_account::AccountComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: AccountComponent, storage: account, event: AccountEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // Account
-    #[abi(embed_v0)]
-    impl SRC6Impl = AccountComponent::SRC6Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeclarerImpl = AccountComponent::DeclarerImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeployableImpl = AccountComponent::DeployableImpl<ContractState>;
-    impl AccountInternalImpl = AccountComponent::InternalImpl<ContractState>;
-
-    // SCR5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub account: AccountComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        AccountEvent: AccountComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, public_key: felt252) {
-        self.account.initializer(public_key);
-    }
-}
-
-#[starknet::contract(account)]
-pub(crate) mod SnakeAccountMock {
-    use openzeppelin_account::AccountComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: AccountComponent, storage: account, event: AccountEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // Account
-    #[abi(embed_v0)]
-    impl SRC6Impl = AccountComponent::SRC6Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl PublicKeyImpl = AccountComponent::PublicKeyImpl<ContractState>;
-    impl AccountInternalImpl = AccountComponent::InternalImpl<ContractState>;
-
-    // SCR5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub account: AccountComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        AccountEvent: AccountComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, public_key: felt252) {
-        self.account.initializer(public_key);
-    }
-}
diff --git a/packages/presets/src/tests/mocks/erc1155_mocks.cairo b/packages/presets/src/tests/mocks/erc1155_mocks.cairo
deleted file mode 100644
index 8ebd48000..000000000
--- a/packages/presets/src/tests/mocks/erc1155_mocks.cairo
+++ /dev/null
@@ -1,50 +0,0 @@
-#[starknet::contract]
-pub(crate) mod SnakeERC1155Mock {
-    use openzeppelin_introspection::src5::SRC5Component;
-    use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};
-    use starknet::ContractAddress;
-
-    component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC1155
-    #[abi(embed_v0)]
-    impl ERC1155Impl = ERC1155Component::ERC1155Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC1155MetadataURIImpl =
-        ERC1155Component::ERC1155MetadataURIImpl<ContractState>;
-    impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc1155: ERC1155Component::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC1155Event: ERC1155Component::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        base_uri: ByteArray,
-        recipient: ContractAddress,
-        token_id: u256,
-        value: u256
-    ) {
-        self.erc1155.initializer(base_uri);
-        self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span());
-    }
-}
diff --git a/packages/presets/src/tests/mocks/erc1155_receiver_mocks.cairo b/packages/presets/src/tests/mocks/erc1155_receiver_mocks.cairo
deleted file mode 100644
index 30e722593..000000000
--- a/packages/presets/src/tests/mocks/erc1155_receiver_mocks.cairo
+++ /dev/null
@@ -1,38 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseERC1155ReceiverMock {
-    use openzeppelin_introspection::src5::SRC5Component;
-    use openzeppelin_token::erc1155::ERC1155ReceiverComponent;
-
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-    component!(
-        path: ERC1155ReceiverComponent, storage: erc1155_receiver, event: ERC1155ReceiverEvent
-    );
-
-    // ERC1155Receiver Mixin
-    #[abi(embed_v0)]
-    impl ERC1155ReceiverMixinImpl =
-        ERC1155ReceiverComponent::ERC1155ReceiverMixinImpl<ContractState>;
-    impl ERC1155ReceiverInternalImpl = ERC1155ReceiverComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc1155_receiver: ERC1155ReceiverComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC1155ReceiverEvent: ERC1155ReceiverComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState) {
-        self.erc1155_receiver.initializer();
-    }
-}
diff --git a/packages/presets/src/tests/mocks/erc20_mocks.cairo b/packages/presets/src/tests/mocks/erc20_mocks.cairo
deleted file mode 100644
index a80b5c29c..000000000
--- a/packages/presets/src/tests/mocks/erc20_mocks.cairo
+++ /dev/null
@@ -1,79 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseERC20Mock {
-    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
-    use starknet::ContractAddress;
-
-    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
-
-    #[abi(embed_v0)]
-    impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
-    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc20: ERC20Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC20Event: ERC20Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        initial_supply: u256,
-        recipient: ContractAddress
-    ) {
-        self.erc20.initializer(name, symbol);
-        self.erc20.mint(recipient, initial_supply);
-    }
-}
-
-#[starknet::contract]
-pub(crate) mod SnakeERC20Mock {
-    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
-    use starknet::ContractAddress;
-
-    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
-
-    #[abi(embed_v0)]
-    impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
-    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc20: ERC20Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC20Event: ERC20Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        initial_supply: u256,
-        recipient: ContractAddress
-    ) {
-        self.erc20.initializer(name, symbol);
-        self.erc20.mint(recipient, initial_supply);
-    }
-}
diff --git a/packages/presets/src/tests/mocks/erc721_mocks.cairo b/packages/presets/src/tests/mocks/erc721_mocks.cairo
deleted file mode 100644
index bf7357b32..000000000
--- a/packages/presets/src/tests/mocks/erc721_mocks.cairo
+++ /dev/null
@@ -1,50 +0,0 @@
-#[starknet::contract]
-pub(crate) mod SnakeERC721Mock {
-    use openzeppelin_introspection::src5::SRC5Component;
-    use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};
-    use starknet::ContractAddress;
-
-    component!(path: ERC721Component, storage: erc721, event: ERC721Event);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC721
-    #[abi(embed_v0)]
-    impl ERC721Impl = ERC721Component::ERC721Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl<ContractState>;
-    impl ERC721InternalImpl = ERC721Component::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc721: ERC721Component::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC721Event: ERC721Component::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        base_uri: ByteArray,
-        recipient: ContractAddress,
-        token_id: u256
-    ) {
-        self.erc721.initializer(name, symbol, base_uri);
-        self.erc721.mint(recipient, token_id);
-    }
-}
diff --git a/packages/presets/src/tests/mocks/erc721_receiver_mocks.cairo b/packages/presets/src/tests/mocks/erc721_receiver_mocks.cairo
deleted file mode 100644
index b18b1d647..000000000
--- a/packages/presets/src/tests/mocks/erc721_receiver_mocks.cairo
+++ /dev/null
@@ -1,71 +0,0 @@
-const SUCCESS: felt252 = 'SUCCESS';
-
-#[starknet::contract]
-pub(crate) mod DualCaseERC721ReceiverMock {
-    use openzeppelin_introspection::src5::SRC5Component;
-    use openzeppelin_token::erc721::ERC721ReceiverComponent;
-    use starknet::ContractAddress;
-
-    component!(path: ERC721ReceiverComponent, storage: erc721_receiver, event: ERC721ReceiverEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC721Receiver
-    impl ERC721ReceiverImpl = ERC721ReceiverComponent::ERC721ReceiverImpl<ContractState>;
-    impl ERC721ReceiverInternalImpl = ERC721ReceiverComponent::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc721_receiver: ERC721ReceiverComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC721ReceiverEvent: ERC721ReceiverComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState) {
-        self.erc721_receiver.initializer();
-    }
-
-    #[abi(per_item)]
-    #[generate_trait]
-    impl ExternalImpl of ExternalTrait {
-        #[external(v0)]
-        fn on_erc721_received(
-            self: @ContractState,
-            operator: ContractAddress,
-            from: ContractAddress,
-            token_id: u256,
-            data: Span<felt252>
-        ) -> felt252 {
-            if *data.at(0) == super::SUCCESS {
-                self.erc721_receiver.on_erc721_received(operator, from, token_id, data)
-            } else {
-                0
-            }
-        }
-
-        #[external(v0)]
-        fn onERC721Received(
-            self: @ContractState,
-            operator: ContractAddress,
-            from: ContractAddress,
-            tokenId: u256,
-            data: Span<felt252>
-        ) -> felt252 {
-            Self::on_erc721_received(self, operator, from, tokenId, data)
-        }
-    }
-}
diff --git a/packages/presets/src/tests/mocks/eth_account_mocks.cairo b/packages/presets/src/tests/mocks/eth_account_mocks.cairo
deleted file mode 100644
index 392bd12f8..000000000
--- a/packages/presets/src/tests/mocks/eth_account_mocks.cairo
+++ /dev/null
@@ -1,39 +0,0 @@
-#[starknet::contract(account)]
-pub(crate) mod SnakeEthAccountMock {
-    use openzeppelin_account::EthAccountComponent;
-    use openzeppelin_account::interface::EthPublicKey;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    #[abi(embed_v0)]
-    impl SRC6Impl = EthAccountComponent::SRC6Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-    impl EthAccountInternalImpl = EthAccountComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub eth_account: EthAccountComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        EthAccountEvent: EthAccountComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, public_key: EthPublicKey) {
-        self.eth_account.initializer(public_key);
-    }
-}
diff --git a/packages/presets/src/tests/mocks/non_implementing_mock.cairo b/packages/presets/src/tests/mocks/non_implementing_mock.cairo
deleted file mode 100644
index 67d632c72..000000000
--- a/packages/presets/src/tests/mocks/non_implementing_mock.cairo
+++ /dev/null
@@ -1,10 +0,0 @@
-#[starknet::contract]
-pub(crate) mod NonImplementingMock {
-    #[storage]
-    pub struct Storage {}
-
-    #[external(v0)]
-    fn nope(self: @ContractState) -> bool {
-        false
-    }
-}
diff --git a/packages/security/src/tests.cairo b/packages/security/src/tests.cairo
index 0f674d192..35c30a0e8 100644
--- a/packages/security/src/tests.cairo
+++ b/packages/security/src/tests.cairo
@@ -1,8 +1,3 @@
-pub(crate) mod mocks;
-
-#[cfg(test)]
 mod test_initializable;
-#[cfg(test)]
 mod test_pausable;
-#[cfg(test)]
 mod test_reentrancyguard;
diff --git a/packages/security/src/tests/mocks.cairo b/packages/security/src/tests/mocks.cairo
deleted file mode 100644
index 81134e172..000000000
--- a/packages/security/src/tests/mocks.cairo
+++ /dev/null
@@ -1,3 +0,0 @@
-pub(crate) mod initializable_mocks;
-pub(crate) mod pausable_mocks;
-pub(crate) mod reentrancy_mocks;
diff --git a/packages/security/src/tests/mocks/initializable_mocks.cairo b/packages/security/src/tests/mocks/initializable_mocks.cairo
deleted file mode 100644
index 096acb947..000000000
--- a/packages/security/src/tests/mocks/initializable_mocks.cairo
+++ /dev/null
@@ -1,23 +0,0 @@
-#[starknet::contract]
-pub(crate) mod InitializableMock {
-    use crate::initializable::InitializableComponent;
-
-    component!(path: InitializableComponent, storage: initializable, event: InitializableEvent);
-
-    #[abi(embed_v0)]
-    impl InitializableImpl =
-        InitializableComponent::InitializableImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub initializable: InitializableComponent::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        InitializableEvent: InitializableComponent::Event
-    }
-}
diff --git a/packages/security/src/tests/mocks/pausable_mocks.cairo b/packages/security/src/tests/mocks/pausable_mocks.cairo
deleted file mode 100644
index 383a02fdb..000000000
--- a/packages/security/src/tests/mocks/pausable_mocks.cairo
+++ /dev/null
@@ -1,23 +0,0 @@
-#[starknet::contract]
-pub(crate) mod PausableMock {
-    use crate::pausable::PausableComponent;
-
-    component!(path: PausableComponent, storage: pausable, event: PausableEvent);
-
-    #[abi(embed_v0)]
-    impl PausableImpl = PausableComponent::PausableImpl<ContractState>;
-    impl InternalImpl = PausableComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub pausable: PausableComponent::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        PausableEvent: PausableComponent::Event
-    }
-}
diff --git a/packages/security/src/tests/test_initializable.cairo b/packages/security/src/tests/test_initializable.cairo
index 6817ca6ef..0b7ac8fc7 100644
--- a/packages/security/src/tests/test_initializable.cairo
+++ b/packages/security/src/tests/test_initializable.cairo
@@ -1,6 +1,6 @@
 use crate::InitializableComponent::{InitializableImpl, InternalImpl};
 use crate::InitializableComponent;
-use crate::tests::mocks::initializable_mocks::InitializableMock;
+use openzeppelin_test_common::mocks::security::InitializableMock;
 
 type ComponentState = InitializableComponent::ComponentState<InitializableMock::ContractState>;
 
diff --git a/packages/security/src/tests/test_pausable.cairo b/packages/security/src/tests/test_pausable.cairo
index de50a5683..486819c0e 100644
--- a/packages/security/src/tests/test_pausable.cairo
+++ b/packages/security/src/tests/test_pausable.cairo
@@ -1,7 +1,7 @@
 use crate::PausableComponent::{InternalImpl, PausableImpl};
 use crate::PausableComponent::{Paused, Unpaused};
 use crate::PausableComponent;
-use crate::tests::mocks::pausable_mocks::PausableMock;
+use openzeppelin_test_common::mocks::security::PausableMock;
 use openzeppelin_testing::constants::CALLER;
 use openzeppelin_testing::events::EventSpyExt;
 use snforge_std::EventSpy;
diff --git a/packages/security/src/tests/test_reentrancyguard.cairo b/packages/security/src/tests/test_reentrancyguard.cairo
index aaa1db457..8647c9e9e 100644
--- a/packages/security/src/tests/test_reentrancyguard.cairo
+++ b/packages/security/src/tests/test_reentrancyguard.cairo
@@ -1,6 +1,6 @@
 use crate::ReentrancyGuardComponent::InternalImpl;
 use crate::ReentrancyGuardComponent;
-use crate::tests::mocks::reentrancy_mocks::{
+use openzeppelin_test_common::mocks::security::{
     ReentrancyMock, IReentrancyMockDispatcher, IReentrancyMockDispatcherTrait
 };
 use openzeppelin_testing as utils;
diff --git a/packages/test_common/Scarb.toml b/packages/test_common/Scarb.toml
index 1314cb3ea..1d488b357 100644
--- a/packages/test_common/Scarb.toml
+++ b/packages/test_common/Scarb.toml
@@ -16,13 +16,14 @@ keywords.workspace = true
 fmt.workspace = true
 
 [dependencies]
-assert_macros.workspace = true
 starknet.workspace = true
 snforge_std.workspace = true
 openzeppelin_upgrades = { path = "../upgrades" }
 openzeppelin_access = { path = "../access" }
 openzeppelin_account = { path = "../account" }
 openzeppelin_finance = { path = "../finance" }
+openzeppelin_introspection = { path = "../introspection" }
+openzeppelin_security = { path = "../security" }
 openzeppelin_token = { path = "../token" }
 openzeppelin_testing = { path = "../testing" }
 openzeppelin_utils = { path = "../utils" }
diff --git a/packages/test_common/src/lib.cairo b/packages/test_common/src/lib.cairo
index 8013cedc4..55dcb574e 100644
--- a/packages/test_common/src/lib.cairo
+++ b/packages/test_common/src/lib.cairo
@@ -3,6 +3,7 @@ pub mod erc1155;
 pub mod erc20;
 pub mod erc721;
 pub mod eth_account;
+pub mod mocks;
 pub mod ownable;
 pub mod upgrades;
 pub mod vesting;
diff --git a/packages/test_common/src/mocks.cairo b/packages/test_common/src/mocks.cairo
new file mode 100644
index 000000000..5cd4a9a96
--- /dev/null
+++ b/packages/test_common/src/mocks.cairo
@@ -0,0 +1,15 @@
+pub mod access;
+pub mod account;
+pub mod erc1155;
+pub mod erc20;
+pub mod erc2981;
+pub mod erc721;
+pub mod non_implementing;
+pub mod nonces;
+pub mod security;
+pub mod simple;
+pub mod src5;
+pub mod src9;
+pub mod timelock;
+pub mod upgrades;
+pub mod vesting;
diff --git a/packages/test_common/src/mocks/access.cairo b/packages/test_common/src/mocks/access.cairo
new file mode 100644
index 000000000..ccca94518
--- /dev/null
+++ b/packages/test_common/src/mocks/access.cairo
@@ -0,0 +1,100 @@
+#[starknet::contract]
+pub mod DualCaseAccessControlMock {
+    use openzeppelin_access::accesscontrol::AccessControlComponent;
+    use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;
+    use openzeppelin_introspection::src5::SRC5Component;
+    use starknet::ContractAddress;
+
+    component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // AccessControlMixin
+    #[abi(embed_v0)]
+    impl AccessControlMixinImpl =
+        AccessControlComponent::AccessControlMixinImpl<ContractState>;
+    impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub accesscontrol: AccessControlComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        AccessControlEvent: AccessControlComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, admin: ContractAddress) {
+        self.accesscontrol.initializer();
+        self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, admin);
+    }
+}
+
+#[starknet::contract]
+pub mod DualCaseOwnableMock {
+    use openzeppelin_access::ownable::OwnableComponent;
+    use starknet::ContractAddress;
+
+    component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
+
+    #[abi(embed_v0)]
+    impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;
+    impl InternalImpl = OwnableComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub ownable: OwnableComponent::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        OwnableEvent: OwnableComponent::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, owner: ContractAddress) {
+        self.ownable.initializer(owner);
+    }
+}
+
+#[starknet::contract]
+pub mod DualCaseTwoStepOwnableMock {
+    use openzeppelin_access::ownable::OwnableComponent;
+    use starknet::ContractAddress;
+
+    component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
+
+    #[abi(embed_v0)]
+    impl OwnableTwoStepMixinImpl =
+        OwnableComponent::OwnableTwoStepMixinImpl<ContractState>;
+    impl InternalImpl = OwnableComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        ownable: OwnableComponent::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        OwnableEvent: OwnableComponent::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, owner: ContractAddress) {
+        self.ownable.initializer(owner);
+    }
+}
diff --git a/packages/test_common/src/mocks/account.cairo b/packages/test_common/src/mocks/account.cairo
new file mode 100644
index 000000000..69c6eaf02
--- /dev/null
+++ b/packages/test_common/src/mocks/account.cairo
@@ -0,0 +1,171 @@
+#[starknet::contract(account)]
+pub mod DualCaseAccountMock {
+    use openzeppelin_account::AccountComponent;
+    use openzeppelin_introspection::src5::SRC5Component;
+
+    component!(path: AccountComponent, storage: account, event: AccountEvent);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // Account
+    #[abi(embed_v0)]
+    impl SRC6Impl = AccountComponent::SRC6Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl DeclarerImpl = AccountComponent::DeclarerImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl DeployableImpl = AccountComponent::DeployableImpl<ContractState>;
+    impl AccountInternalImpl = AccountComponent::InternalImpl<ContractState>;
+
+    // SCR5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub account: AccountComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        AccountEvent: AccountComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, public_key: felt252) {
+        self.account.initializer(public_key);
+    }
+}
+
+#[starknet::contract(account)]
+pub mod SnakeAccountMock {
+    use openzeppelin_account::AccountComponent;
+    use openzeppelin_introspection::src5::SRC5Component;
+
+    component!(path: AccountComponent, storage: account, event: AccountEvent);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // Account
+    #[abi(embed_v0)]
+    impl SRC6Impl = AccountComponent::SRC6Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl PublicKeyImpl = AccountComponent::PublicKeyImpl<ContractState>;
+    impl AccountInternalImpl = AccountComponent::InternalImpl<ContractState>;
+
+    // SCR5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub account: AccountComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        AccountEvent: AccountComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, public_key: felt252) {
+        self.account.initializer(public_key);
+    }
+}
+
+#[starknet::contract(account)]
+pub mod DualCaseEthAccountMock {
+    use openzeppelin_account::EthAccountComponent;
+    use openzeppelin_account::interface::EthPublicKey;
+    use openzeppelin_introspection::src5::SRC5Component;
+
+    component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    #[abi(embed_v0)]
+    impl SRC6Impl = EthAccountComponent::SRC6Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl DeclarerImpl = EthAccountComponent::DeclarerImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl DeployableImpl = EthAccountComponent::DeployableImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+    impl EthAccountInternalImpl = EthAccountComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub eth_account: EthAccountComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        EthAccountEvent: EthAccountComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, public_key: EthPublicKey) {
+        self.eth_account.initializer(public_key);
+    }
+}
+
+#[starknet::contract(account)]
+pub mod SnakeEthAccountMock {
+    use openzeppelin_account::EthAccountComponent;
+    use openzeppelin_account::interface::EthPublicKey;
+    use openzeppelin_introspection::src5::SRC5Component;
+
+    component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    #[abi(embed_v0)]
+    impl SRC6Impl = EthAccountComponent::SRC6Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+    impl EthAccountInternalImpl = EthAccountComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub eth_account: EthAccountComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        EthAccountEvent: EthAccountComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState, public_key: EthPublicKey) {
+        self.eth_account.initializer(public_key);
+    }
+}
diff --git a/packages/test_common/src/mocks/erc1155.cairo b/packages/test_common/src/mocks/erc1155.cairo
new file mode 100644
index 000000000..8c206e95e
--- /dev/null
+++ b/packages/test_common/src/mocks/erc1155.cairo
@@ -0,0 +1,142 @@
+#[starknet::contract]
+pub mod DualCaseERC1155Mock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};
+    use starknet::ContractAddress;
+
+    component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // ERC1155
+    #[abi(embed_v0)]
+    impl ERC1155Impl = ERC1155Component::ERC1155Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC1155MetadataURIImpl =
+        ERC1155Component::ERC1155MetadataURIImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC721Camel = ERC1155Component::ERC1155CamelImpl<ContractState>;
+    impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;
+
+    // SRC5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc1155: ERC1155Component::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC1155Event: ERC1155Component::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        base_uri: ByteArray,
+        recipient: ContractAddress,
+        token_id: u256,
+        value: u256
+    ) {
+        self.erc1155.initializer(base_uri);
+        self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span());
+    }
+}
+
+#[starknet::contract]
+pub mod SnakeERC1155Mock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};
+    use starknet::ContractAddress;
+
+    component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // ERC1155
+    #[abi(embed_v0)]
+    impl ERC1155Impl = ERC1155Component::ERC1155Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC1155MetadataURIImpl =
+        ERC1155Component::ERC1155MetadataURIImpl<ContractState>;
+    impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;
+
+    // SRC5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc1155: ERC1155Component::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC1155Event: ERC1155Component::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        base_uri: ByteArray,
+        recipient: ContractAddress,
+        token_id: u256,
+        value: u256
+    ) {
+        self.erc1155.initializer(base_uri);
+        self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span());
+    }
+}
+
+#[starknet::contract]
+pub mod DualCaseERC1155ReceiverMock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc1155::ERC1155ReceiverComponent;
+
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+    component!(
+        path: ERC1155ReceiverComponent, storage: erc1155_receiver, event: ERC1155ReceiverEvent
+    );
+
+    // ERC1155Receiver Mixin
+    #[abi(embed_v0)]
+    impl ERC1155ReceiverMixinImpl =
+        ERC1155ReceiverComponent::ERC1155ReceiverMixinImpl<ContractState>;
+    impl ERC1155ReceiverInternalImpl = ERC1155ReceiverComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc1155_receiver: ERC1155ReceiverComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC1155ReceiverEvent: ERC1155ReceiverComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState) {
+        self.erc1155_receiver.initializer();
+    }
+}
diff --git a/packages/token/src/tests/mocks/erc20_votes_mocks.cairo b/packages/test_common/src/mocks/erc20.cairo
similarity index 52%
rename from packages/token/src/tests/mocks/erc20_votes_mocks.cairo
rename to packages/test_common/src/mocks/erc20.cairo
index c777ec62f..650854aaa 100644
--- a/packages/token/src/tests/mocks/erc20_votes_mocks.cairo
+++ b/packages/test_common/src/mocks/erc20.cairo
@@ -1,8 +1,88 @@
 #[starknet::contract]
-pub(crate) mod DualCaseERC20VotesMock {
-    use crate::erc20::ERC20Component;
-    use crate::erc20::extensions::ERC20VotesComponent::InternalTrait as ERC20VotesInternalTrait;
-    use crate::erc20::extensions::ERC20VotesComponent;
+pub mod DualCaseERC20Mock {
+    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
+    use starknet::ContractAddress;
+
+    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
+
+    #[abi(embed_v0)]
+    impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
+    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc20: ERC20Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC20Event: ERC20Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        name: ByteArray,
+        symbol: ByteArray,
+        initial_supply: u256,
+        recipient: ContractAddress
+    ) {
+        self.erc20.initializer(name, symbol);
+        self.erc20.mint(recipient, initial_supply);
+    }
+}
+
+#[starknet::contract]
+pub mod SnakeERC20Mock {
+    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
+    use starknet::ContractAddress;
+
+    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
+
+    #[abi(embed_v0)]
+    impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
+    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc20: ERC20Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC20Event: ERC20Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        name: ByteArray,
+        symbol: ByteArray,
+        initial_supply: u256,
+        recipient: ContractAddress
+    ) {
+        self.erc20.initializer(name, symbol);
+        self.erc20.mint(recipient, initial_supply);
+    }
+}
+
+#[starknet::contract]
+pub mod DualCaseERC20VotesMock {
+    use openzeppelin_token::erc20::ERC20Component;
+    use openzeppelin_token::erc20::extensions::ERC20VotesComponent::InternalTrait as ERC20VotesInternalTrait;
+    use openzeppelin_token::erc20::extensions::ERC20VotesComponent;
     use openzeppelin_utils::cryptography::nonces::NoncesComponent;
     use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;
     use starknet::ContractAddress;
@@ -47,7 +127,7 @@ pub(crate) mod DualCaseERC20VotesMock {
     }
 
     /// Required for hash computation.
-    pub(crate) impl SNIP12MetadataImpl of SNIP12Metadata {
+    pub impl SNIP12MetadataImpl of SNIP12Metadata {
         fn name() -> felt252 {
             'DAPP_NAME'
         }
diff --git a/packages/token/src/tests/mocks/erc2981_mocks.cairo b/packages/test_common/src/mocks/erc2981.cairo
similarity index 92%
rename from packages/token/src/tests/mocks/erc2981_mocks.cairo
rename to packages/test_common/src/mocks/erc2981.cairo
index ead9863d4..e60da6232 100644
--- a/packages/token/src/tests/mocks/erc2981_mocks.cairo
+++ b/packages/test_common/src/mocks/erc2981.cairo
@@ -1,7 +1,7 @@
 #[starknet::contract]
-pub(crate) mod ERC2981Mock {
-    use crate::common::erc2981::{ERC2981Component, DefaultConfig};
+pub mod ERC2981Mock {
     use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::common::erc2981::{ERC2981Component, DefaultConfig};
     use starknet::ContractAddress;
 
     component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);
diff --git a/packages/test_common/src/mocks/erc721.cairo b/packages/test_common/src/mocks/erc721.cairo
new file mode 100644
index 000000000..18106dac7
--- /dev/null
+++ b/packages/test_common/src/mocks/erc721.cairo
@@ -0,0 +1,254 @@
+const SUCCESS: felt252 = 'SUCCESS';
+
+#[starknet::contract]
+pub mod DualCaseERC721Mock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};
+    use starknet::ContractAddress;
+
+    component!(path: ERC721Component, storage: erc721, event: ERC721Event);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // ERC721
+    #[abi(embed_v0)]
+    impl ERC721Impl = ERC721Component::ERC721Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC721MetadataCamelOnly =
+        ERC721Component::ERC721MetadataCamelOnlyImpl<ContractState>;
+    impl ERC721InternalImpl = ERC721Component::InternalImpl<ContractState>;
+
+    // SRC5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc721: ERC721Component::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC721Event: ERC721Component::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        name: ByteArray,
+        symbol: ByteArray,
+        base_uri: ByteArray,
+        recipient: ContractAddress,
+        token_id: u256
+    ) {
+        self.erc721.initializer(name, symbol, base_uri);
+        self.erc721.mint(recipient, token_id);
+    }
+}
+
+#[starknet::contract]
+pub mod SnakeERC721Mock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};
+    use starknet::ContractAddress;
+
+    component!(path: ERC721Component, storage: erc721, event: ERC721Event);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // ERC721
+    #[abi(embed_v0)]
+    impl ERC721Impl = ERC721Component::ERC721Impl<ContractState>;
+    #[abi(embed_v0)]
+    impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl<ContractState>;
+    impl ERC721InternalImpl = ERC721Component::InternalImpl<ContractState>;
+
+    // SRC5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc721: ERC721Component::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC721Event: ERC721Component::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        name: ByteArray,
+        symbol: ByteArray,
+        base_uri: ByteArray,
+        recipient: ContractAddress,
+        token_id: u256
+    ) {
+        self.erc721.initializer(name, symbol, base_uri);
+        self.erc721.mint(recipient, token_id);
+    }
+}
+
+#[starknet::contract]
+pub mod DualCaseERC721ReceiverMock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc721::ERC721ReceiverComponent;
+    use starknet::ContractAddress;
+
+    component!(path: ERC721ReceiverComponent, storage: erc721_receiver, event: ERC721ReceiverEvent);
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // ERC721Receiver
+    impl ERC721ReceiverImpl = ERC721ReceiverComponent::ERC721ReceiverImpl<ContractState>;
+    impl ERC721ReceiverInternalImpl = ERC721ReceiverComponent::InternalImpl<ContractState>;
+
+    // SRC5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc721_receiver: ERC721ReceiverComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC721ReceiverEvent: ERC721ReceiverComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    #[constructor]
+    fn constructor(ref self: ContractState) {
+        self.erc721_receiver.initializer();
+    }
+
+    #[abi(per_item)]
+    #[generate_trait]
+    impl ExternalImpl of ExternalTrait {
+        #[external(v0)]
+        fn on_erc721_received(
+            self: @ContractState,
+            operator: ContractAddress,
+            from: ContractAddress,
+            token_id: u256,
+            data: Span<felt252>
+        ) -> felt252 {
+            if *data.at(0) == super::SUCCESS {
+                self.erc721_receiver.on_erc721_received(operator, from, token_id, data)
+            } else {
+                0
+            }
+        }
+
+        #[external(v0)]
+        fn onERC721Received(
+            self: @ContractState,
+            operator: ContractAddress,
+            from: ContractAddress,
+            tokenId: u256,
+            data: Span<felt252>
+        ) -> felt252 {
+            Self::on_erc721_received(self, operator, from, tokenId, data)
+        }
+    }
+}
+
+#[starknet::contract]
+pub mod ERC721EnumerableMock {
+    use openzeppelin_introspection::src5::SRC5Component;
+    use openzeppelin_token::erc721::ERC721Component;
+    use openzeppelin_token::erc721::extensions::ERC721EnumerableComponent;
+    use starknet::ContractAddress;
+
+    component!(path: ERC721Component, storage: erc721, event: ERC721Event);
+    component!(
+        path: ERC721EnumerableComponent, storage: erc721_enumerable, event: ERC721EnumerableEvent
+    );
+    component!(path: SRC5Component, storage: src5, event: SRC5Event);
+
+    // ERC721
+    #[abi(embed_v0)]
+    impl ERC721MixinImpl = ERC721Component::ERC721Impl<ContractState>;
+    impl ERC721InternalImpl = ERC721Component::InternalImpl<ContractState>;
+
+    // ERC721Enumerable
+    #[abi(embed_v0)]
+    impl ERC721EnumerableImpl =
+        ERC721EnumerableComponent::ERC721EnumerableImpl<ContractState>;
+    impl ERC721EnumerableInternalImpl = ERC721EnumerableComponent::InternalImpl<ContractState>;
+
+    // SRC5
+    #[abi(embed_v0)]
+    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub erc721: ERC721Component::Storage,
+        #[substorage(v0)]
+        pub erc721_enumerable: ERC721EnumerableComponent::Storage,
+        #[substorage(v0)]
+        pub src5: SRC5Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC721Event: ERC721Component::Event,
+        #[flat]
+        ERC721EnumerableEvent: ERC721EnumerableComponent::Event,
+        #[flat]
+        SRC5Event: SRC5Component::Event
+    }
+
+    impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait<ContractState> {
+        fn before_update(
+            ref self: ERC721Component::ComponentState<ContractState>,
+            to: ContractAddress,
+            token_id: u256,
+            auth: ContractAddress
+        ) {
+            let mut contract_state = ERC721Component::HasComponent::get_contract_mut(ref self);
+            contract_state.erc721_enumerable.before_update(to, token_id);
+        }
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        name: ByteArray,
+        symbol: ByteArray,
+        base_uri: ByteArray,
+        recipient: ContractAddress,
+        token_id: u256
+    ) {
+        self.erc721.initializer(name, symbol, base_uri);
+        self.erc721_enumerable.initializer();
+        self.erc721.mint(recipient, token_id);
+    }
+}
diff --git a/packages/governance/src/tests/mocks/non_implementing_mock.cairo b/packages/test_common/src/mocks/non_implementing.cairo
similarity index 80%
rename from packages/governance/src/tests/mocks/non_implementing_mock.cairo
rename to packages/test_common/src/mocks/non_implementing.cairo
index 67d632c72..4f54b0fd3 100644
--- a/packages/governance/src/tests/mocks/non_implementing_mock.cairo
+++ b/packages/test_common/src/mocks/non_implementing.cairo
@@ -1,5 +1,5 @@
 #[starknet::contract]
-pub(crate) mod NonImplementingMock {
+pub mod NonImplementingMock {
     #[storage]
     pub struct Storage {}
 
diff --git a/packages/utils/src/tests/mocks/nonces_mocks.cairo b/packages/test_common/src/mocks/nonces.cairo
similarity index 85%
rename from packages/utils/src/tests/mocks/nonces_mocks.cairo
rename to packages/test_common/src/mocks/nonces.cairo
index b2acf4cd5..92365d717 100644
--- a/packages/utils/src/tests/mocks/nonces_mocks.cairo
+++ b/packages/test_common/src/mocks/nonces.cairo
@@ -1,6 +1,6 @@
 #[starknet::contract]
-pub(crate) mod NoncesMock {
-    use crate::cryptography::nonces::NoncesComponent;
+pub mod NoncesMock {
+    use openzeppelin_utils::cryptography::nonces::NoncesComponent;
 
     component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);
 
diff --git a/packages/security/src/tests/mocks/reentrancy_mocks.cairo b/packages/test_common/src/mocks/security.cairo
similarity index 71%
rename from packages/security/src/tests/mocks/reentrancy_mocks.cairo
rename to packages/test_common/src/mocks/security.cairo
index c270d8d69..cac6c3acc 100644
--- a/packages/security/src/tests/mocks/reentrancy_mocks.cairo
+++ b/packages/test_common/src/mocks/security.cairo
@@ -1,4 +1,51 @@
 use starknet::ContractAddress;
+#[starknet::contract]
+pub mod InitializableMock {
+    use openzeppelin_security::initializable::InitializableComponent;
+
+    component!(path: InitializableComponent, storage: initializable, event: InitializableEvent);
+
+    #[abi(embed_v0)]
+    impl InitializableImpl =
+        InitializableComponent::InitializableImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub initializable: InitializableComponent::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        InitializableEvent: InitializableComponent::Event
+    }
+}
+
+#[starknet::contract]
+pub mod PausableMock {
+    use openzeppelin_security::pausable::PausableComponent;
+
+    component!(path: PausableComponent, storage: pausable, event: PausableEvent);
+
+    #[abi(embed_v0)]
+    impl PausableImpl = PausableComponent::PausableImpl<ContractState>;
+    impl InternalImpl = PausableComponent::InternalImpl<ContractState>;
+
+    #[storage]
+    pub struct Storage {
+        #[substorage(v0)]
+        pub pausable: PausableComponent::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        PausableEvent: PausableComponent::Event
+    }
+}
 
 #[starknet::interface]
 trait IReentrancyGuarded<TState> {
@@ -6,7 +53,7 @@ trait IReentrancyGuarded<TState> {
 }
 
 #[starknet::interface]
-pub(crate) trait IReentrancyMock<TState> {
+pub trait IReentrancyMock<TState> {
     fn count(ref self: TState);
     fn current_count(self: @TState) -> felt252;
     fn callback(ref self: TState);
@@ -16,8 +63,8 @@ pub(crate) trait IReentrancyMock<TState> {
 }
 
 #[starknet::contract]
-pub(crate) mod ReentrancyMock {
-    use crate::reentrancyguard::ReentrancyGuardComponent;
+pub mod ReentrancyMock {
+    use openzeppelin_security::reentrancyguard::ReentrancyGuardComponent;
     use starknet::ContractAddress;
     use starknet::get_contract_address;
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
@@ -107,7 +154,7 @@ trait IAttacker<TState> {
 }
 
 #[starknet::contract]
-pub(crate) mod Attacker {
+pub mod Attacker {
     use starknet::ContractAddress;
     use starknet::get_caller_address;
     use super::IReentrancyMockDispatcher;
diff --git a/packages/account/src/tests/mocks/simple_mock.cairo b/packages/test_common/src/mocks/simple.cairo
similarity index 90%
rename from packages/account/src/tests/mocks/simple_mock.cairo
rename to packages/test_common/src/mocks/simple.cairo
index f16386735..d1eab519a 100644
--- a/packages/account/src/tests/mocks/simple_mock.cairo
+++ b/packages/test_common/src/mocks/simple.cairo
@@ -1,12 +1,13 @@
 #[starknet::interface]
-pub(crate) trait ISimpleMock<TContractState> {
+pub trait ISimpleMock<TContractState> {
     fn increase_balance(ref self: TContractState, amount: felt252) -> bool;
     fn get_balance(self: @TContractState) -> felt252;
 }
 
 #[starknet::contract]
-pub(crate) mod SimpleMock {
+pub mod SimpleMock {
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
+
     #[storage]
     pub struct Storage {
         pub balance: felt252,
diff --git a/packages/presets/src/tests/mocks/src5_mocks.cairo b/packages/test_common/src/mocks/src5.cairo
similarity index 94%
rename from packages/presets/src/tests/mocks/src5_mocks.cairo
rename to packages/test_common/src/mocks/src5.cairo
index df481ced5..0d20d0a40 100644
--- a/packages/presets/src/tests/mocks/src5_mocks.cairo
+++ b/packages/test_common/src/mocks/src5.cairo
@@ -1,5 +1,5 @@
 #[starknet::contract]
-pub(crate) mod SRC5Mock {
+pub mod SRC5Mock {
     use openzeppelin_introspection::src5::SRC5Component;
 
     component!(path: SRC5Component, storage: src5, event: SRC5Event);
diff --git a/packages/account/src/tests/mocks/src9_mocks.cairo b/packages/test_common/src/mocks/src9.cairo
similarity index 93%
rename from packages/account/src/tests/mocks/src9_mocks.cairo
rename to packages/test_common/src/mocks/src9.cairo
index 0f41818f2..a7a7bcafb 100644
--- a/packages/account/src/tests/mocks/src9_mocks.cairo
+++ b/packages/test_common/src/mocks/src9.cairo
@@ -1,7 +1,7 @@
 #[starknet::contract(account)]
-pub(crate) mod SRC9AccountMock {
-    use crate::AccountComponent;
-    use crate::extensions::SRC9Component;
+pub mod SRC9AccountMock {
+    use openzeppelin_account::AccountComponent;
+    use openzeppelin_account::extensions::SRC9Component;
     use openzeppelin_introspection::src5::SRC5Component;
     use starknet::storage::StoragePointerWriteAccess;
 
diff --git a/packages/governance/src/tests/mocks/timelock_mocks.cairo b/packages/test_common/src/mocks/timelock.cairo
similarity index 92%
rename from packages/governance/src/tests/mocks/timelock_mocks.cairo
rename to packages/test_common/src/mocks/timelock.cairo
index 68359db97..974e7e2b8 100644
--- a/packages/governance/src/tests/mocks/timelock_mocks.cairo
+++ b/packages/test_common/src/mocks/timelock.cairo
@@ -1,7 +1,7 @@
 #[starknet::contract]
-pub(crate) mod TimelockControllerMock {
-    use crate::timelock::TimelockControllerComponent;
+pub mod TimelockControllerMock {
     use openzeppelin_access::accesscontrol::AccessControlComponent;
+    use openzeppelin_governance::timelock::TimelockControllerComponent;
     use openzeppelin_introspection::src5::SRC5Component;
     use starknet::ContractAddress;
 
@@ -49,14 +49,14 @@ pub(crate) mod TimelockControllerMock {
 }
 
 #[starknet::interface]
-pub(crate) trait IMockContract<TState> {
+pub trait IMockContract<TState> {
     fn set_number(ref self: TState, new_number: felt252);
     fn get_number(self: @TState) -> felt252;
     fn failing_function(self: @TState);
 }
 
 #[starknet::contract]
-pub(crate) mod MockContract {
+pub mod MockContract {
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
     use super::IMockContract;
 
@@ -82,14 +82,16 @@ pub(crate) mod MockContract {
 }
 
 #[starknet::interface]
-pub(crate) trait ITimelockAttacker<TState> {
+pub trait ITimelockAttacker<TState> {
     fn reenter(ref self: TState);
     fn reenter_batch(ref self: TState);
 }
 
 #[starknet::contract]
-pub(crate) mod TimelockAttackerMock {
-    use crate::timelock::interface::{ITimelockDispatcher, ITimelockDispatcherTrait};
+pub mod TimelockAttackerMock {
+    use openzeppelin_governance::timelock::interface::{
+        ITimelockDispatcher, ITimelockDispatcherTrait
+    };
     use starknet::account::Call;
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
     use super::ITimelockAttacker;
diff --git a/packages/upgrades/src/tests/mocks/upgrades_mocks.cairo b/packages/test_common/src/mocks/upgrades.cairo
similarity index 88%
rename from packages/upgrades/src/tests/mocks/upgrades_mocks.cairo
rename to packages/test_common/src/mocks/upgrades.cairo
index d46e66681..7cd2e87f8 100644
--- a/packages/upgrades/src/tests/mocks/upgrades_mocks.cairo
+++ b/packages/test_common/src/mocks/upgrades.cairo
@@ -1,11 +1,7 @@
-// These contracts are mocks used to test the core functionality of the upgrade functions.
-// The functions are NOT PROTECTED.
-// DO NOT USE IN PRODUCTION.
-
 use starknet::ClassHash;
 
 #[starknet::interface]
-pub(crate) trait IUpgradesV1<TState> {
+pub trait IUpgradesV1<TState> {
     fn upgrade(ref self: TState, new_class_hash: ClassHash);
     fn set_value(ref self: TState, val: felt252);
     fn get_value(self: @TState) -> felt252;
@@ -13,8 +9,8 @@ pub(crate) trait IUpgradesV1<TState> {
 }
 
 #[starknet::contract]
-pub(crate) mod UpgradesV1 {
-    use crate::UpgradeableComponent;
+pub mod UpgradesV1 {
+    use openzeppelin_upgrades::UpgradeableComponent;
     use starknet::ClassHash;
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
 
@@ -55,7 +51,7 @@ pub(crate) mod UpgradesV1 {
 }
 
 #[starknet::interface]
-pub(crate) trait IUpgradesV2<TState> {
+pub trait IUpgradesV2<TState> {
     fn upgrade(ref self: TState, new_class_hash: ClassHash);
     fn set_value(ref self: TState, val: felt252);
     fn set_value2(ref self: TState, val: felt252);
@@ -64,8 +60,8 @@ pub(crate) trait IUpgradesV2<TState> {
 }
 
 #[starknet::contract]
-pub(crate) mod UpgradesV2 {
-    use crate::UpgradeableComponent;
+pub mod UpgradesV2 {
+    use openzeppelin_upgrades::UpgradeableComponent;
     use starknet::ClassHash;
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
 
diff --git a/packages/finance/src/tests/mocks/vesting_mocks.cairo b/packages/test_common/src/mocks/vesting.cairo
similarity index 56%
rename from packages/finance/src/tests/mocks/vesting_mocks.cairo
rename to packages/test_common/src/mocks/vesting.cairo
index 0674035d4..ae1489cfb 100644
--- a/packages/finance/src/tests/mocks/vesting_mocks.cairo
+++ b/packages/test_common/src/mocks/vesting.cairo
@@ -1,7 +1,7 @@
 #[starknet::contract]
-pub(crate) mod LinearVestingMock {
-    use crate::vesting::{VestingComponent, LinearVestingSchedule};
+pub mod LinearVestingMock {
     use openzeppelin_access::ownable::OwnableComponent;
+    use openzeppelin_finance::vesting::{VestingComponent, LinearVestingSchedule};
     use starknet::ContractAddress;
 
     component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
@@ -48,10 +48,10 @@ pub(crate) mod LinearVestingMock {
 }
 
 #[starknet::contract]
-pub(crate) mod StepsVestingMock {
-    use crate::vesting::VestingComponent::VestingScheduleTrait;
-    use crate::vesting::VestingComponent;
+pub mod StepsVestingMock {
     use openzeppelin_access::ownable::OwnableComponent;
+    use openzeppelin_finance::vesting::VestingComponent::VestingScheduleTrait;
+    use openzeppelin_finance::vesting::VestingComponent;
     use starknet::ContractAddress;
     use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
 
@@ -125,3 +125,95 @@ pub(crate) mod StepsVestingMock {
         }
     }
 }
+
+#[starknet::contract]
+pub mod ERC20OptionalTransferPanicMock {
+    use openzeppelin_token::erc20::interface::IERC20;
+    use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
+    use starknet::ContractAddress;
+    use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
+
+    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
+
+    #[abi(embed_v0)]
+    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
+
+    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
+
+    #[storage]
+    struct Storage {
+        transfer_should_fail: bool,
+        #[substorage(v0)]
+        erc20: ERC20Component::Storage
+    }
+
+    #[event]
+    #[derive(Drop, starknet::Event)]
+    enum Event {
+        #[flat]
+        ERC20Event: ERC20Component::Event
+    }
+
+    #[constructor]
+    fn constructor(
+        ref self: ContractState,
+        name: ByteArray,
+        symbol: ByteArray,
+        initial_supply: u256,
+        recipient: ContractAddress
+    ) {
+        self.erc20.initializer(name, symbol);
+        self.erc20.mint(recipient, initial_supply);
+    }
+
+    #[abi(embed_v0)]
+    impl ERC20Impl of IERC20<ContractState> {
+        fn total_supply(self: @ContractState) -> u256 {
+            self.erc20.total_supply()
+        }
+
+        fn balance_of(self: @ContractState, account: ContractAddress) -> u256 {
+            self.erc20.balance_of(account)
+        }
+
+        fn allowance(
+            self: @ContractState, owner: ContractAddress, spender: ContractAddress
+        ) -> u256 {
+            self.erc20.allowance(owner, spender)
+        }
+
+        fn transfer(ref self: ContractState, recipient: ContractAddress, amount: u256) -> bool {
+            if self.transfer_should_fail.read() {
+                false
+            } else {
+                self.erc20.transfer(recipient, amount)
+            }
+        }
+
+        fn transfer_from(
+            ref self: ContractState,
+            sender: ContractAddress,
+            recipient: ContractAddress,
+            amount: u256
+        ) -> bool {
+            if self.transfer_should_fail.read() {
+                false
+            } else {
+                self.erc20.transfer_from(sender, recipient, amount)
+            }
+        }
+
+        fn approve(ref self: ContractState, spender: ContractAddress, amount: u256) -> bool {
+            self.erc20.approve(spender, amount)
+        }
+    }
+
+    #[generate_trait]
+    #[abi(per_item)]
+    impl ExternalImpl of ExternalTrait {
+        #[external(v0)]
+        fn set_transfer_should_fail(ref self: ContractState, should_fail: bool) {
+            self.transfer_should_fail.write(should_fail);
+        }
+    }
+}
diff --git a/packages/token/src/tests.cairo b/packages/token/src/tests.cairo
index d37791a03..fdb72f5ef 100644
--- a/packages/token/src/tests.cairo
+++ b/packages/token/src/tests.cairo
@@ -1,10 +1,4 @@
-#[cfg(test)]
 pub mod erc1155;
-#[cfg(test)]
 pub mod erc20;
-#[cfg(test)]
 pub mod erc2981;
-#[cfg(test)]
 pub mod erc721;
-
-pub(crate) mod mocks;
diff --git a/packages/token/src/tests/erc1155/test_erc1155.cairo b/packages/token/src/tests/erc1155/test_erc1155.cairo
index ffdc620d3..f1bad9234 100644
--- a/packages/token/src/tests/erc1155/test_erc1155.cairo
+++ b/packages/token/src/tests/erc1155/test_erc1155.cairo
@@ -3,7 +3,6 @@ use crate::erc1155::ERC1155Component::ERC1155CamelImpl;
 use crate::erc1155::ERC1155Component::{ERC1155Impl, ERC1155MetadataURIImpl, InternalImpl};
 use crate::erc1155::ERC1155Component;
 use crate::erc1155;
-use crate::tests::mocks::erc1155_mocks::DualCaseERC1155Mock;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
 use openzeppelin_test_common::erc1155::{
     ERC1155SpyHelpers, get_ids_and_values, get_ids_and_split_values
@@ -11,6 +10,7 @@ use openzeppelin_test_common::erc1155::{
 use openzeppelin_test_common::erc1155::{
     setup_account, deploy_another_account_at, setup_src5, setup_receiver
 };
+use openzeppelin_test_common::mocks::erc1155::DualCaseERC1155Mock;
 use openzeppelin_testing::constants::{
     EMPTY_DATA, ZERO, OWNER, RECIPIENT, OPERATOR, OTHER, TOKEN_ID, TOKEN_ID_2, TOKEN_VALUE,
     TOKEN_VALUE_2
diff --git a/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo b/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo
index e79debe9b..c3154f4ea 100644
--- a/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo
+++ b/packages/token/src/tests/erc1155/test_erc1155_receiver.cairo
@@ -2,9 +2,9 @@ use crate::erc1155::ERC1155ReceiverComponent::{
     ERC1155ReceiverImpl, ERC1155ReceiverCamelImpl, InternalImpl
 };
 use crate::erc1155::interface::IERC1155_RECEIVER_ID;
-use crate::tests::mocks::erc1155_receiver_mocks::DualCaseERC1155ReceiverMock;
 use openzeppelin_introspection::interface::ISRC5_ID;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
+use openzeppelin_test_common::mocks::erc1155::DualCaseERC1155ReceiverMock;
 use openzeppelin_testing::constants::{OWNER, OPERATOR, TOKEN_ID, TOKEN_VALUE, EMPTY_DATA};
 
 fn STATE() -> DualCaseERC1155ReceiverMock::ContractState {
diff --git a/packages/token/src/tests/erc20/test_erc20.cairo b/packages/token/src/tests/erc20/test_erc20.cairo
index f7b6f32ab..1d8c4451a 100644
--- a/packages/token/src/tests/erc20/test_erc20.cairo
+++ b/packages/token/src/tests/erc20/test_erc20.cairo
@@ -2,8 +2,8 @@ use core::num::traits::Bounded;
 use crate::erc20::ERC20Component::{ERC20CamelOnlyImpl, ERC20Impl};
 use crate::erc20::ERC20Component::{ERC20MetadataImpl, InternalImpl};
 use crate::erc20::ERC20Component;
-use crate::tests::mocks::erc20_mocks::DualCaseERC20Mock;
 use openzeppelin_test_common::erc20::ERC20SpyHelpers;
+use openzeppelin_test_common::mocks::erc20::DualCaseERC20Mock;
 use openzeppelin_testing::constants::{
     ZERO, OWNER, SPENDER, RECIPIENT, NAME, SYMBOL, DECIMALS, SUPPLY, VALUE
 };
diff --git a/packages/token/src/tests/erc20/test_erc20_votes.cairo b/packages/token/src/tests/erc20/test_erc20_votes.cairo
index dbff4693e..6a2be7240 100644
--- a/packages/token/src/tests/erc20/test_erc20_votes.cairo
+++ b/packages/token/src/tests/erc20/test_erc20_votes.cairo
@@ -5,8 +5,8 @@ use crate::erc20::extensions::ERC20VotesComponent::{DelegateChanged, DelegateVot
 use crate::erc20::extensions::ERC20VotesComponent::{ERC20VotesImpl, InternalImpl};
 use crate::erc20::extensions::ERC20VotesComponent;
 use crate::erc20::extensions::erc20_votes::Delegation;
-use crate::tests::mocks::erc20_votes_mocks::DualCaseERC20VotesMock::SNIP12MetadataImpl;
-use crate::tests::mocks::erc20_votes_mocks::DualCaseERC20VotesMock;
+use openzeppelin_test_common::mocks::erc20::DualCaseERC20VotesMock::SNIP12MetadataImpl;
+use openzeppelin_test_common::mocks::erc20::DualCaseERC20VotesMock;
 use openzeppelin_testing as utils;
 use openzeppelin_testing::constants::{SUPPLY, ZERO, OWNER, RECIPIENT};
 use openzeppelin_testing::events::EventSpyExt;
diff --git a/packages/token/src/tests/erc2981/test_erc2981.cairo b/packages/token/src/tests/erc2981/test_erc2981.cairo
index 3d2dc623f..1b0dbb75c 100644
--- a/packages/token/src/tests/erc2981/test_erc2981.cairo
+++ b/packages/token/src/tests/erc2981/test_erc2981.cairo
@@ -1,8 +1,8 @@
 use crate::common::erc2981::ERC2981Component::{ERC2981Impl, InternalImpl};
 use crate::common::erc2981::interface::IERC2981_ID;
 use crate::common::erc2981::{ERC2981Component, DefaultConfig};
-use crate::tests::mocks::erc2981_mocks::ERC2981Mock;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
+use openzeppelin_test_common::mocks::erc2981::ERC2981Mock;
 use openzeppelin_testing::constants::{ZERO, RECIPIENT};
 use starknet::{ContractAddress, contract_address_const};
 
diff --git a/packages/token/src/tests/erc721/test_erc721.cairo b/packages/token/src/tests/erc721/test_erc721.cairo
index d28f9d189..03e9826f2 100644
--- a/packages/token/src/tests/erc721/test_erc721.cairo
+++ b/packages/token/src/tests/erc721/test_erc721.cairo
@@ -3,9 +3,9 @@ use crate::erc721::ERC721Component::{ERC721Impl, ERC721CamelOnlyImpl};
 use crate::erc721::ERC721Component::{ERC721MetadataImpl, InternalImpl};
 use crate::erc721::ERC721Component;
 use crate::erc721;
-use crate::tests::mocks::erc721_mocks::DualCaseERC721Mock;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
 use openzeppelin_test_common::erc721::ERC721SpyHelpers;
+use openzeppelin_test_common::mocks::erc721::DualCaseERC721Mock;
 use openzeppelin_testing as utils;
 use openzeppelin_testing::constants::{
     DATA, ZERO, OWNER, CALLER, RECIPIENT, SPENDER, OPERATOR, OTHER, NAME, SYMBOL, TOKEN_ID,
diff --git a/packages/token/src/tests/erc721/test_erc721_enumerable.cairo b/packages/token/src/tests/erc721/test_erc721_enumerable.cairo
index a57589c6b..1c60b5695 100644
--- a/packages/token/src/tests/erc721/test_erc721_enumerable.cairo
+++ b/packages/token/src/tests/erc721/test_erc721_enumerable.cairo
@@ -4,9 +4,9 @@ use crate::erc721::extensions::erc721_enumerable::ERC721EnumerableComponent::{
 };
 use crate::erc721::extensions::erc721_enumerable::ERC721EnumerableComponent;
 use crate::erc721::extensions::erc721_enumerable::interface;
-use crate::tests::mocks::erc721_enumerable_mocks::ERC721EnumerableMock;
 use openzeppelin_introspection::interface::ISRC5_ID;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
+use openzeppelin_test_common::mocks::erc721::ERC721EnumerableMock;
 use openzeppelin_testing::constants::{OWNER, RECIPIENT, OTHER, ZERO};
 use starknet::ContractAddress;
 use starknet::storage::StorageMapReadAccess;
diff --git a/packages/token/src/tests/erc721/test_erc721_receiver.cairo b/packages/token/src/tests/erc721/test_erc721_receiver.cairo
index aa4fe8276..c24285744 100644
--- a/packages/token/src/tests/erc721/test_erc721_receiver.cairo
+++ b/packages/token/src/tests/erc721/test_erc721_receiver.cairo
@@ -2,9 +2,9 @@ use crate::erc721::ERC721ReceiverComponent::{
     ERC721ReceiverImpl, ERC721ReceiverCamelImpl, InternalImpl
 };
 use crate::erc721::interface::IERC721_RECEIVER_ID;
-use crate::tests::mocks::erc721_receiver_mocks::DualCaseERC721ReceiverMock;
 use openzeppelin_introspection::interface::ISRC5_ID;
 use openzeppelin_introspection::src5::SRC5Component::SRC5Impl;
+use openzeppelin_test_common::mocks::erc721::DualCaseERC721ReceiverMock;
 use openzeppelin_testing::constants::{OWNER, OPERATOR, TOKEN_ID};
 
 fn STATE() -> DualCaseERC721ReceiverMock::ContractState {
diff --git a/packages/token/src/tests/mocks.cairo b/packages/token/src/tests/mocks.cairo
deleted file mode 100644
index 35ad0586e..000000000
--- a/packages/token/src/tests/mocks.cairo
+++ /dev/null
@@ -1,10 +0,0 @@
-pub(crate) mod account_mocks;
-pub(crate) mod erc1155_mocks;
-pub(crate) mod erc1155_receiver_mocks;
-pub(crate) mod erc20_mocks;
-pub(crate) mod erc20_votes_mocks;
-pub(crate) mod erc2981_mocks;
-pub(crate) mod erc721_enumerable_mocks;
-pub(crate) mod erc721_mocks;
-pub(crate) mod erc721_receiver_mocks;
-pub(crate) mod src5_mocks;
diff --git a/packages/token/src/tests/mocks/account_mocks.cairo b/packages/token/src/tests/mocks/account_mocks.cairo
deleted file mode 100644
index e09f53328..000000000
--- a/packages/token/src/tests/mocks/account_mocks.cairo
+++ /dev/null
@@ -1,45 +0,0 @@
-#[starknet::contract(account)]
-pub(crate) mod DualCaseAccountMock {
-    use openzeppelin_account::AccountComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: AccountComponent, storage: account, event: AccountEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // Account
-    #[abi(embed_v0)]
-    impl SRC6Impl = AccountComponent::SRC6Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeclarerImpl = AccountComponent::DeclarerImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl DeployableImpl = AccountComponent::DeployableImpl<ContractState>;
-    impl AccountInternalImpl = AccountComponent::InternalImpl<ContractState>;
-
-    // SCR5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub account: AccountComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        AccountEvent: AccountComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState, public_key: felt252) {
-        self.account.initializer(public_key);
-    }
-}
diff --git a/packages/token/src/tests/mocks/erc1155_mocks.cairo b/packages/token/src/tests/mocks/erc1155_mocks.cairo
deleted file mode 100644
index a7442f8c0..000000000
--- a/packages/token/src/tests/mocks/erc1155_mocks.cairo
+++ /dev/null
@@ -1,52 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseERC1155Mock {
-    use crate::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};
-    use openzeppelin_introspection::src5::SRC5Component;
-    use starknet::ContractAddress;
-
-    component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC1155
-    #[abi(embed_v0)]
-    impl ERC1155Impl = ERC1155Component::ERC1155Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC1155MetadataURIImpl =
-        ERC1155Component::ERC1155MetadataURIImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC721Camel = ERC1155Component::ERC1155CamelImpl<ContractState>;
-    impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc1155: ERC1155Component::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC1155Event: ERC1155Component::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        base_uri: ByteArray,
-        recipient: ContractAddress,
-        token_id: u256,
-        value: u256
-    ) {
-        self.erc1155.initializer(base_uri);
-        self.erc1155.mint_with_acceptance_check(recipient, token_id, value, array![].span());
-    }
-}
diff --git a/packages/token/src/tests/mocks/erc1155_receiver_mocks.cairo b/packages/token/src/tests/mocks/erc1155_receiver_mocks.cairo
deleted file mode 100644
index 06443f5f5..000000000
--- a/packages/token/src/tests/mocks/erc1155_receiver_mocks.cairo
+++ /dev/null
@@ -1,40 +0,0 @@
-const SUCCESS: felt252 = 'SUCCESS';
-
-#[starknet::contract]
-pub(crate) mod DualCaseERC1155ReceiverMock {
-    use crate::erc1155::ERC1155ReceiverComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-    component!(
-        path: ERC1155ReceiverComponent, storage: erc1155_receiver, event: ERC1155ReceiverEvent
-    );
-
-    // ERC1155Receiver Mixin
-    #[abi(embed_v0)]
-    impl ERC1155ReceiverMixinImpl =
-        ERC1155ReceiverComponent::ERC1155ReceiverMixinImpl<ContractState>;
-    impl ERC1155ReceiverInternalImpl = ERC1155ReceiverComponent::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc1155_receiver: ERC1155ReceiverComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC1155ReceiverEvent: ERC1155ReceiverComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState) {
-        self.erc1155_receiver.initializer();
-    }
-}
diff --git a/packages/token/src/tests/mocks/erc20_mocks.cairo b/packages/token/src/tests/mocks/erc20_mocks.cairo
deleted file mode 100644
index d6b0a799b..000000000
--- a/packages/token/src/tests/mocks/erc20_mocks.cairo
+++ /dev/null
@@ -1,40 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseERC20Mock {
-    use crate::erc20::{ERC20Component, ERC20HooksEmptyImpl};
-    use starknet::ContractAddress;
-
-    component!(path: ERC20Component, storage: erc20, event: ERC20Event);
-
-    #[abi(embed_v0)]
-    impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
-    impl InternalImpl = ERC20Component::InternalImpl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc20: ERC20Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC20Event: ERC20Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        initial_supply: u256,
-        recipient: ContractAddress
-    ) {
-        self.erc20.initializer(name, symbol);
-        self.erc20.mint(recipient, initial_supply);
-    }
-}
diff --git a/packages/token/src/tests/mocks/erc721_enumerable_mocks.cairo b/packages/token/src/tests/mocks/erc721_enumerable_mocks.cairo
deleted file mode 100644
index 096dea067..000000000
--- a/packages/token/src/tests/mocks/erc721_enumerable_mocks.cairo
+++ /dev/null
@@ -1,75 +0,0 @@
-#[starknet::contract]
-pub(crate) mod ERC721EnumerableMock {
-    use crate::erc721::ERC721Component;
-    use crate::erc721::extensions::ERC721EnumerableComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-    use starknet::ContractAddress;
-
-    component!(path: ERC721Component, storage: erc721, event: ERC721Event);
-    component!(
-        path: ERC721EnumerableComponent, storage: erc721_enumerable, event: ERC721EnumerableEvent
-    );
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC721
-    #[abi(embed_v0)]
-    impl ERC721MixinImpl = ERC721Component::ERC721Impl<ContractState>;
-    impl ERC721InternalImpl = ERC721Component::InternalImpl<ContractState>;
-
-    // ERC721Enumerable
-    #[abi(embed_v0)]
-    impl ERC721EnumerableImpl =
-        ERC721EnumerableComponent::ERC721EnumerableImpl<ContractState>;
-    impl ERC721EnumerableInternalImpl = ERC721EnumerableComponent::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc721: ERC721Component::Storage,
-        #[substorage(v0)]
-        pub erc721_enumerable: ERC721EnumerableComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC721Event: ERC721Component::Event,
-        #[flat]
-        ERC721EnumerableEvent: ERC721EnumerableComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait<ContractState> {
-        fn before_update(
-            ref self: ERC721Component::ComponentState<ContractState>,
-            to: ContractAddress,
-            token_id: u256,
-            auth: ContractAddress
-        ) {
-            let mut contract_state = ERC721Component::HasComponent::get_contract_mut(ref self);
-            contract_state.erc721_enumerable.before_update(to, token_id);
-        }
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        base_uri: ByteArray,
-        recipient: ContractAddress,
-        token_id: u256
-    ) {
-        self.erc721.initializer(name, symbol, base_uri);
-        self.erc721_enumerable.initializer();
-        self.erc721.mint(recipient, token_id);
-    }
-}
diff --git a/packages/token/src/tests/mocks/erc721_mocks.cairo b/packages/token/src/tests/mocks/erc721_mocks.cairo
deleted file mode 100644
index 432c72da9..000000000
--- a/packages/token/src/tests/mocks/erc721_mocks.cairo
+++ /dev/null
@@ -1,55 +0,0 @@
-#[starknet::contract]
-pub(crate) mod DualCaseERC721Mock {
-    use crate::erc721::{ERC721Component, ERC721HooksEmptyImpl};
-    use openzeppelin_introspection::src5::SRC5Component;
-    use starknet::ContractAddress;
-
-    component!(path: ERC721Component, storage: erc721, event: ERC721Event);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC721
-    #[abi(embed_v0)]
-    impl ERC721Impl = ERC721Component::ERC721Impl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl<ContractState>;
-    #[abi(embed_v0)]
-    impl ERC721MetadataCamelOnly =
-        ERC721Component::ERC721MetadataCamelOnlyImpl<ContractState>;
-    impl ERC721InternalImpl = ERC721Component::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc721: ERC721Component::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC721Event: ERC721Component::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(
-        ref self: ContractState,
-        name: ByteArray,
-        symbol: ByteArray,
-        base_uri: ByteArray,
-        recipient: ContractAddress,
-        token_id: u256
-    ) {
-        self.erc721.initializer(name, symbol, base_uri);
-        self.erc721.mint(recipient, token_id);
-    }
-}
diff --git a/packages/token/src/tests/mocks/erc721_receiver_mocks.cairo b/packages/token/src/tests/mocks/erc721_receiver_mocks.cairo
deleted file mode 100644
index 6df306fbd..000000000
--- a/packages/token/src/tests/mocks/erc721_receiver_mocks.cairo
+++ /dev/null
@@ -1,71 +0,0 @@
-const SUCCESS: felt252 = 'SUCCESS';
-
-#[starknet::contract]
-pub(crate) mod DualCaseERC721ReceiverMock {
-    use crate::erc721::ERC721ReceiverComponent;
-    use openzeppelin_introspection::src5::SRC5Component;
-    use starknet::ContractAddress;
-
-    component!(path: ERC721ReceiverComponent, storage: erc721_receiver, event: ERC721ReceiverEvent);
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    // ERC721Receiver
-    impl ERC721ReceiverImpl = ERC721ReceiverComponent::ERC721ReceiverImpl<ContractState>;
-    impl ERC721ReceiverInternalImpl = ERC721ReceiverComponent::InternalImpl<ContractState>;
-
-    // SRC5
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub erc721_receiver: ERC721ReceiverComponent::Storage,
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        ERC721ReceiverEvent: ERC721ReceiverComponent::Event,
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-
-    #[constructor]
-    fn constructor(ref self: ContractState) {
-        self.erc721_receiver.initializer();
-    }
-
-    #[abi(per_item)]
-    #[generate_trait]
-    impl ExternalImpl of ExternalTrait {
-        #[external(v0)]
-        fn on_erc721_received(
-            self: @ContractState,
-            operator: ContractAddress,
-            from: ContractAddress,
-            token_id: u256,
-            data: Span<felt252>
-        ) -> felt252 {
-            if *data.at(0) == super::SUCCESS {
-                self.erc721_receiver.on_erc721_received(operator, from, token_id, data)
-            } else {
-                0
-            }
-        }
-
-        #[external(v0)]
-        fn onERC721Received(
-            self: @ContractState,
-            operator: ContractAddress,
-            from: ContractAddress,
-            tokenId: u256,
-            data: Span<felt252>
-        ) -> felt252 {
-            Self::on_erc721_received(self, operator, from, tokenId, data)
-        }
-    }
-}
diff --git a/packages/token/src/tests/mocks/src5_mocks.cairo b/packages/token/src/tests/mocks/src5_mocks.cairo
deleted file mode 100644
index df481ced5..000000000
--- a/packages/token/src/tests/mocks/src5_mocks.cairo
+++ /dev/null
@@ -1,22 +0,0 @@
-#[starknet::contract]
-pub(crate) mod SRC5Mock {
-    use openzeppelin_introspection::src5::SRC5Component;
-
-    component!(path: SRC5Component, storage: src5, event: SRC5Event);
-
-    #[abi(embed_v0)]
-    impl SRC5Impl = SRC5Component::SRC5Impl<ContractState>;
-
-    #[storage]
-    pub struct Storage {
-        #[substorage(v0)]
-        pub src5: SRC5Component::Storage
-    }
-
-    #[event]
-    #[derive(Drop, starknet::Event)]
-    enum Event {
-        #[flat]
-        SRC5Event: SRC5Component::Event
-    }
-}
diff --git a/packages/upgrades/src/tests.cairo b/packages/upgrades/src/tests.cairo
index 617be2f0e..fe66e01e3 100644
--- a/packages/upgrades/src/tests.cairo
+++ b/packages/upgrades/src/tests.cairo
@@ -1,4 +1,1 @@
-pub(crate) mod mocks;
-
-#[cfg(test)]
 mod test_upgradeable;
diff --git a/packages/upgrades/src/tests/mocks.cairo b/packages/upgrades/src/tests/mocks.cairo
deleted file mode 100644
index a287b9e8f..000000000
--- a/packages/upgrades/src/tests/mocks.cairo
+++ /dev/null
@@ -1,1 +0,0 @@
-pub(crate) mod upgrades_mocks;
diff --git a/packages/upgrades/src/tests/test_upgradeable.cairo b/packages/upgrades/src/tests/test_upgradeable.cairo
index 1cb956261..19a87be4f 100644
--- a/packages/upgrades/src/tests/test_upgradeable.cairo
+++ b/packages/upgrades/src/tests/test_upgradeable.cairo
@@ -1,5 +1,5 @@
-use crate::tests::mocks::upgrades_mocks::{IUpgradesV1Dispatcher, IUpgradesV1DispatcherTrait};
-use crate::tests::mocks::upgrades_mocks::{IUpgradesV2Dispatcher, IUpgradesV2DispatcherTrait};
+use openzeppelin_test_common::mocks::upgrades::{IUpgradesV1Dispatcher, IUpgradesV1DispatcherTrait};
+use openzeppelin_test_common::mocks::upgrades::{IUpgradesV2Dispatcher, IUpgradesV2DispatcherTrait};
 use openzeppelin_test_common::upgrades::UpgradeableSpyHelpers;
 use openzeppelin_testing::constants::{CLASS_HASH_ZERO, FELT_VALUE as VALUE};
 use openzeppelin_testing::{declare_class, deploy};
diff --git a/packages/utils/src/tests.cairo b/packages/utils/src/tests.cairo
index 37cf414d3..fedcc380c 100644
--- a/packages/utils/src/tests.cairo
+++ b/packages/utils/src/tests.cairo
@@ -1,4 +1,2 @@
-pub(crate) mod mocks;
-
 mod test_nonces;
 mod test_snip12;
diff --git a/packages/utils/src/tests/test_nonces.cairo b/packages/utils/src/tests/test_nonces.cairo
index 694908aa9..fdc783035 100644
--- a/packages/utils/src/tests/test_nonces.cairo
+++ b/packages/utils/src/tests/test_nonces.cairo
@@ -2,7 +2,7 @@ use core::num::traits::Zero;
 use crate::cryptography::interface::INonces;
 use crate::cryptography::nonces::NoncesComponent::InternalTrait;
 use crate::cryptography::nonces::NoncesComponent;
-use crate::tests::mocks::nonces_mocks::NoncesMock;
+use openzeppelin_test_common::mocks::nonces::NoncesMock;
 use openzeppelin_testing::constants::OWNER;
 
 type ComponentState = NoncesComponent::ComponentState<NoncesMock::ContractState>;