PoisonedYouth
09/12/2023, 5:54 AMigor.wojda
09/12/2023, 9:22 AMassert
where for example you can post tips to fix the issue. See PR desc https://github.com/LemonAppDev/konsist/pull/495PoisonedYouth
09/12/2023, 9:56 AM@Test
fun `Konsist - adapter package should not access domain package`(){
Konsist.scopeFromProduction()
.files
.withPackage("com.poisonedyouth.financemanagement.security.adapter..")
.assert {
it.hasNoImports("com.poisonedyouth.financemanagement.security.domain..")
}
}
Failure:
com.lemonappdev.konsist.core.exception.KoCheckFailedException: Assert 'Konsist - adapter package should not access domain package' has failed. Invalid files (1):
projects\workspace\private\finance-management\src\main\kotlin\com\poisonedyouth\financemanagement\security\adapter\persistence\ExposedUserCredentialsRepository.kt (ExposedUserCredentialsRepository FileDeclaration)
at app//com.lemonappdev.konsist.core.verify.KoDeclarationAndProviderAssertCoreKt.getResult(KoDeclarationAndProviderAssertCore.kt:119)
at app//com.lemonappdev.konsist.core.verify.KoDeclarationAndProviderAssertCoreKt.assert(KoDeclarationAndProviderAssertCore.kt:35)
at app//com.lemonappdev.konsist.api.verify.KoDeclarationAndProviderAssertKt.assert(KoDeclarationAndProviderAssert.kt:13)
at app//com.poisonedyouth.financemanagement.konsist.VerifyArchitecture.Konsist - adapter package should not access domain package(VerifyArchitecture.kt:29)
at java.base@17.0.5/java.lang.reflect.Method.invoke(Method.java:568)
at java.base@17.0.5/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base@17.0.5/java.util.ArrayList.forEach(ArrayList.java:1511)
ArchUnit:
@Test
fun `ArchUnit - adapter package should not access domain package`(){
val rule = noClasses()
.that()
.resideInAnyPackage("com.poisonedyouth.financemanagement.security.adapter..")
.should()
.accessClassesThat()
.resideInAnyPackage(
"com.poisonedyouth.financemanagement.security.domain.."
)
val allClasses = ClassFileImporter().importPackages("com.poisonedyouth.financemanagement")
// then
assertNoViolation(rule.evaluate(allClasses))
}
Failure:
java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'no classes that reside in any package ['com.poisonedyouth.financemanagement.security.adapter..'] should access classes that reside in any package ['com.poisonedyouth.financemanagement.security.domain..']' was violated (6 times):
Method <com.poisonedyouth.financemanagement.security.adapter.persistence.ExposedUserCredentialsRepository$create$1$1$1.invoke(com.poisonedyouth.financemanagement.security.adapter.persistence.UserCredentialsTable, org.jetbrains.exposed.sql.statements.InsertStatement)> calls method <com.poisonedyouth.financemanagement.security.domain.UserCredentials.getPassword()> in (ExposedUserCredentialsRepository.kt:26)
Method <com.poisonedyouth.financemanagement.security.adapter.persistence.ExposedUserCredentialsRepository$create$1$1$1.invoke(com.poisonedyouth.financemanagement.security.adapter.persistence.UserCredentialsTable, org.jetbrains.exposed.sql.statements.InsertStatement)> calls method <com.poisonedyouth.financemanagement.security.domain.UserCredentials.getUserId-hrrTlGk()> in (ExposedUserCredentialsRepository.kt:25)
Method <com.poisonedyouth.financemanagement.security.adapter.persistence.ExposedUserCredentialsRepository$findById$1.invoke(org.jetbrains.exposed.sql.Transaction)> calls constructor <com.poisonedyouth.financemanagement.security.domain.UserCredentials.<init>(java.util.UUID, java.lang.String, kotlin.jvm.internal.DefaultConstructorMarker)> in (ExposedUserCredentialsRepository.kt:57)
Method <com.poisonedyouth.financemanagement.security.adapter.persistence.ExposedUserCredentialsRepository$update$1$updateResult$1$1.invoke(org.jetbrains.exposed.sql.SqlExpressionBuilder)> calls method <com.poisonedyouth.financemanagement.security.domain.UserCredentials.getUserId-hrrTlGk()> in (ExposedUserCredentialsRepository.kt:34)
Method <com.poisonedyouth.financemanagement.security.adapter.persistence.ExposedUserCredentialsRepository$update$1$updateResult$1$2.invoke(com.poisonedyouth.financemanagement.security.adapter.persistence.UserCredentialsTable, org.jetbrains.exposed.sql.statements.UpdateStatement)> calls method <com.poisonedyouth.financemanagement.security.domain.UserCredentials.getPassword()> in (ExposedUserCredentialsRepository.kt:35)
Method <com.poisonedyouth.financemanagement.security.adapter.persistence.ExposedUserCredentialsRepository$update$1.invoke(org.jetbrains.exposed.sql.Transaction)> calls method <com.poisonedyouth.financemanagement.security.domain.UserCredentials.getUserId-hrrTlGk()> in (ExposedUserCredentialsRepository.kt:40)
at com.tngtech.archunit.lang.ArchRule$Assertions.assertNoViolation(ArchRule.java:94)
at com.poisonedyouth.financemanagement.konsist.VerifyArchitecture.ArchUnit - adapter package should not access domain package(VerifyArchitecture.kt:47)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
igor.wojda
09/12/2023, 9:50 PMassertArchitecture
https://docs.konsist.lemonappdev.com/writing-tests/architecture-assertPoisonedYouth
09/13/2023, 8:54 AMassertArchitecturre
- how can I implement notDependsOn(layer)
?igor.wojda
09/13/2023, 1:40 PMPoisonedYouth
09/13/2023, 4:08 PMigor.wojda
09/14/2023, 11:12 AMPoisonedYouth
09/17/2023, 12:03 PMPoisonedYouth
09/18/2023, 7:03 AMaccount
and user
) whose dependencies should be enforced in 2 different ways:
• Inside the single domain.
• Across different domains.
As an example. The user
domain is allowed to use the account
domain but not the other direction. It is important to mention that the account domain is allowed to access other domains like transaction
. So the dependsOnNothing
function is not completely correct.
I hope you understand, what my intention is.igor.wojda
09/19/2023, 7:15 AMigor.wojda
09/24/2023, 7:13 PMPoisonedYouth
09/24/2023, 7:55 PM