Refactors Citizen into component

Refactor CitizenVoter
Split citizens routes
This commit is contained in:
2021-01-14 15:07:59 +01:00
parent a1c1accc87
commit 6a8c5bf717
63 changed files with 404 additions and 346 deletions

View File

@@ -1,7 +1,7 @@
import fr.dcproject.Env
import fr.dcproject.component.article.ArticleRefVersioning
import fr.dcproject.component.article.ArticleViewManager
import fr.dcproject.entity.CitizenRef
import fr.dcproject.component.citizen.CitizenRef
import fr.dcproject.module
import io.ktor.locations.*
import io.ktor.server.testing.*

View File

@@ -3,7 +3,11 @@ package feature
import fr.dcproject.component.article.ArticleForUpdate
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.article.ArticleRepository
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.entity.CommentForUpdate
import fr.dcproject.entity.WorkgroupRef
import fr.dcproject.repository.CommentArticle
import fr.dcproject.utils.toUUID
import io.cucumber.datatable.DataTable
@@ -13,7 +17,6 @@ import org.koin.test.KoinTest
import org.koin.test.get
import java.util.*
import fr.dcproject.entity.User as UserEntity
import fr.dcproject.repository.Citizen as CitizenRepository
class ArticleSteps : En, KoinTest {
init {

View File

@@ -1,7 +1,8 @@
package feature
import fr.dcproject.entity.Citizen
import fr.dcproject.entity.CitizenI
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.entity.User
import io.cucumber.datatable.DataTable
import io.cucumber.java8.En
@@ -9,7 +10,6 @@ import org.joda.time.DateTime
import org.koin.test.KoinTest
import org.koin.test.get
import java.util.*
import fr.dcproject.repository.Citizen as CitizenRepository
class CitizenSteps : En, KoinTest {
init {

View File

@@ -1,7 +1,13 @@
package feature
import fr.dcproject.component.article.ArticleRef
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.component.citizen.CitizenWithUserI
import fr.dcproject.entity.CommentForUpdate
import fr.dcproject.entity.ConstitutionRef
import fr.dcproject.entity.ConstitutionSimple
import fr.dcproject.repository.CommentConstitution
import fr.dcproject.utils.toUUID
import io.cucumber.datatable.DataTable
@@ -11,7 +17,6 @@ import org.koin.test.KoinTest
import org.koin.test.get
import java.util.*
import fr.dcproject.entity.User as UserEntity
import fr.dcproject.repository.Citizen as CitizenRepository
import fr.dcproject.repository.Constitution as ConstitutionRepository
class ConstitutionSteps : En, KoinTest {

View File

@@ -1,13 +1,13 @@
package feature
import fr.dcproject.component.article.ArticleRef
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.entity.ConstitutionRef
import fr.dcproject.entity.FollowForUpdate
import fr.dcproject.utils.toUUID
import io.cucumber.java8.En
import org.koin.test.KoinTest
import org.koin.test.get
import fr.dcproject.repository.Citizen as CitizenRepository
import fr.dcproject.repository.FollowArticle as FollowArticleRepository
import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository

View File

@@ -2,11 +2,11 @@ package feature
import com.auth0.jwt.JWT
import fr.dcproject.JwtConfig
import fr.dcproject.component.citizen.CitizenRepository
import io.cucumber.java8.En
import io.ktor.http.*
import org.koin.test.KoinTest
import org.koin.test.get
import fr.dcproject.repository.Citizen as CitizenRepository
class KtorServerAuthSteps : En, KoinTest {
init {

View File

@@ -2,6 +2,7 @@ package feature
import fr.dcproject.component.article.ArticleRef
import fr.dcproject.component.article.ArticleRepository
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.entity.OpinionChoice
import fr.dcproject.entity.OpinionForUpdate
import fr.dcproject.utils.toUUID
@@ -10,7 +11,6 @@ import io.cucumber.java8.En
import org.koin.test.KoinTest
import org.koin.test.get
import java.util.*
import fr.dcproject.repository.Citizen as CitizenRepository
import fr.dcproject.repository.OpinionArticle as OpinionRepository
import fr.dcproject.repository.OpinionChoice as OpinionChoiceRepository

View File

@@ -1,13 +1,13 @@
package feature
import fr.dcproject.component.article.ArticleRepository
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.entity.VoteForUpdate
import fr.dcproject.utils.toUUID
import io.cucumber.java8.En
import org.koin.test.KoinTest
import org.koin.test.get
import java.util.*
import fr.dcproject.repository.Citizen as CitizenRepository
import fr.dcproject.repository.VoteArticle as VoteRepository
class VoteSteps : En, KoinTest {

View File

@@ -1,5 +1,9 @@
package feature
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenRef
import fr.dcproject.component.citizen.CitizenRepository
import fr.dcproject.entity.*
import fr.dcproject.entity.WorkgroupWithMembersI.Member
import fr.dcproject.utils.toUUID
@@ -10,7 +14,6 @@ import org.junit.Assert
import org.koin.test.KoinTest
import org.koin.test.get
import java.util.*
import fr.dcproject.repository.Citizen as CitizenRepository
import fr.dcproject.repository.Workgroup as WorkgroupRepository
class WorkgroupSteps : En, KoinTest {

View File

@@ -2,8 +2,8 @@ package fr.dcproject.security.voter
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.article.ArticleVoter
import fr.dcproject.entity.CitizenCart
import fr.dcproject.entity.CitizenI
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.voter.Vote.DENIED

View File

@@ -1,22 +1,19 @@
package fr.dcproject.security.voter
import fr.dcproject.entity.CitizenBasic
import fr.dcproject.entity.CitizenI
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.component.citizen.CitizenVoter
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.user
import fr.ktorVoter.*
import io.ktor.application.*
import fr.dcproject.voter.Vote.DENIED
import fr.dcproject.voter.Vote.GRANTED
import io.ktor.locations.*
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import org.amshove.kluent.`should be`
import org.joda.time.DateTime
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.api.assertThrows
@KtorExperimentalLocationsAPI
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@@ -57,78 +54,51 @@ class CitizenVoterTest {
}
@Test
fun `support citizen`(): Unit = CitizenVoter().run {
val p = object : ActionI {}
mockk<ApplicationCall> {
every { user } returns tesla.user
}.let {
this(CitizenVoter.Action.VIEW, it, einstein).vote `should be` Vote.GRANTED
this(p, it, einstein).vote `should be` Vote.ABSTAIN
}
fun `can be view the citizen`() {
CitizenVoter()
.canView(subject = einstein, connectedCitizen = tesla)
.vote `should be` GRANTED
}
@Test
fun `can be view the citizen`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns tesla.user
}.let {
can(CitizenVoter.Action.VIEW, it, einstein) `should be` true
}
fun `can be view the citizen list`() {
CitizenVoter()
.canView(subjects = listOf(tesla, einstein), connectedCitizen = einstein)
.vote `should be` GRANTED
}
@Test
fun `can be view the citizen list`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns einstein.user
}.let {
canAll(CitizenVoter.Action.VIEW, it, listOf(einstein, tesla)) `should be` true
}
fun `can not view deleted citizen`() {
CitizenVoter()
.canView(subject = curie, connectedCitizen = tesla)
.vote `should be` DENIED
}
@Test
fun `can not view deleted citizen`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns tesla.user
}.let {
can(CitizenVoter.Action.VIEW, it, curie) `should be` false
}
fun `can be update itself`() {
CitizenVoter()
.canUpdate(subject = einstein, connectedCitizen = einstein)
.vote `should be` GRANTED
}
@Test
fun `can be update itself`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns einstein.user
}.let {
can(CitizenVoter.Action.UPDATE, it, einstein) `should be` true
}
fun `can not be update other citizen`() {
CitizenVoter()
.canUpdate(subject = tesla, connectedCitizen = einstein)
.vote `should be` DENIED
}
@Test
fun `can not be update other citizen`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns einstein.user
}.let {
assertThrows<OneOrMoreVoterDeniedException> {
assertCan(CitizenVoter.Action.UPDATE, it, tesla)
}
}
fun `can be change password of itself`() {
CitizenVoter()
.canChangePassword(subject = einstein, connectedCitizen = einstein)
.vote `should be` GRANTED
}
@Test
fun `can be change password of itself`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns einstein.user
}.let {
can(CitizenVoter.Action.CHANGE_PASSWORD, it, einstein) `should be` true
}
}
@Test
fun `can not be change password of other citizen`(): Unit = listOf(CitizenVoter()).run {
mockk<ApplicationCall> {
every { user } returns einstein.user
}.let {
can(CitizenVoter.Action.CHANGE_PASSWORD, it, tesla) `should be` false
}
fun `can not be change password of other citizen`() {
CitizenVoter()
.canChangePassword(subject = tesla, connectedCitizen = einstein)
.vote `should be` DENIED
}
}

View File

@@ -3,10 +3,15 @@ package fr.dcproject.security.voter
import fr.dcproject.citizenOrNull
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.article.ArticleRef
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.CommentForUpdate
import fr.dcproject.entity.CommentForView
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.voter.NoSubjectDefinedException
import fr.ktorVoter.*
import fr.ktorVoter.Vote
import fr.postgresjson.connexion.Paginated
import io.ktor.application.*
import io.ktor.locations.*

View File

@@ -2,7 +2,13 @@ package fr.dcproject.security.voter
import fr.dcproject.citizenOrNull
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.Follow
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.voter.NoSubjectDefinedException
import fr.ktorVoter.ActionI
import fr.ktorVoter.Vote

View File

@@ -1,7 +1,12 @@
package fr.dcproject.security.voter
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.OpinionChoice
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.user
import fr.ktorVoter.ActionI
import fr.ktorVoter.Vote

View File

@@ -1,11 +1,16 @@
package fr.dcproject.security.voter
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.Opinion
import fr.dcproject.entity.OpinionChoice
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.user
import fr.dcproject.voter.NoSubjectDefinedException
import fr.ktorVoter.*
import fr.ktorVoter.Vote
import io.ktor.application.*
import io.ktor.locations.*
import io.mockk.every

View File

@@ -3,7 +3,13 @@ package fr.dcproject.security.voter
import fr.dcproject.citizenOrNull
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.component.article.ArticleRef
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.Citizen
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.entity.VoteForUpdate
import fr.dcproject.voter.NoSubjectDefinedException
import fr.ktorVoter.ActionI
import fr.ktorVoter.Vote

View File

@@ -1,7 +1,13 @@
package fr.dcproject.security.voter
import fr.dcproject.component.article.ArticleForView
import fr.dcproject.entity.*
import fr.dcproject.component.citizen.CitizenBasic
import fr.dcproject.component.citizen.CitizenCart
import fr.dcproject.component.citizen.CitizenI
import fr.dcproject.entity.User
import fr.dcproject.entity.UserI
import fr.dcproject.entity.WorkgroupRef
import fr.dcproject.entity.WorkgroupWithMembersI
import fr.dcproject.user
import fr.dcproject.voter.NoSubjectDefinedException
import fr.ktorVoter.ActionI