Files
dc-project/src/test/kotlin/integration/steps/given/Workgroup.kt
Fabrice f380231e1e Multiple minors fix and improve
use data class for entity
Add sealed on entity interfaces
Replace listOf() by setOf() instead of deduplicate
use interface instead of EntityRef
replace .toLowerCase() to .lowercase()
fix test.sh
2022-03-03 19:42:18 +01:00

91 lines
3.5 KiB
Kotlin

package integration.steps.given
import fr.dcproject.common.utils.toUUID
import fr.dcproject.component.auth.database.UserForCreate
import fr.dcproject.component.citizen.database.Citizen
import fr.dcproject.component.citizen.database.CitizenCreator
import fr.dcproject.component.citizen.database.CitizenForCreate
import fr.dcproject.component.citizen.database.CitizenI
import fr.dcproject.component.citizen.database.CitizenRepository
import fr.dcproject.component.workgroup.database.WorkgroupForUpdate
import fr.dcproject.component.workgroup.database.WorkgroupForView
import fr.dcproject.component.workgroup.database.WorkgroupRepository
import fr.dcproject.component.workgroup.database.WorkgroupWithMembersI.Member
import fr.dcproject.component.workgroup.database.WorkgroupWithMembersI.Member.Role.MASTER
import io.ktor.server.testing.TestApplicationEngine
import org.joda.time.DateTime
import org.koin.core.context.GlobalContext
import java.util.UUID
fun TestApplicationEngine.`Given I have workgroup`(
id: String? = null,
name: String? = null,
description: String? = null,
anonymous: Boolean? = null,
createdBy: CitizenI.Name? = null,
callback: WorkgroupForView<CitizenCreator>.() -> Unit = {},
) {
val workgroup: WorkgroupForView<CitizenCreator> = createWorkgroup(id?.toUUID(), name, description, anonymous, createdBy)
callback(workgroup)
}
fun WorkgroupForView<CitizenCreator>.`With members`(
vararg member: CitizenI.Name
) {
addMemberToWorkgroup(this, *member)
}
@Suppress("UNCHECKED_CAST")
fun addMemberToWorkgroup(workgroup: WorkgroupForView<CitizenCreator>, vararg membersNames: CitizenI.Name) {
val citizenRepository: CitizenRepository by lazy { GlobalContext.get().get() }
val workgroupRepository: WorkgroupRepository by lazy { GlobalContext.get().get() }
val newMembers: List<Member<CitizenI>> = membersNames.map { memberName ->
val member: Citizen = citizenRepository.findByName(memberName) ?: error("Citizen not exist")
Member(member, listOf(Member.Role.EDITOR))
}
workgroupRepository.updateMembers<CitizenI>(
workgroup,
workgroup.members as List<Member<CitizenI>> + newMembers
)
}
private fun createWorkgroup(
id: UUID? = null,
name: String? = null,
description: String? = null,
anonymous: Boolean? = null,
createdBy: CitizenI.Name? = null,
): WorkgroupForView<CitizenCreator> {
val citizenRepository: CitizenRepository by lazy { GlobalContext.get().get() }
val workgroupRepository: WorkgroupRepository by lazy { GlobalContext.get().get() }
val creatorName = createdBy ?: CitizenI.Name("Paul", "Langevin")
val creator = citizenRepository.findByName(creatorName) ?: run {
val username = ("username" + UUID.randomUUID().toString())
.lowercase().replace(' ', '-')
val user = UserForCreate(
username = username,
password = "Azerty123!",
)
CitizenForCreate(
name = creatorName,
email = "$username@dc-project.fr",
birthday = DateTime.now(),
user = user
).let {
citizenRepository.insertWithUser(it) ?: error("Unable to create User")
}
}
val workgroup = WorkgroupForUpdate(
id = id ?: UUID.randomUUID(),
name = name ?: "Les Incoruptible",
description = description ?: "La vie est notre jeux",
createdBy = creator,
anonymous = anonymous ?: false,
members = listOf(Member(creator, listOf(MASTER)))
)
return workgroupRepository.upsert(workgroup)
}