Repository: fazedordecodigo/PyFlunt (language: python)

Issue:
Release v2.3.0
## [2.3.0] - 2024-03-17
### Adicionado
- Validação de Collections [#30](https://github.com/fazedordecodigo/PyFlunt/issues/30)

### Corrigido
- Falta de tipagem de retorno nos overloads de Requires [#59](https://github.com/fazedordecodigo/PyFlunt/issues/59)
- Pipeline Linters com path quebrado para o requirements.txt [#60](https://github.com/fazedordecodigo/PyFlunt/issues/60)
Ausência de tipagem no retorno da função Requires
Adicionar tipagem de retorno nos overloads de Requires

```python
@overload
def requires(self, value: object, key: str, message: str) -> Self:
```
Release v2.3.0
## [2.3.0] - 2024-03-17
### Adicionado
- Validação de Collections [#30](https://github.com/fazedordecodigo/PyFlunt/issues/30)

### Corrigido
- Falta de tipagem de retorno nos overloads de Requires [#59](https://github.com/fazedordecodigo/PyFlunt/issues/59)
- Pipeline Linters com path quebrado para o requirements.txt [#60](https://github.com/fazedordecodigo/PyFlunt/issues/60)
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Release v2.3.0
## [2.3.0] - 2024-03-17
### Adicionado
- Validação de Collections [#30](https://github.com/fazedordecodigo/PyFlunt/issues/30)

### Corrigido
- Falta de tipagem de retorno nos overloads de Requires [#59](https://github.com/fazedordecodigo/PyFlunt/issues/59)
- Pipeline Linters com path quebrado para o requirements.txt [#60](https://github.com/fazedordecodigo/PyFlunt/issues/60)
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Add CollectionsValidationContract
Guide: https://github.com/andrebaltieri/Flunt/blob/main/Flunt/Validations/ListValidationContract.cs
Release v2.3.0
## [2.3.0] - 2024-03-17
### Adicionado
- Validação de Collections [#30](https://github.com/fazedordecodigo/PyFlunt/issues/30)

### Corrigido
- Falta de tipagem de retorno nos overloads de Requires [#59](https://github.com/fazedordecodigo/PyFlunt/issues/59)
- Pipeline Linters com path quebrado para o requirements.txt [#60](https://github.com/fazedordecodigo/PyFlunt/issues/60)


Discussion / hints:

Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 324a3c5..9932e09 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,10 +12,18 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR
 - Adicionar validação de DateTime [#27](https://github.com/fazedordecodigo/PyFlunt/issues/27)
 - Adicionar validação de Números [#28](https://github.com/fazedordecodigo/PyFlunt/issues/28)
 - Adicionar validação de documentos [#29](https://github.com/fazedordecodigo/PyFlunt/issues/29)
-- Adicionar validação de Listas [#30](https://github.com/fazedordecodigo/PyFlunt/issues/30)
 - Adicionar validação de Objetos [#31](https://github.com/fazedordecodigo/PyFlunt/issues/31)
 - Adicionar validação de Regex [#32](https://github.com/fazedordecodigo/PyFlunt/issues/32)
 - Adicionar validação de URL [#33](https://github.com/fazedordecodigo/PyFlunt/issues/33)
+- Adicionar Result Pattner [#61](https://github.com/fazedordecodigo/PyFlunt/issues/61)
+
+## [2.3.0] - 2024-03-17
+### Adicionado
+- Validação de Collections [#30](https://github.com/fazedordecodigo/PyFlunt/issues/30)
+
+### Corrigido
+- Falta de tipagem de retorno nos overloads de Requires [#59](https://github.com/fazedordecodigo/PyFlunt/issues/59)
+- Pipeline Linters com path quebrado para o requirements.txt [#60](https://github.com/fazedordecodigo/PyFlunt/issues/60)
 
 ## [2.2.0] - 2024-03-13
 ### Adicionado
diff --git a/flunt/validations/collections_validation_contract.py b/flunt/validations/collections_validation_contract.py
new file mode 100644
index 0000000..f7c3f48
--- /dev/null
+++ b/flunt/validations/collections_validation_contract.py
@@ -0,0 +1,385 @@
+"""Module Contract."""
+from typing import TypeVar, Union, overload
+
+from typing_extensions import Self
+
+from flunt.notifications.notifiable import Notifiable
+from flunt.notifications.notification import Notification
+
+T = TypeVar('T', str, list, dict, set, tuple, range, bytearray)
+
+class CollectionsValidationContract(Notifiable):
+	"""
+	Class for validating values and adding notifications based on various comparisons.
+
+	Parameters
+	----------
+	    N/A
+
+	Attributes:
+	----------
+	    N/A
+
+	Methods:
+	-------
+	- is_lower_than(value, comparer, key, message): Checks if the length of a collection value is lower than a given number.
+	- is_lower_or_equals_than(value, comparer, key, message): Checks if the length of a collection value is lower or equal to a given number.
+	- is_greater_than(value, comparer, key, message): Checks if the length of a collection value is greater than a given number.
+	- is_greater_or_equals_than(value, comparer, key, message): Checks if the length of a collection value is greater or equal to a given number.
+	- contains(value, comparer, key, message): Checks if a collection contains a specific collection.
+	- not_contains(value, comparer, key, message): Checks if a collection does not contain a specific collection.
+	- is_between(value, min, max, key, message): Checks if the length of a colection is between a minimum and maximum value.
+
+	"""
+
+	@overload
+	def is_lower_than(self, value: bytearray, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_than(self, value: range, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_than(self, value: tuple, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_than(self, value: set, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_than(self, value: dict, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_than(self, value: list, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_than(self, value: str, comparer: int, key: str, message: str) -> Self:
+		...
+	def is_lower_than(self, value: Union[str, list, dict, set, tuple, range, bytearray], comparer: int, key: str, message: str) -> Self:
+		"""
+		Check if the length of a collection value is lower than a given number and adds a notification if it's greater.
+
+		Parameters
+		----------
+		`value`: str | list | dict | set | tuple | range | bytearray
+		    The collection value to compare.
+		`comparer`: int
+		    The maximum length allowed for the value.
+		`key`: str
+		    The key or identifier associated with the comparison.
+		`message`: str
+		    The notification message to be added if the length exceeds the comparer.
+
+		Returns:
+		-------
+		`self`
+		    The current instance with potential notifications added.
+
+		Notes:
+		-----
+		- If the `value` is an empty string or None, no notification is added.
+		- If the length of `value` is greater than `comparer`, a notification is added to the current instance
+		with the provided `key` and `message`.
+
+		Examples:
+		--------
+		```python
+		obj = Contract()
+		      .is_lower_than("Hello", 10, "LengthCheck", "Value should have a length less than 10")
+		obj.is_valid
+		```
+
+		"""
+		if not value:
+			return self
+
+		if not hasattr(value, '__iter__'):
+			self.add_notification(Notification(key, "Value is not iterable"))
+			return self
+
+		if len(value) >= comparer:
+			self.add_notification(Notification(key, message))
+
+		return self
+
+	@overload
+	def is_lower_or_equals_than(self, value: bytearray, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_or_equals_than(self, value: range, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_or_equals_than(self, value: tuple, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_or_equals_than(self, value: set, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_or_equals_than(self, value: dict, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_or_equals_than(self, value: list, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_lower_or_equals_than(self, value: str, comparer: int, key: str, message: str) -> Self:
+		...
+	def is_lower_or_equals_than(
+		self, value: Union[str, list, dict, set, tuple, range, bytearray], comparer: int, key: str, message: str
+	) -> Self:
+		"""
+		Check if the length of a collection value is lower or equal to a given number and adds a notification if it exceeds.
+
+		Parameters
+		----------
+		`value`: str | list | dict | set | tuple | range | bytearray
+		    The collection value to compare.
+		`comparer`: int
+		    The maximum length allowed for the value.
+		`key`: str
+		    The key or identifier associated with the comparison.
+		`message`: str
+		    The notification message to be added if the length exceeds the comparer.
+
+		Returns:
+		-------
+		`self`
+		    The current instance with potential notifications added.
+
+		Notes:
+		-----
+		- If the `value` is an empty string or None, no notification is added.
+		- If the length of `value` is greater than or equal to `comparer`, a notification is added to the current instance
+		with the provided `key` and `message`.
+
+		Examples:
+		--------
+		```python
+		obj = Contract()
+		      .is_lower_or_equals_than("Hello", 10, "LengthCheck", "Value should have a length less than or equal to 10")
+		obj.is_valid
+		```
+
+		"""
+		if not value:
+			return self
+
+		if not hasattr(value, '__iter__'):
+			self.add_notification(Notification(key, "Value is not iterable"))
+			return self
+
+		if len(value) > comparer:
+			self.add_notification(Notification(key, message))
+
+		return self
+
+	@overload
+	def is_greater_than(self, value: bytearray, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_than(self, value: range, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_than(self, value: tuple, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_than(self, value: set, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_than(self, value: dict, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_than(self, value: list, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_than(self, value: str, comparer: int, key: str, message: str) -> Self:
+		...
+	def is_greater_than(
+		self, value: Union[str, list, dict, set, tuple, range, bytearray], comparer: int, key: str, message: str
+	) -> Self:
+		"""
+		Check if the length of a collection value is greater than a given number and adds a notification if it's smaller.
+
+		Parameters
+		----------
+		`value`: str | list | dict | set | tuple | range | bytearray
+		    The collection value to compare.
+		`comparer`: int
+		    The minimum length required for the value.
+		`key`: str
+		    The key or identifier associated with the comparison.
+		`message`: str
+		    The notification message to be added if the length is smaller than the comparer.
+
+		Returns:
+		-------
+		`self`
+		    The current instance with potential notifications added.
+
+		Notes:
+		-----
+		- If the `value` is an empty string or None, no notification is added.
+		- If the length of `value` is smaller than `comparer`, a notification is added to the current instance
+		with the provided `key` and `message`.
+
+		Examples:
+		--------
+		```python
+		obj = Contract()
+		      .is_greater_than("Hello", 3, "LengthCheck", "Value should have a length greater than 3")
+		obj.is_valid
+		```
+
+		"""
+		if not value:
+			return self
+
+		if not hasattr(value, '__iter__'):
+			self.add_notification(Notification(key, "Value is not iterable"))
+			return self
+
+		if len(value) <= comparer:
+			self.add_notification(Notification(key, message))
+
+		return self
+
+	@overload
+	def is_greater_or_equals_than(self, value: bytearray, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_or_equals_than(self, value: range, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_or_equals_than(self, value: tuple, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_or_equals_than(self, value: set, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_or_equals_than(self, value: dict, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_or_equals_than(self, value: list, comparer: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_greater_or_equals_than(self, value: str, comparer: int, key: str, message: str) -> Self:
+		...
+	def is_greater_or_equals_than(
+		self, value: Union[str, list, dict, set, tuple, range, bytearray], comparer: int, key: str, message: str
+	) -> Self:
+		"""
+		Check if the length of a collection value is greater than or equal to a given number and adds a notification if it's smaller.
+
+		Parameters
+		----------
+		`value`: str | list | dict | set | tuple | range | bytearray
+		    The collection value to compare.
+		`comparer`: int
+		    The minimum length required for the value.
+		`key`: str
+		    The key or identifier associated with the comparison.
+		`message`: str
+		    The notification message to be added if the length is smaller than the comparer.
+
+		Returns:
+		-------
+		`self`
+		    The current instance with potential notifications added.
+
+		Notes:
+		-----
+		- If the `value` is an empty string or None, no notification is added.
+		- If the length of `value` is smaller than or equal to `comparer`, a notification is added to the current instance
+		with the provided `key` and `message`.
+
+		Example:
+		--------
+		```python
+		obj = Contract()
+		      .is_greater_or_equals_than("Hello", 3, "LengthCheck", "Value should have a length greater than or equal to 3")
+		obj.is_valid
+		```
+
+		"""
+		if not value:
+			return self
+
+		if not hasattr(value, '__iter__'):
+			self.add_notification(Notification(key, "Value is not iterable"))
+			return self
+
+		if len(value) < comparer:
+			self.add_notification(Notification(key, message))
+
+		return self
+
+
+	@overload
+	def is_between(self, value: bytearray, min: int, max: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_between(self, value: range, min: int, max: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_between(self, value: tuple, min: int, max: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_between(self, value: set, min: int, max: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_between(self, value: dict, min: int, max: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_between(self, value: list, min: int, max: int, key: str, message: str) -> Self:
+		...
+	@overload
+	def is_between(self, value: str, min: int, max: int, key: str, message: str) -> Self:
+		...
+	def is_between(
+		self, value: Union[str, list, dict, set, tuple, range, bytearray], min: int, max: int, key: str, message: str
+	) -> Self:
+		"""
+		Require a collection value to have a length between a minimum and maximum value (inclusive), and adds a notification if the length is outside the specified range.
+
+		Parameters
+		----------
+		`value`: str | list | dict | set | tuple | range | bytearray
+		    The collection value to be checked.
+		`min`: int
+		    The minimum allowed length for the value.
+		`max`: int
+		    The maximum allowed length for the value.
+		`key`: str
+		    The key or identifier associated with the length check.
+		`message`: str
+		    The notification message to be added if the length is outside the range.
+
+		Returns:
+		-------
+		`self`
+		    The current instance with potential notifications added.
+
+		Notes:
+		-----
+		- If the `value` is empty, the function returns the current instance without adding any notifications.
+		- If the `value` is None or consists only of whitespace characters, the function returns the current instance without adding any notifications.
+		- If the length of `value` is less than `min` or greater than `max`, a notification is added to the current instance
+		with the provided `key` and `message`.
+
+		Examples:
+		--------
+		```python
+		obj = Contract()
+		      .is_between("Hello", 3, 6, "LengthCheck", "Value length should be between 3 and 6")
+		obj.is_valid
+		```
+
+		"""
+		if not value:
+			return self
+
+		if not hasattr(value, '__iter__'):
+			self.add_notification(Notification(key, "Value is a not collection"))
+			return self
+
+		if len(value) < min or len(value) > max:
+			self.add_notification(Notification(key, message))
+
+		return self
diff --git a/flunt/validations/commons_validation_contract.py b/flunt/validations/commons_validation_contract.py
index 2b62819..6ce158d 100644
--- a/flunt/validations/commons_validation_contract.py
+++ b/flunt/validations/commons_validation_contract.py
@@ -26,10 +26,10 @@ class CommonsValidationContract(Notifiable):
 
 	Methods:
 	-------
-	- is_none(value: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if a value is None.
-	- is_not_none(value: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if a value is not None.
-	- are_equals(value: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct], comparer: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if two values are equal.
-	- are_not_equals(value: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct], comparer: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if two values are not equal.
+	- is_none(value: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if a value is None.
+	- is_not_none(value: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if a value is not None.
+	- are_equals(value: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct], comparer: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if two values are equal.
+	- are_not_equals(value: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct], comparer: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct], key: str, message: str): Checks if two values are not equal.
 
 	"""
 
@@ -115,7 +115,7 @@ def is_none(
 
 		Parameters
 		----------
-		`value`: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct]
+		`value`: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct]
 		    The value to be checked.
 		`key`: str
 		    The key or identifier associated with the check.
@@ -228,7 +228,7 @@ def is_not_none(
 
 		Parameters
 		----------
-		`value`: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct]
+		`value`: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct]
 		    The value to be checked.
 		`key`: str
 		    The key or identifier associated with the check.
@@ -367,9 +367,9 @@ def are_equals(
 
 		Parameters
 		----------
-		`value`: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct]
+		`value`: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct]
 		    The first value to compare.
-		`comparer`: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct]
+		`comparer`: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct]
 		    The second value to compare with the first value.
 		`key`: str
 		    The key or identifier associated with the comparison.
@@ -520,9 +520,9 @@ def are_not_equals(
 
 		Parameters
 		----------
-		`value`: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct]
+		`value`: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct]
 		    The value to be compared.
-		`comparer`: [bool | str | float | int | Tuple | Set | List | Iterable | Dict | Callable | Decimal | UUID | object | Struct]
+		`comparer`: [bool | str | float | int | tuple | set | list | Iterable | dict | Callable | Decimal | UUID | object | Struct]
 		    The value to compare with `value`.
 		`key`: str
 		    The key or identifier related to the comparison.
diff --git a/flunt/validations/contract.py b/flunt/validations/contract.py
index 8fc530e..077197f 100644
--- a/flunt/validations/contract.py
+++ b/flunt/validations/contract.py
@@ -11,6 +11,9 @@
 from flunt.notifications.notifiable import Notifiable
 from flunt.notifications.notification import Notification
 from flunt.validations.bool_validation_contract import BoolValidationContract
+from flunt.validations.collections_validation_contract import (
+	CollectionsValidationContract,
+)
 from flunt.validations.commons_validation_contract import CommonsValidationContract
 from flunt.validations.credit_card_validation_contract import (
 	CreditCardValidationContract,
@@ -25,6 +28,7 @@ class Contract(
 	BoolValidationContract,
 	CreditCardValidationContract,
 	CommonsValidationContract,
+	CollectionsValidationContract,
 	Notifiable,
 ):
 	"""
@@ -45,59 +49,59 @@ class Contract(
 	"""
 
 	@overload
-	def requires(self, value: tuple, key: str, message: str):
+	def requires(self, value: tuple, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: Struct, key: str, message: str):
+	def requires(self, value: Struct, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: set, key: str, message: str):
+	def requires(self, value: set, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: bool, key: str, message: str):
+	def requires(self, value: bool, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: dict, key: str, message: str):
+	def requires(self, value: dict, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: list, key: str, message: str):
+	def requires(self, value: list, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: Iterable, key: str, message: str):
+	def requires(self, value: Iterable, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: Callable, key: str, message: str):
+	def requires(self, value: Callable, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: int, key: str, message: str):
+	def requires(self, value: int, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: str, key: str, message: str):
+	def requires(self, value: str, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: Decimal, key: str, message: str):
+	def requires(self, value: Decimal, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: float, key: str, message: str):
+	def requires(self, value: float, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: UUID, key: str, message: str):
+	def requires(self, value: UUID, key: str, message: str) -> Self:
 		...
 
 	@overload
-	def requires(self, value: object, key: str, message: str):
+	def requires(self, value: object, key: str, message: str) -> Self:
 		...
 
 	def requires(
diff --git a/flunt/validations/strings_validation_contract.py b/flunt/validations/strings_validation_contract.py
index 0204b8e..90e1af9 100644
--- a/flunt/validations/strings_validation_contract.py
+++ b/flunt/validations/strings_validation_contract.py
@@ -20,195 +20,10 @@ class StringValidationContract(Notifiable):
 
 	Methods:
 	-------
-	- is_lower_than(value, comparer, key, message): Checks if the length of a string value is lower than a given number.
-	- is_lower_or_equals_than(value, comparer, key, message): Checks if the length of a string value is lower or equal to a given number.
-	- is_greater_than(value, comparer, key, message): Checks if the length of a string value is greater than a given number.
-	- is_greater_or_equals_than(value, comparer, key, message): Checks if the length of a string value is greater or equal to a given number.
 	- is_not_none_or_white_space(value, key, message): Checks if a string value is not None or whitespace.
-	- contains(value, comparer, key, message): Checks if a string contains a specific substring.
-	- not_contains(value, comparer, key, message): Checks if a string does not contain a specific substring.
-	- is_between(value, min, max, key, message): Checks if the length of a string is between a minimum and maximum value.
 
 	"""
 
-	def is_lower_than(self, value: str, comparer: int, key: str, message: str) -> Self:
-		"""
-		Check if the length of a string value is lower than a given number and adds a notification if it's greater.
-
-		Parameters
-		----------
-		`value`: str
-		    The string value to compare.
-		`comparer`: int
-		    The maximum length allowed for the value.
-		`key`: str
-		    The key or identifier associated with the comparison.
-		`message`: str
-		    The notification message to be added if the length exceeds the comparer.
-
-		Returns:
-		-------
-		`self`
-		    The current instance with potential notifications added.
-
-		Notes:
-		-----
-		- If the `value` is an empty string or None, no notification is added.
-		- If the length of `value` is greater than `comparer`, a notification is added to the current instance
-		with the provided `key` and `message`.
-
-		Examples:
-		--------
-		```python
-		obj = Contract()
-		      .is_lower_than("Hello", 10, "LengthCheck", "Value should have a length less than 10")
-		obj.is_valid
-		```
-
-		"""
-		if not value:
-			return self
-
-		if len(value) > comparer:
-			self.add_notification(Notification(key, message))
-
-		return self
-
-	def is_lower_or_equals_than(
-		self, value: str, comparer: int, key: str, message: str
-	) -> Self:
-		"""
-		Check if the length of a string value is lower or equal to a given number and adds a notification if it exceeds.
-
-		Parameters
-		----------
-		`value`: str
-		    The string value to compare.
-		`comparer`: int
-		    The maximum length allowed for the value.
-		`key`: str
-		    The key or identifier associated with the comparison.
-		`message`: str
-		    The notification message to be added if the length exceeds the comparer.
-
-		Returns:
-		-------
-		`self`
-		    The current instance with potential notifications added.
-
-		Notes:
-		-----
-		- If the `value` is an empty string or None, no notification is added.
-		- If the length of `value` is greater than or equal to `comparer`, a notification is added to the current instance
-		with the provided `key` and `message`.
-
-		Examples:
-		--------
-		```python
-		obj = Contract()
-		      .is_lower_or_equals_than("Hello", 10, "LengthCheck", "Value should have a length less than or equal to 10")
-		obj.is_valid
-		```
-
-		"""
-		if not value:
-			return self
-
-		if len(value) >= comparer:
-			self.add_notification(Notification(key, message))
-
-		return self
-
-	def is_greater_than(
-		self, value: str, comparer: int, key: str, message: str
-	) -> Self:
-		"""
-		Check if the length of a string value is greater than a given number and adds a notification if it's smaller.
-
-		Parameters
-		----------
-		`value`: str
-		    The string value to compare.
-		`comparer`: int
-		    The minimum length required for the value.
-		`key`: str
-		    The key or identifier associated with the comparison.
-		`message`: str
-		    The notification message to be added if the length is smaller than the comparer.
-
-		Returns:
-		-------
-		`self`
-		    The current instance with potential notifications added.
-
-		Notes:
-		-----
-		- If the `value` is an empty string or None, no notification is added.
-		- If the length of `value` is smaller than `comparer`, a notification is added to the current instance
-		with the provided `key` and `message`.
-
-		Examples:
-		--------
-		```python
-		obj = Contract()
-		      .is_greater_than("Hello", 3, "LengthCheck", "Value should have a length greater than 3")
-		obj.is_valid
-		```
-
-		"""
-		if not value:
-			return self
-
-		if len(value) < comparer:
-			self.add_notification(Notification(key, message))
-
-		return self
-
-	def is_greater_or_equals_than(
-		self, value: str, comparer: int, key: str, message: str
-	) -> Self:
-		"""
-		Check if the length of a string value is greater than or equal to a given number and adds a notification if it's smaller.
-
-		Parameters
-		----------
-		`value`: str
-		    The string value to compare.
-		`comparer`: int
-		    The minimum length required for the value.
-		`key`: str
-		    The key or identifier associated with the comparison.
-		`message`: str
-		    The notification message to be added if the length is smaller than the comparer.
-
-		Returns:
-		-------
-		`self`
-		    The current instance with potential notifications added.
-
-		Notes:
-		-----
-		- If the `value` is an empty string or None, no notification is added.
-		- If the length of `value` is smaller than or equal to `comparer`, a notification is added to the current instance
-		with the provided `key` and `message`.
-
-		Example:
-		--------
-		```python
-		obj = Contract()
-		      .is_greater_or_equals_than("Hello", 3, "LengthCheck", "Value should have a length greater than or equal to 3")
-		obj.is_valid
-		```
-
-		"""
-		if not value:
-			return self
-
-		if len(value) <= comparer:
-			self.add_notification(Notification(key, message))
-
-		return self
-
 	def is_not_none_or_white_space(self, value: str, key: str, message: str) -> Self:
 		"""
 		Check if a string value is not None or whitespace and adds a notification if it is.
@@ -247,7 +62,14 @@ def is_not_none_or_white_space(self, value: str, key: str, message: str) -> Self
 
 		return self
 
-	def contains(self, value: str, comparer: str, key: str, message: str) -> Self:
+
+	def contains(
+			self,
+			value: str,
+			comparer: str,
+			key: str,
+			message: str
+		) -> Self:
 		"""
 		Check if a string value contains another string and adds a notification if it does.
 
@@ -284,19 +106,27 @@ def contains(self, value: str, comparer: str, key: str, message: str) -> Self:
 		"""
 		if value.find(comparer) == -1:
 			self.add_notification(Notification(key, message))
+			return self
 
 		return self
 
-	def not_contains(self, value: str, comparer: str, key: str, message: str) -> Self:
+
+	def not_contains(
+			self,
+			value: str,
+			comparer:str,
+			key: str,
+			message: str
+		) -> Self:
 		"""
-		Check if a string value does not contain a specified substring and adds a notification if it does.
+		Check if a string value does not contain a specified string and adds a notification if it does.
 
 		Parameters
 		----------
 		`value`: str
 		    The string value to be checked.
 		`comparer`: str
-		    The substring to search for in the value.
+		    The string to search for in the value.
 		`key`: str
 		    The key or identifier associated with the check.
 		`message`: str
@@ -309,8 +139,8 @@ def not_contains(self, value: str, comparer: str, key: str, message: str) -> Sel
 
 		Notes:
 		-----
-		- If the `value` does not contain the `comparer` substring, no notification is added.
-		- If the `value` contains the `comparer` substring, a notification is added to the current instance
+		- If the `value` does not contain the `comparer` string, no notification is added.
+		- If the `value` contains the `comparer` string, a notification is added to the current instance
 		with the provided `key` and `message`.
 
 		Examples:
@@ -322,58 +152,7 @@ def not_contains(self, value: str, comparer: str, key: str, message: str) -> Sel
 		```
 
 		"""
-		if value.find(comparer) > -1:
+		if value.find(comparer) != -1:
 			self.add_notification(Notification(key, message))
-
-		return self
-
-	def is_between(
-		self, value: str, min: int, max: int, key: str, message: str
-	) -> Self:
-		"""
-		Require a string value to have a length between a minimum and maximum value (inclusive), and adds a notification if the length is outside the specified range.
-
-		Parameters
-		----------
-		`value`: str
-		    The string value to be checked.
-		`min`: int
-		    The minimum allowed length for the value.
-		`max`: int
-		    The maximum allowed length for the value.
-		`key`: str
-		    The key or identifier associated with the length check.
-		`message`: str
-		    The notification message to be added if the length is outside the range.
-
-		Returns:
-		-------
-		`self`
-		    The current instance with potential notifications added.
-
-		Notes:
-		-----
-		- If the `value` is empty, the function returns the current instance without adding any notifications.
-		- If the `value` is None or consists only of whitespace characters, the function returns the current instance without adding any notifications.
-		- If the length of `value` is less than `min` or greater than `max`, a notification is added to the current instance
-		with the provided `key` and `message`.
-
-		Examples:
-		--------
-		```python
-		obj = Contract()
-		      .is_between("Hello", 3, 6, "LengthCheck", "Value length should be between 3 and 6")
-		obj.is_valid
-		```
-
-		"""
-		if not value:
-			return self
-
-		if value is None or value.isspace():
 			return self
-
-		if len(value) < min or len(value) > max:
-			self.add_notification(Notification(key, message))
-
 		return self
diff --git a/poetry.lock b/poetry.lock
index f04a2fe..d5c09e2 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -308,63 +308,63 @@ files = [
 
 [[package]]
 name = "coverage"
-version = "7.4.3"
+version = "7.4.4"
 description = "Code coverage measurement for Python"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"},
-    {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"},
-    {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"},
-    {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"},
-    {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"},
-    {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"},
-    {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"},
-    {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"},
-    {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"},
-    {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"},
-    {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"},
-    {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"},
-    {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"},
-    {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"},
-    {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"},
-    {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"},
-    {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"},
-    {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"},
-    {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"},
-    {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"},
-    {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"},
-    {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"},
-    {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"},
-    {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"},
-    {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"},
-    {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"},
-    {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"},
-    {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"},
-    {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"},
-    {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"},
-    {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"},
-    {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"},
-    {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"},
-    {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"},
-    {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"},
-    {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"},
-    {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"},
-    {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"},
-    {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"},
-    {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"},
-    {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"},
-    {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"},
-    {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"},
-    {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"},
-    {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"},
-    {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"},
-    {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"},
-    {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"},
-    {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"},
-    {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"},
-    {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"},
-    {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"},
+    {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"},
+    {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"},
+    {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"},
+    {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"},
+    {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"},
+    {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"},
+    {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"},
+    {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"},
+    {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"},
+    {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"},
+    {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"},
+    {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"},
+    {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"},
+    {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"},
+    {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"},
+    {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"},
+    {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"},
+    {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"},
+    {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"},
+    {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"},
+    {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"},
+    {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"},
+    {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"},
+    {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"},
+    {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"},
+    {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"},
+    {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"},
+    {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"},
+    {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"},
+    {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"},
+    {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"},
+    {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"},
+    {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"},
+    {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"},
+    {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"},
+    {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"},
+    {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"},
+    {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"},
+    {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"},
+    {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"},
+    {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"},
+    {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"},
+    {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"},
+    {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"},
+    {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"},
+    {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"},
+    {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"},
+    {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"},
+    {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"},
+    {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"},
+    {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"},
+    {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"},
 ]
 
 [package.dependencies]
@@ -783,13 +783,13 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena
 
 [[package]]
 name = "markdown"
-version = "3.5.2"
+version = "3.6"
 description = "Python implementation of John Gruber's Markdown."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"},
-    {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"},
+    {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"},
+    {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"},
 ]
 
 [package.dependencies]
@@ -928,13 +928,13 @@ mkdocs = ">=1.1"
 
 [[package]]
 name = "mkdocs-material"
-version = "9.5.13"
+version = "9.5.14"
 description = "Documentation that simply works"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "mkdocs_material-9.5.13-py3-none-any.whl", hash = "sha256:5cbe17fee4e3b4980c8420a04cc762d8dc052ef1e10532abd4fce88e5ea9ce6a"},
-    {file = "mkdocs_material-9.5.13.tar.gz", hash = "sha256:d8e4caae576312a88fd2609b81cf43d233cdbe36860d67a68702b018b425bd87"},
+    {file = "mkdocs_material-9.5.14-py3-none-any.whl", hash = "sha256:a45244ac221fda46ecf8337f00ec0e5cb5348ab9ffb203ca2a0c313b0d4dbc27"},
+    {file = "mkdocs_material-9.5.14.tar.gz", hash = "sha256:2a1f8e67cda2587ab93ecea9ba42d0ca61d1d7b5fad8cf690eeaeb39dcd4b9af"},
 ]
 
 [package.dependencies]
@@ -1326,17 +1326,17 @@ files = [
 
 [[package]]
 name = "poetry-plugin-export"
-version = "1.6.0"
+version = "1.7.0"
 description = "Poetry plugin to export the dependencies to various formats"
 optional = false
 python-versions = ">=3.8,<4.0"
 files = [
-    {file = "poetry_plugin_export-1.6.0-py3-none-any.whl", hash = "sha256:2dce6204c9318f1f6509a11a03921fb3f461b201840b59f1c237b6ab454dabcf"},
-    {file = "poetry_plugin_export-1.6.0.tar.gz", hash = "sha256:091939434984267a91abf2f916a26b00cff4eee8da63ec2a24ba4b17cf969a59"},
+    {file = "poetry_plugin_export-1.7.0-py3-none-any.whl", hash = "sha256:2283b28e0209f9f9598c6fe44f30586ec91329ea1558f908708261e0516bf427"},
+    {file = "poetry_plugin_export-1.7.0.tar.gz", hash = "sha256:e73f207fc0e08c2f59ead82cbe39ef259b351a318d5c0bddcec13990bcd324a7"},
 ]
 
 [package.dependencies]
-poetry = ">=1.6.0,<2.0.0"
+poetry = ">=1.8.0,<2.0.0"
 poetry-core = ">=1.7.0,<2.0.0"
 
 [[package]]
@@ -2297,13 +2297,13 @@ test = ["pytest"]
 
 [[package]]
 name = "zipp"
-version = "3.18.0"
+version = "3.18.1"
 description = "Backport of pathlib-compatible object wrapper for zip files"
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "zipp-3.18.0-py3-none-any.whl", hash = "sha256:c1bb803ed69d2cce2373152797064f7e79bc43f0a3748eb494096a867e0ebf79"},
-    {file = "zipp-3.18.0.tar.gz", hash = "sha256:df8d042b02765029a09b157efd8e820451045890acc30f8e37dd2f94a060221f"},
+    {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"},
+    {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"},
 ]
 
 [package.extras]
diff --git a/pyproject.toml b/pyproject.toml
index 01d70c2..a742b4e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
 [tool.poetry]
 name = "Flunt"
-version = "2.2.0"
+version = "2.3.0"
 description = "Python implementation of Domain Notification Pattern inspired by Flunt (.NET)"
 authors = ["Emerson Delatorre <38289677+Delatorrea@users.noreply.github.com>"]
 repository = "https://github.com/Delatorrea/PyFlunt"
@@ -74,7 +74,13 @@ mkdocstrings-python = "^1.8.0"
 sample = "samples.flunt_sample:main"
 
 [tool.pytest.ini_options]
-addopts = "--doctest-modules"
+python_files = "test*.py"
+python_classes = "Test"
+python_functions = "test"
+addopts = "--tb=native"
+console_output_style = "classic"
+junit_duration_report = "call"
+filterwarnings = "ignore::RuntimeWarning"
 
 [tool.ruff]
 line-length = 88
diff --git a/requirements/requirements_dev.txt b/requirements/requirements_dev.txt
index d7d594a..9b12c36 100644
--- a/requirements/requirements_dev.txt
+++ b/requirements/requirements_dev.txt
@@ -166,59 +166,59 @@ cleo==2.1.0 ; python_version >= "3.9" and python_version < "4.0" \
 colorama==0.4.6 ; python_version >= "3.9" and python_version < "4.0" \
     --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
     --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
-coverage[toml]==7.4.3 ; python_version >= "3.9" and python_version < "4.0" \
-    --hash=sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa \
-    --hash=sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003 \
-    --hash=sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f \
-    --hash=sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c \
-    --hash=sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e \
-    --hash=sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0 \
-    --hash=sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9 \
-    --hash=sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52 \
-    --hash=sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e \
-    --hash=sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454 \
-    --hash=sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0 \
-    --hash=sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079 \
-    --hash=sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352 \
-    --hash=sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f \
-    --hash=sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30 \
-    --hash=sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe \
-    --hash=sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113 \
-    --hash=sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765 \
-    --hash=sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc \
-    --hash=sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e \
-    --hash=sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501 \
-    --hash=sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7 \
-    --hash=sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2 \
-    --hash=sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f \
-    --hash=sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4 \
-    --hash=sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524 \
-    --hash=sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c \
-    --hash=sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51 \
-    --hash=sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840 \
-    --hash=sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6 \
-    --hash=sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee \
-    --hash=sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e \
-    --hash=sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45 \
-    --hash=sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba \
-    --hash=sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d \
-    --hash=sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3 \
-    --hash=sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10 \
-    --hash=sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e \
-    --hash=sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb \
-    --hash=sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9 \
-    --hash=sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a \
-    --hash=sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47 \
-    --hash=sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1 \
-    --hash=sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3 \
-    --hash=sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914 \
-    --hash=sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328 \
-    --hash=sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6 \
-    --hash=sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d \
-    --hash=sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0 \
-    --hash=sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94 \
-    --hash=sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc \
-    --hash=sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2
+coverage[toml]==7.4.4 ; python_version >= "3.9" and python_version < "4.0" \
+    --hash=sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c \
+    --hash=sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63 \
+    --hash=sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7 \
+    --hash=sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f \
+    --hash=sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8 \
+    --hash=sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf \
+    --hash=sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0 \
+    --hash=sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384 \
+    --hash=sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76 \
+    --hash=sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7 \
+    --hash=sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d \
+    --hash=sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70 \
+    --hash=sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f \
+    --hash=sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818 \
+    --hash=sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b \
+    --hash=sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d \
+    --hash=sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec \
+    --hash=sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083 \
+    --hash=sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2 \
+    --hash=sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9 \
+    --hash=sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd \
+    --hash=sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade \
+    --hash=sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e \
+    --hash=sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a \
+    --hash=sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227 \
+    --hash=sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87 \
+    --hash=sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c \
+    --hash=sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e \
+    --hash=sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c \
+    --hash=sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e \
+    --hash=sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd \
+    --hash=sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec \
+    --hash=sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562 \
+    --hash=sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8 \
+    --hash=sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677 \
+    --hash=sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357 \
+    --hash=sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c \
+    --hash=sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd \
+    --hash=sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49 \
+    --hash=sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286 \
+    --hash=sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1 \
+    --hash=sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf \
+    --hash=sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51 \
+    --hash=sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409 \
+    --hash=sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384 \
+    --hash=sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e \
+    --hash=sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978 \
+    --hash=sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57 \
+    --hash=sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e \
+    --hash=sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2 \
+    --hash=sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48 \
+    --hash=sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4
 crashtest==0.4.1 ; python_version >= "3.9" and python_version < "4.0" \
     --hash=sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce \
     --hash=sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5
@@ -485,9 +485,9 @@ poethepoet==0.25.0 ; python_version >= "3.9" and python_version < "4.0" \
 poetry-core==1.9.0 ; python_version >= "3.9" and python_version < "4.0" \
     --hash=sha256:4e0c9c6ad8cf89956f03b308736d84ea6ddb44089d16f2adc94050108ec1f5a1 \
     --hash=sha256:fa7a4001eae8aa572ee84f35feb510b321bd652e5cf9293249d62853e1f935a2
-poetry-plugin-export==1.6.0 ; python_version >= "3.9" and python_version < "4.0" \
-    --hash=sha256:091939434984267a91abf2f916a26b00cff4eee8da63ec2a24ba4b17cf969a59 \
-    --hash=sha256:2dce6204c9318f1f6509a11a03921fb3f461b201840b59f1c237b6ab454dabcf
+poetry-plugin-export==1.7.0 ; python_version >= "3.9" and python_version < "4.0" \
+    --hash=sha256:2283b28e0209f9f9598c6fe44f30586ec91329ea1558f908708261e0516bf427 \
+    --hash=sha256:e73f207fc0e08c2f59ead82cbe39ef259b351a318d5c0bddcec13990bcd324a7
 poetry==1.8.2 ; python_version >= "3.9" and python_version < "4.0" \
     --hash=sha256:49cceb3838104647c3e1021f3a4f13c6053704cc18d33f849a90fe687a29cb73 \
     --hash=sha256:b42b400d9a803af6e788a30a6f3e9998020b77860e28df20647eb10b6f414910
@@ -905,6 +905,6 @@ xattr==1.1.0 ; python_version >= "3.9" and python_version < "4.0" and sys_platfo
     --hash=sha256:fa6a7af7a4ada43f15ccc58b6f9adcdbff4c36ba040013d2681e589e07ae280a \
     --hash=sha256:fecbf3b05043ed3487a28190dec3e4c4d879b2fcec0e30bafd8ec5d4b6043630 \
     --hash=sha256:ff6223a854229055e803c2ad0c0ea9a6da50c6be30d92c198cf5f9f28819a921
-zipp==3.18.0 ; python_version >= "3.9" and python_version < "3.12" \
-    --hash=sha256:c1bb803ed69d2cce2373152797064f7e79bc43f0a3748eb494096a867e0ebf79 \
-    --hash=sha256:df8d042b02765029a09b157efd8e820451045890acc30f8e37dd2f94a060221f
+zipp==3.18.1 ; python_version >= "3.9" and python_version < "3.12" \
+    --hash=sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b \
+    --hash=sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715


Test patch:
diff --git a/tests/mocks/entity/sample_entity.py b/tests/mocks/entity/sample_entity.py
index 1b75d28..4ce8347 100644
--- a/tests/mocks/entity/sample_entity.py
+++ b/tests/mocks/entity/sample_entity.py
@@ -15,3 +15,4 @@ def __init__(self) -> None:
 		self.email_invalid = 'any'
 		self.first_name = 'any_first_name'
 		self.last_name = 'any_last_name'
+		self.full_name = self.first_name + ' ' + self.last_name
diff --git a/tests/validations/test_collections_validation_contract.py b/tests/validations/test_collections_validation_contract.py
new file mode 100644
index 0000000..52eaa2c
--- /dev/null
+++ b/tests/validations/test_collections_validation_contract.py
@@ -0,0 +1,241 @@
+from faker import Faker
+import pytest
+from flunt.validations.collections_validation_contract import CollectionsValidationContract
+from tests.mocks.entity.sample_entity import SampleEntity
+from random import randint
+
+
+fake = Faker()
+
+@pytest.fixture()
+def key():
+    yield 'first_name'
+
+
+@pytest.fixture()
+def message():
+	yield 'any message'
+
+
+range_one_to_nineteen = randint(1, 19)
+range_twenty_to_fifty = randint(20, 50)
+range_fiftyone_to_onehundred = randint(51, 100)
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyiterable(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pylist(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyset(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pystr(max_chars=range_one_to_nineteen), range_twenty_to_fifty),
+		(fake.pytuple(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+	],
+)
+def test_should_be_valid_when_is_lower_than(input, expect, key, message):
+	contract = CollectionsValidationContract().is_lower_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid
+	assert len(contract.get_notifications()) == 0
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyiterable(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pylist(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyset(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pystr(max_chars=range_twenty_to_fifty), range_one_to_nineteen),
+		(fake.pytuple(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pydict(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyiterable(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pylist(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyset(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pystr(max_chars=10), 10),
+		(fake.pytuple(nb_elements=10, variable_nb_elements=False), 10)
+	],
+)
+def test_should_be_invalid_and_return_once_notification_when_not_is_lower_than(
+	input, expect, key, message
+):
+	contract = CollectionsValidationContract().is_lower_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid is False
+	assert len(contract.get_notifications()) == 1
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyiterable(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pylist(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyset(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pystr(max_chars=range_one_to_nineteen), range_twenty_to_fifty),
+		(fake.pytuple(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pydict(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyiterable(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pylist(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyset(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pystr(max_chars=10), 10),
+		(fake.pytuple(nb_elements=10, variable_nb_elements=False), 10)
+	],
+)
+def test_should_be_valid_when_is_lower_or_equals_than(
+	input, expect, key, message
+):
+	contract = CollectionsValidationContract().is_lower_or_equals_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid
+	assert len(contract.get_notifications()) == 0
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyiterable(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pylist(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyset(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pystr(max_chars=range_twenty_to_fifty), range_one_to_nineteen),
+		(fake.pytuple(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+	],
+)
+def test_should_be_invalid_and_return_once_notification_when_not_is_lower_or_equals_than(
+	input, expect, key, message
+):
+	contract = CollectionsValidationContract().is_lower_or_equals_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid is False
+	assert len(contract.get_notifications()) == 1
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyiterable(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pylist(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyset(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pystr(max_chars=range_twenty_to_fifty), range_one_to_nineteen),
+		(fake.pytuple(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen)
+	],
+)
+def test_should_be_valid_when_is_greater_than(input, expect, key, message):
+	contract = CollectionsValidationContract().is_greater_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid
+	assert len(contract.get_notifications()) == 0
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyiterable(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pylist(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyset(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pystr(max_chars=range_one_to_nineteen), range_twenty_to_fifty),
+		(fake.pytuple(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pydict(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyiterable(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pylist(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyset(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pystr(max_chars=10), 10),
+		(fake.pytuple(nb_elements=10, variable_nb_elements=False), 10)
+	],
+)
+def test_should_be_invalid_and_return_once_notification_when_not_is_greater_than(
+	input, expect, key, message
+):
+	contract = CollectionsValidationContract().is_greater_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid is False
+	assert len(contract.get_notifications()) == 1
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyiterable(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pylist(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pyset(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pystr(max_chars=range_twenty_to_fifty), range_one_to_nineteen),
+		(fake.pytuple(nb_elements=range_twenty_to_fifty, variable_nb_elements=False), range_one_to_nineteen),
+		(fake.pydict(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyiterable(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pylist(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pyset(nb_elements=10, variable_nb_elements=False), 10),
+		(fake.pystr(max_chars=10), 10),
+		(fake.pytuple(nb_elements=10, variable_nb_elements=False), 10)
+	],
+)
+def test_should_be_valid_when_is_greater_or_equals_than(
+	input, expect, key, message
+):
+	contract = CollectionsValidationContract().is_greater_or_equals_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid
+	assert len(contract.get_notifications()) == 0
+
+
+@pytest.mark.parametrize(
+	'input, expect',
+	[
+		(fake.pydict(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyiterable(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pylist(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pyset(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty),
+		(fake.pystr(max_chars=range_one_to_nineteen), range_twenty_to_fifty),
+		(fake.pytuple(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty)
+	],
+)
+def test_should_be_invalid_and_return_once_notification_when_not_is_greater_or_equals_than(
+	input, expect, key, message
+):
+	contract = CollectionsValidationContract().is_greater_or_equals_than(
+		input, expect, key, message
+	)
+	assert contract.is_valid is False
+	assert len(contract.get_notifications()) == 1
+
+
+@pytest.mark.parametrize(
+	'input, min, max',
+	[
+		(fake.pydict(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_one_to_nineteen, range_twenty_to_fifty),
+		(fake.pyiterable(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_one_to_nineteen, range_twenty_to_fifty),
+		(fake.pylist(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_one_to_nineteen, range_twenty_to_fifty),
+		(fake.pyset(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_one_to_nineteen, range_twenty_to_fifty),
+		(fake.pystr(max_chars=range_one_to_nineteen), range_one_to_nineteen, range_twenty_to_fifty),
+		(fake.pytuple(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_one_to_nineteen, range_twenty_to_fifty)
+	],
+)
+def test_should_be_valid_and_not_return_notification_when_value_is_between(input, min, max, key, message):
+	contract = CollectionsValidationContract().is_between(input, min, max, key, message)
+	assert contract.is_valid
+
+
+@pytest.mark.parametrize(
+	'input, min, max',
+	[
+		(fake.pydict(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty, range_fiftyone_to_onehundred),
+		(fake.pyiterable(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty, range_fiftyone_to_onehundred),
+		(fake.pylist(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty, range_fiftyone_to_onehundred),
+		(fake.pyset(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty, range_fiftyone_to_onehundred),
+		(fake.pystr(max_chars=range_one_to_nineteen), range_twenty_to_fifty, range_fiftyone_to_onehundred),
+		(fake.pytuple(nb_elements=range_one_to_nineteen, variable_nb_elements=False), range_twenty_to_fifty, range_fiftyone_to_onehundred)
+	],
+)
+def test_should_be_invalid_and_return_once_notification_when_value_is_not_between(input, min, max, key, message):
+	contract = CollectionsValidationContract().is_between(input, min, max, key, message)
+	assert contract.is_valid is False
diff --git a/tests/validations/test_string_validation_contract.py b/tests/validations/test_string_validation_contract.py
index ee961ac..a71597c 100644
--- a/tests/validations/test_string_validation_contract.py
+++ b/tests/validations/test_string_validation_contract.py
@@ -13,82 +13,6 @@ def message():
 	yield 'any message'
 
 
-def test_should_be_valid_when_is_lower_than_20(entity_mock: SampleEntity, key, message):
-	contract = StringValidationContract().is_lower_than(
-		entity_mock.first_name, 20, key, message
-	)
-	assert contract.is_valid
-	assert len(contract.get_notifications()) == 0
-
-
-def test_should_be_invalid_and_return_once_notification_when_not_is_lower_than_5(
-	entity_mock: SampleEntity, key, message
-):
-	contract = StringValidationContract().is_lower_than(
-		entity_mock.first_name, 5, key, message
-	)
-	assert contract.is_valid is False
-	assert len(contract.get_notifications()) == 1
-
-
-def test_should_be_valid_when_is_lower_or_equals_than_20(
-	entity_mock: SampleEntity, key, message
-):
-	contract = StringValidationContract().is_lower_or_equals_than(
-		entity_mock.first_name, 20, key, message
-	)
-	assert contract.is_valid
-	assert len(contract.get_notifications()) == 0
-
-
-def test_should_be_invalid_and_return_once_notification_when_not_is_lower_or_equals_than_14(
-	entity_mock: SampleEntity, key, message
-):
-	contract = StringValidationContract().is_lower_or_equals_than(
-		entity_mock.first_name, 14, key, message
-	)
-	assert contract.is_valid is False
-	assert len(contract.get_notifications()) == 1
-
-
-def test_should_be_valid_when_is_greater_than_10(entity_mock: SampleEntity, key, message):
-	contract = StringValidationContract().is_greater_than(
-		entity_mock.first_name, 10, key, message
-	)
-	assert contract.is_valid
-	assert len(contract.get_notifications()) == 0
-
-
-def test_should_be_invalid_and_return_once_notification_when_not_is_greater_than_15(
-	entity_mock: SampleEntity, key, message
-):
-	contract = StringValidationContract().is_greater_than(
-		entity_mock.first_name, 15, key, message
-	)
-	assert contract.is_valid is False
-	assert len(contract.get_notifications()) == 1
-
-
-def test_should_be_valid_when_is_greater_or_equals_than_13(
-	entity_mock: SampleEntity, key, message
-):
-	contract = StringValidationContract().is_greater_or_equals_than(
-		entity_mock.first_name, 13, key, message
-	)
-	assert contract.is_valid
-	assert len(contract.get_notifications()) == 0
-
-
-def test_should_be_invalid_and_return_once_notification_when_not_is_greater_or_equals_than_14(
-	entity_mock: SampleEntity, key, message
-):
-	contract = StringValidationContract().is_greater_or_equals_than(
-		entity_mock.first_name, 14, key, message
-	)
-	assert contract.is_valid is False
-	assert len(contract.get_notifications()) == 1
-
-
 def test_should_be_valid_when_is_not_none_or_white_space(
 	entity_mock: SampleEntity, key, message
 ):
@@ -112,34 +36,24 @@ def test_should_be_invalid_and_return_once_notification_when_white_space(key, me
 
 
 def test_should_be_valid_and_not_return_notification_when_contains_a_search_string(entity_mock: SampleEntity, key, message):
-	contract = StringValidationContract().contains(entity_mock.first_name, "any", key, message)
+	contract = StringValidationContract().contains(entity_mock.full_name, entity_mock.last_name, key, message)
 	assert contract.is_valid
 	assert len(contract.get_notifications()) == 0
 
 
 def test_should_be_invalid_and_return_once_notification_when_not_contains_a_search_string(entity_mock: SampleEntity, key, message):
-	contract = StringValidationContract().contains(entity_mock.first_name, "bla", key, message)
+	contract = StringValidationContract().contains(entity_mock.full_name, "Vitor", key, message)
 	assert contract.is_valid is False
 	assert len(contract.get_notifications()) == 1
 
 
 def test_should_be_valid_and_not_return_notification_when_not_contains_a_search_string(entity_mock: SampleEntity, key, message):
-	contract = StringValidationContract().not_contains(entity_mock.first_name, "bla", key, message)
+	contract = StringValidationContract().not_contains(entity_mock.full_name, "Vitor", key, message)
 	assert contract.is_valid
 	assert len(contract.get_notifications()) == 0
 
 
 def test_should_be_invalid_and_return_once_notification_when_contains_a_search_string(entity_mock: SampleEntity, key, message):
-	contract = StringValidationContract().not_contains(entity_mock.first_name, "any", key, message)
+	contract = StringValidationContract().not_contains(entity_mock.full_name, entity_mock.last_name, key, message)
 	assert contract.is_valid is False
 	assert len(contract.get_notifications()) == 1
-
-
-def test_should_be_valid_and_not_return_notification_when_value_is_between():
-	contract = StringValidationContract().is_between("any_text", 1, 10, "test", "any_message")
-	assert contract.is_valid
-
-
-def test_should_be_invalid_and_return_once_notification_when_value_is_not_between():
-	contract = StringValidationContract().is_between("any_text", 10, 20, "test", "any_message")
-	assert contract.is_valid is False