diff --git a/.gitignore b/.gitignore index 60d9300..dae81a0 100755 --- a/.gitignore +++ b/.gitignore @@ -2,20 +2,7 @@ # Created by https://www.gitignore.io/api/web,git,node,java,maven,macos,linux,gradle,kotlin,eclipse,vagrant,netbeans,intellij,archlinuxpackages # Edit at https://www.gitignore.io/?templates=web,git,node,java,maven,macos,linux,gradle,kotlin,eclipse,vagrant,netbeans,intellij,archlinuxpackages -### ArchLinuxPackages ### -*.tar -*.tar.* -*.jar -*.exe -*.msi -*.zip -*.tgz -*.log -*.log.* -*.sig - -pkg/ -src/ + ### Eclipse ### .metadata diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..131f0be --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/markdown-exported-files.xml b/.idea/markdown-exported-files.xml new file mode 100644 index 0000000..5d1f129 --- /dev/null +++ b/.idea/markdown-exported-files.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml new file mode 100644 index 0000000..d030f38 --- /dev/null +++ b/.idea/markdown-navigator.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml new file mode 100644 index 0000000..db06266 --- /dev/null +++ b/.idea/markdown-navigator/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..aa34541 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fea60b4 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.iml new file mode 100644 index 0000000..7c1473f --- /dev/null +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.main.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.main.iml new file mode 100644 index 0000000..0c58a18 --- /dev/null +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.main.iml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml b/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml new file mode 100644 index 0000000..0b63719 --- /dev/null +++ b/.idea/modules/pl.braintelligence.project-manager-kotlin.test.iml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt deleted file mode 100644 index f369df7..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Feature.kt +++ /dev/null @@ -1,7 +0,0 @@ -package pl.braintelligence.projectmanager.core.projects.domain - -class Feature( - val name: String, - val status: Status = Status.TO_DO, - val priorityLevel: PriorityLevel = PriorityLevel.NOT_DEFINED -) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt deleted file mode 100644 index 1b50509..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/PriorityLevel.kt +++ /dev/null @@ -1,10 +0,0 @@ -package pl.braintelligence.projectmanager.core.projects.domain - -enum class PriorityLevel { - HIGHEST, - HIGH, - MEDIUM, - LOW, - LOWEST, - NOT_DEFINED -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt index 731e0d4..8989150 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Project.kt @@ -1,9 +1,51 @@ package pl.braintelligence.projectmanager.core.projects.domain -data class Project( +import org.apache.commons.lang3.StringUtils.trimToNull +import pl.braintelligence.projectmanager.core.projects.domain.values.Feature +import pl.braintelligence.projectmanager.core.projects.domain.values.Status + +data class Project @JvmOverloads constructor( val id: String, - val name: String, - val status: Status = Status.TO_DO, - val teamAssigned: String = "", - val features: List = listOf() -) + var name: String, + var status: Status = Status.TO_DO, + var teamAssigned: String = "", + var features: List = listOf() +) { + init { + require(id.isNotBlank()) { throw InvalidProjectException("Project id cannot be empty.") } + validateName(name) + validateFeatures(features) + } + + fun changeProjectName(name: String) { + validateName(name) + this.name = name + } + + fun changeProjectFeatures(featuresToUpdate: List) { + validateFeatures(featuresToUpdate) + this.features = featuresToUpdate + } + + fun assignTeam(team: String) { + this.teamAssigned = trimToNull(team) + } + + fun startProject() { + require(teamAssigned.isNotBlank()) { throw InvalidProjectException("Project must have team assigned.") } + require(status.hasToDoStatus()) { throw InvalidProjectException("Project has already started.") } + status = Status.IN_PROGRESS + } + + private fun validateName(name: String) = require(name.isNotBlank()) { + throw InvalidProjectException("Project name cannot be empty.") + } + + private fun validateFeatures(features: List) { + features.forEach { + require(it.hasNoBlankName()) { throw InvalidProjectFeatureException("Project feature must have a name.") } + require(it.hasValidStatus()) { throw InvalidProjectFeatureException("Project feature must have valid status.") } + require(it.hasValidPriorityLevel()) { throw InvalidProjectFeatureException("Project feature must have valid priority level.") } + } + } +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt index e9e2c53..91235aa 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectExceptions.kt @@ -4,3 +4,7 @@ import pl.braintelligence.projectmanager.shared.DomainException internal class MissingProjectException(message: String) : DomainException(message) + +internal class InvalidProjectException(message: String) : DomainException(message) + +internal class InvalidProjectFeatureException(message: String) : DomainException(message) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt index 9d16de5..91ec84f 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectFactory.kt @@ -1,7 +1,7 @@ package pl.braintelligence.projectmanager.core.projects.domain import org.springframework.stereotype.Component -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures +import pl.braintelligence.projectmanager.core.projects.domain.values.Feature import java.util.* @Component @@ -12,14 +12,10 @@ open class ProjectFactory { return Project(id = id, name = projectName) } - fun createProjectWithFeatures(projectWithFeatures: ProjectWithFeatures): Project { + fun createProjectWithFeatures(name: String, features: List): Project { val id = generateProjectUniqueId() - val name = projectWithFeatures.projectName - val features = projectWithFeatures.features - return Project(id = id, name = name, features = features) } - private fun generateProjectUniqueId() = UUID.randomUUID().toString() } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt deleted file mode 100644 index dec795a..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/Status.kt +++ /dev/null @@ -1,7 +0,0 @@ -package pl.braintelligence.projectmanager.core.projects.domain - -enum class Status { - TO_DO, - IN_PROGRESS, - COMPLETED -} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt index a8603e0..00b3c8c 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/InMemoryProjectRepository.kt @@ -5,7 +5,9 @@ import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectCre import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectQueryRepository import pl.braintelligence.projectmanager.shared.InMemoryCrudRepository -open class InMemoryProjectRepository : InMemoryCrudRepository(), ProjectCreatorRepository, ProjectQueryRepository { +open class InMemoryProjectRepository + : InMemoryCrudRepository(), + ProjectCreatorRepository, ProjectQueryRepository { override fun save(project: Project) { super.save(entity = project, id = project.id) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt index 149a3fd..ce77f47 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/configuration/TeamConfiguration.kt @@ -2,13 +2,16 @@ package pl.braintelligence.projectmanager.core.projects.domain.configuration import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import pl.braintelligence.projectmanager.core.projects.domain.ProjectCreatorService import pl.braintelligence.projectmanager.core.projects.domain.ProjectFactory -import pl.braintelligence.projectmanager.core.projects.domain.ProjectQueryService +import pl.braintelligence.projectmanager.core.projects.domain.services.ProjectCreatorService +import pl.braintelligence.projectmanager.core.projects.domain.services.ProjectModifierService +import pl.braintelligence.projectmanager.core.projects.domain.services.ProjectQueryService import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectCreatorPort +import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectModifierPort import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectQueryPort import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectCreatorRepository import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectQueryRepository +import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager @Configuration open class ProjectConfiguration { @@ -26,8 +29,7 @@ open class ProjectConfiguration { ): ProjectCreatorPort = ProjectCreatorService(projectFactory, projectCreatorRepository) - - open fun buildProjectQuery( + fun buildProjectQuery( inMemoryProjectRepository: InMemoryProjectRepository ): ProjectQueryPort = ProjectQueryService(inMemoryProjectRepository) @@ -38,5 +40,19 @@ open class ProjectConfiguration { ): ProjectQueryPort = ProjectQueryService(projectQueryRepository) + open fun buildProjectModifier( + projectQueryService: ProjectQueryService, + inMemoryProjectRepository: InMemoryProjectRepository, + teamManager: TeamManager + ): ProjectModifierPort = + ProjectModifierService(projectQueryService, inMemoryProjectRepository, teamManager) + + @Bean + open fun buildProjectModifier( + projectQueryService: ProjectQueryService, + projectCreatorRepository: ProjectCreatorRepository, + teamManager: TeamManager + ): ProjectModifierPort = + ProjectModifierService(projectQueryService, projectCreatorRepository, teamManager) } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectCreatorService.kt similarity index 55% rename from src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectCreatorService.kt index dc4083c..cf49ab7 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectCreatorService.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectCreatorService.kt @@ -1,10 +1,13 @@ -package pl.braintelligence.projectmanager.core.projects.domain +package pl.braintelligence.projectmanager.core.projects.domain.services import org.springframework.stereotype.Service +import pl.braintelligence.projectmanager.core.projects.domain.Project +import pl.braintelligence.projectmanager.core.projects.domain.ProjectFactory +import pl.braintelligence.projectmanager.core.projects.domain.values.Feature import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectCreatorPort import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectCreatorRepository -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectDraft -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectDraft +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectWithFeatures @Service class ProjectCreatorService( @@ -16,8 +19,10 @@ class ProjectCreatorService( projectFactory.createProjectDraft(projectDraft.projectName) .also { projectCreatorRepository.save(it) } - override fun createProjectWithFeatures(projectWithFeatures: ProjectWithFeatures): Project = - projectFactory.createProjectWithFeatures(projectWithFeatures) - .also { projectCreatorRepository.save(it) } + override fun createProjectWithFeatures(projectWithFeatures: ProjectWithFeatures): Project { + val features = Feature.toFeatures(projectWithFeatures.features) + return projectFactory.createProjectWithFeatures(projectWithFeatures.projectName, features) + .also { projectCreatorRepository.save(it) } + } } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectModifierService.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectModifierService.kt new file mode 100644 index 0000000..0b05c4b --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectModifierService.kt @@ -0,0 +1,41 @@ +package pl.braintelligence.projectmanager.core.projects.domain.services + +import org.springframework.stereotype.Service +import pl.braintelligence.projectmanager.core.projects.domain.values.Feature +import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectModifierPort +import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectCreatorRepository +import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectEndCondition +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.UpdateProject + +@Service +class ProjectModifierService( + private val projectQueryService: ProjectQueryService, + private val projectCreatorRepository: ProjectCreatorRepository, + private val teamManager: TeamManager +) : ProjectModifierPort { + + override fun updateProject(projectId: String, updateProject: UpdateProject) { + val project = projectQueryService.getProject(projectId) + val featuresToUpdate = Feature.toFeatures(updateProject.features) + + project.changeProjectName(updateProject.name) + project.changeProjectFeatures(featuresToUpdate) + project.assignTeam(updateProject.teamName) + + val team = teamManager.getTeam(updateProject.teamName) + team.incrementOngoingTeamProjects() + teamManager.updateTeam(team) + + projectCreatorRepository.save(project) + } + + override fun startProject(projectId: String) { + TODO("not implemented") + } + + override fun endProject(projectId: String, projectEndCondition: ProjectEndCondition) { + TODO("not implemented") + } + +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectQueryService.kt similarity index 62% rename from src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectQueryService.kt index 79e2b52..6b2fe26 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/ProjectQueryService.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/services/ProjectQueryService.kt @@ -1,6 +1,8 @@ -package pl.braintelligence.projectmanager.core.projects.domain +package pl.braintelligence.projectmanager.core.projects.domain.services import org.springframework.stereotype.Service +import pl.braintelligence.projectmanager.core.projects.domain.MissingProjectException +import pl.braintelligence.projectmanager.core.projects.domain.Project import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectQueryPort import pl.braintelligence.projectmanager.core.projects.ports.outgoing.ProjectQueryRepository @@ -13,9 +15,8 @@ class ProjectQueryService( projectQueryRepository.findById(id) ?: throw MissingProjectException("Project does not exist.") - override fun getProjects(): List { - TODO("not implemented") - } + override fun getProjects(): List = + projectQueryRepository.findAll() } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/Feature.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/Feature.kt new file mode 100644 index 0000000..6cb9ebc --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/Feature.kt @@ -0,0 +1,35 @@ +package pl.braintelligence.projectmanager.core.projects.domain.values + +import arrow.core.Try +import arrow.core.getOrElse +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.NewFeature + +class Feature( + val name: String, + val status: Status = Status.TO_DO, + val priorityLevel: PriorityLevel = PriorityLevel.NOT_DEFINED +) { + + fun hasNoBlankName() = name.isNotBlank() + fun hasValidStatus() = status != Status.INVALID + fun hasValidPriorityLevel() = priorityLevel != PriorityLevel.INVALID + + companion object { + fun toFeatures(newFeatures: List) = + newFeatures.map { + Feature( + it.name, + validateStatus(it), + validatePriorityLevel(it) + ) + } + + private fun validatePriorityLevel(it: NewFeature) = Try { + PriorityLevel.valueOf(it.priorityLevel) + }.getOrElse { PriorityLevel.INVALID } + + private fun validateStatus(it: NewFeature) = Try { + Status.valueOf(it.status) + }.getOrElse { Status.INVALID } + } +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/PriorityLevel.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/PriorityLevel.kt new file mode 100644 index 0000000..b2a45ef --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/PriorityLevel.kt @@ -0,0 +1,11 @@ +package pl.braintelligence.projectmanager.core.projects.domain.values + +enum class PriorityLevel { + HIGHEST, + HIGH, + MEDIUM, + LOW, + LOWEST, + NOT_DEFINED, + INVALID; +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/Status.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/Status.kt new file mode 100644 index 0000000..6031d6f --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/domain/values/Status.kt @@ -0,0 +1,11 @@ +package pl.braintelligence.projectmanager.core.projects.domain.values + +enum class Status { + TO_DO, + IN_PROGRESS, + COMPLETED, + INVALID; + + fun hasToDoStatus(): Boolean = this == TO_DO + +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectCreatorPort.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectCreatorPort.kt index 50320bb..117bf96 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectCreatorPort.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectCreatorPort.kt @@ -1,8 +1,8 @@ package pl.braintelligence.projectmanager.core.projects.ports.incoming import pl.braintelligence.projectmanager.core.projects.domain.Project -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectDraft -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectDraft +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectWithFeatures interface ProjectCreatorPort { diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectModifierPort.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectModifierPort.kt new file mode 100644 index 0000000..e086e69 --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectModifierPort.kt @@ -0,0 +1,14 @@ +package pl.braintelligence.projectmanager.core.projects.ports.incoming + +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectEndCondition +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.UpdateProject + +interface ProjectModifierPort { + + fun updateProject(projectId: String, updateProject: UpdateProject) + + fun startProject(projectId: String) + + fun endProject(projectId: String, projectEndCondition: ProjectEndCondition) + +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectQueryPort.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectQueryPort.kt index 5d757f6..d348e0a 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectQueryPort.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/incoming/ProjectQueryPort.kt @@ -7,4 +7,5 @@ interface ProjectQueryPort { fun getProject(id: String): Project fun getProjects(): List + } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt index 2aea2fb..2cd7814 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/projects/ports/outgoing/ProjectQueryRepository.kt @@ -6,4 +6,6 @@ interface ProjectQueryRepository { fun findById(id: String): Project? + fun findAll(): List + } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Team.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Team.kt index 70fc6f0..c862c62 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Team.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Team.kt @@ -1,12 +1,14 @@ package pl.braintelligence.projectmanager.core.team.domain +import pl.braintelligence.projectmanager.core.team.domain.values.Employee + data class Team @JvmOverloads constructor( val name: String, - val numberOfOngoingProjects: Int = 0, + var numberOfOngoingProjects: Int = 0, var members: List = listOf() ) { init { - require(name.isNotBlank()) { throw InvalidTeamException("Empty team name.") } + require(name.isNotBlank()) { throw InvalidTeamException("Empty teamName name.") } } fun addMember(teamMember: Employee) { @@ -14,14 +16,15 @@ data class Team @JvmOverloads constructor( members = members.plus(teamMember) } - fun isTeamBusy(): Boolean = numberOfOngoingProjects > BUSY_TEAM_THRESHOLD - private fun validateMember(teamMember: Employee) { require(teamMember.hasNoFirstName()) { throw InvalidTeamMemberException("Empty member first name.") } require(teamMember.hasNoLastName()) { throw InvalidTeamMemberException("Empty member last name.") } require(teamMember.hasInvalidJobPosition()) { throw InvalidTeamMemberException("Invalid job position.") } } + fun isTeamBusy(): Boolean = numberOfOngoingProjects > BUSY_TEAM_THRESHOLD + fun incrementOngoingTeamProjects() = numberOfOngoingProjects++ + companion object { const val BUSY_TEAM_THRESHOLD = 3 } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/TeamFacade.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/TeamFacade.kt index 44a0d27..d9e4fa7 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/TeamFacade.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/TeamFacade.kt @@ -1,19 +1,31 @@ package pl.braintelligence.projectmanager.core.team.domain import org.springframework.stereotype.Service +import pl.braintelligence.projectmanager.core.team.domain.values.Employee import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager import pl.braintelligence.projectmanager.core.team.ports.outgoing.TeamRepository -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.NewTeam +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.TeamMember @Service class TeamFacade( private val teamRepository: TeamRepository ) : TeamManager { - override fun createTeam(newTeam: NewTeam) = when (teamRepository.existsByName(newTeam.name)) { - true -> throw EntityAlreadyExistsException("Team already exist.") - false -> teamRepository.save(Team(name = newTeam.name)) + override fun updateTeam(team: Team) { + teamRepository.save(team) + } + + override fun createTeam(newTeam: NewTeam): Team { + + val team = Team(name = newTeam.name) + + when (teamRepository.existsByName(newTeam.name)) { + true -> throw EntityAlreadyExistsException("Team already exist.") + false -> teamRepository.save(team) + } + + return team } override fun addMemberToTeam(teamName: String, teamMember: TeamMember) { diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/values/Employee.kt similarity index 78% rename from src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/values/Employee.kt index 698879f..6733147 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/Employee.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/values/Employee.kt @@ -1,8 +1,8 @@ -package pl.braintelligence.projectmanager.core.team.domain +package pl.braintelligence.projectmanager.core.team.domain.values import arrow.core.Try import arrow.core.getOrElse -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.TeamMember class Employee( val firstName: String, @@ -22,7 +22,6 @@ class Employee( ) private fun toJobPosition(jobPosition: String) = - Try { JobPosition.valueOf(jobPosition) } - .getOrElse { JobPosition.INVALID } + Try { JobPosition.valueOf(jobPosition) }.getOrElse { JobPosition.INVALID } } } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/JobPosition.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/values/JobPosition.kt similarity index 70% rename from src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/JobPosition.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/values/JobPosition.kt index 344c6b5..8843522 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/JobPosition.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/domain/values/JobPosition.kt @@ -1,4 +1,4 @@ -package pl.braintelligence.projectmanager.core.team.domain +package pl.braintelligence.projectmanager.core.team.domain.values enum class JobPosition { SCRUM_MASTER, diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/ports/incoming/TeamManager.kt b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/ports/incoming/TeamManager.kt index 6976efa..b446b1b 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/core/team/ports/incoming/TeamManager.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/core/team/ports/incoming/TeamManager.kt @@ -1,8 +1,8 @@ package pl.braintelligence.projectmanager.core.team.ports.incoming -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember import pl.braintelligence.projectmanager.core.team.domain.Team +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.NewTeam +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.TeamMember /** * Primary Port @@ -10,7 +10,7 @@ import pl.braintelligence.projectmanager.core.team.domain.Team interface TeamManager { - fun createTeam(newTeam: NewTeam) + fun createTeam(newTeam: NewTeam): Team fun addMemberToTeam(teamName: String, teamMember: TeamMember) @@ -18,4 +18,5 @@ interface TeamManager { fun getTeam(teamName: String): Team + fun updateTeam(team: Team) } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt deleted file mode 100644 index 1ebb278..0000000 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/ProjectDtos.kt +++ /dev/null @@ -1,7 +0,0 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto - -import pl.braintelligence.projectmanager.core.projects.domain.Feature - -data class ProjectDraft(val projectName: String) - -data class ProjectWithFeatures(val projectName: String, val features: List) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectCreatorController.kt similarity index 65% rename from src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectCreatorController.kt index 0c57306..0fa676a 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/ProjectController.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectCreatorController.kt @@ -1,13 +1,12 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest +package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project import org.springframework.beans.factory.annotation.Qualifier import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.* import pl.braintelligence.projectmanager.core.projects.domain.Project import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectCreatorPort -import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectQueryPort -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectDraft -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectDraft +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectWithFeatures /** * Primary Adapter @@ -15,9 +14,8 @@ import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dt @RestController @RequestMapping("/projects") -internal class ProjectController( - @Qualifier("projectCreatorService") private val projectCreatorPort: ProjectCreatorPort, - @Qualifier("projectQueryService") private val projectQueryPort: ProjectQueryPort +internal class ProjectCreatorController( + @Qualifier("projectCreatorService") private val projectCreatorPort: ProjectCreatorPort ) { @PostMapping("drafts") @@ -32,15 +30,4 @@ internal class ProjectController( @RequestBody projectWithFeatures: ProjectWithFeatures ): Project = projectCreatorPort.createProjectWithFeatures(projectWithFeatures) - @GetMapping("/{id}") - @ResponseStatus(HttpStatus.OK) - fun getProject( - @PathVariable id: String - ): Project = projectQueryPort.getProject(id) - - @GetMapping - @ResponseStatus(HttpStatus.OK) - fun getProjects(): List = TODO() - - } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectModifierController.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectModifierController.kt new file mode 100644 index 0000000..5407b73 --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectModifierController.kt @@ -0,0 +1,26 @@ +package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project + +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.* +import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectModifierPort +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.UpdateProject + +/** + * Primary Adapter + */ + +@RestController +@RequestMapping("/projects") +internal class ProjectModifierController( + @Qualifier("projectModifierService") private val projectModifierPort: ProjectModifierPort +) { + + @PostMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + fun updateProject( + @PathVariable id: String, + @RequestBody updateProject: UpdateProject + ) = projectModifierPort.updateProject(id, updateProject) + +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectQueryController.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectQueryController.kt new file mode 100644 index 0000000..45c72ce --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/ProjectQueryController.kt @@ -0,0 +1,29 @@ +package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project + +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.* +import pl.braintelligence.projectmanager.core.projects.domain.Project +import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectQueryPort + +/** + * Primary Adapter + */ + +@RestController +@RequestMapping("/projects") +internal class ProjectQueryController( + @Qualifier("projectQueryService") private val projectQueryPort: ProjectQueryPort +) { + + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + fun getProject( + @PathVariable id: String + ): Project = projectQueryPort.getProject(id) + + @GetMapping + @ResponseStatus(HttpStatus.OK) + fun getProjects(): List = projectQueryPort.getProjects() + +} diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/dto/ProjectDtos.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/dto/ProjectDtos.kt new file mode 100644 index 0000000..4b924e7 --- /dev/null +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/project/dto/ProjectDtos.kt @@ -0,0 +1,12 @@ +package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto + + +data class ProjectDraft(val projectName: String) + +data class ProjectWithFeatures(val projectName: String, val features: List) + +data class NewFeature(val name: String, val status: String, val priorityLevel: String) + +data class UpdateProject(val name: String, val teamName: String, val features: List) + +data class ProjectEndCondition(val requiredFeaturesDone: Boolean) diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/team/TeamController.kt similarity index 68% rename from src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/team/TeamController.kt index 80b6dd3..c5b6136 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/TeamController.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/team/TeamController.kt @@ -1,11 +1,8 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest +package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.* import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ExistingTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember /** * Primary Adapter @@ -32,9 +29,13 @@ class TeamController( @ResponseStatus(HttpStatus.OK) @GetMapping - fun getTeams(): List = - ExistingTeam.toExistingTeams(teamManager.getTeams()) + fun getTeams(): List = ExistingTeam.toExistingTeams(teamManager.getTeams()) + @ResponseStatus(HttpStatus.OK) + @GetMapping("{teamName}") + fun getTeam( + @PathVariable teamName: String + ): ExistingTeam = ExistingTeam.toExistingTeam(teamManager.getTeam(teamName)) } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/team/TeamDtos.kt similarity index 70% rename from src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt rename to src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/team/TeamDtos.kt index 6e1edae..e7aa2a6 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/dto/TeamDtos.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/incoming/rest/team/TeamDtos.kt @@ -1,7 +1,7 @@ -package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto +package pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team -import pl.braintelligence.projectmanager.core.team.domain.Employee import pl.braintelligence.projectmanager.core.team.domain.Team +import pl.braintelligence.projectmanager.core.team.domain.values.Employee data class NewTeam(val name: String) @@ -29,12 +29,12 @@ data class ExistingTeam( ) { companion object { fun toExistingTeams(teams: List): List = - teams.map { - ExistingTeam( - it.name, - it.numberOfOngoingProjects, - TeamMember.toTeamMembers(it.members), - it.isTeamBusy()) - } + teams.map { toExistingTeam(it) } + + fun toExistingTeam(team: Team) = ExistingTeam( + team.name, + team.numberOfOngoingProjects, + TeamMember.toTeamMembers(team.members), + team.isTeamBusy()) } } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt index 7947a60..9386f36 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamCreatorRepository.kt @@ -1,5 +1,6 @@ package pl.braintelligence.projectmanager.infrastructure.adapter.outgoing.mongo.project +import kotlinx.coroutines.Dispatchers.IO import org.springframework.data.repository.CrudRepository import org.springframework.stereotype.Component import org.springframework.stereotype.Repository @@ -19,5 +20,4 @@ class TeamCreatorRepository( val dbProject = DbProject.toDbProject(project) mongo.save(dbProject) } - } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt index a5c2d34..a1a3537 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/TeamQueryRepository.kt @@ -15,6 +15,8 @@ class TeamQueryRepository( private val mongo: MongoTeamCreationRepository ) : ProjectQueryRepository { + override fun findAll(): List = DbProject.toProjects(mongo.findAll()) + override fun findById(id: String): Project? = DbProject.toProject(mongo.findById(id).get()) } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt index a5dbf76..da9fc54 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/project/entities/DbProject.kt @@ -4,10 +4,10 @@ import arrow.core.Try import arrow.core.getOrElse import org.springframework.data.annotation.Id import org.springframework.data.mongodb.core.mapping.Document -import pl.braintelligence.projectmanager.core.projects.domain.Feature -import pl.braintelligence.projectmanager.core.projects.domain.PriorityLevel import pl.braintelligence.projectmanager.core.projects.domain.Project -import pl.braintelligence.projectmanager.core.projects.domain.Status +import pl.braintelligence.projectmanager.core.projects.domain.values.Feature +import pl.braintelligence.projectmanager.core.projects.domain.values.PriorityLevel +import pl.braintelligence.projectmanager.core.projects.domain.values.Status @Document(collection = "projects") class DbProject( @@ -25,9 +25,9 @@ class DbProject( project.teamAssigned, project.features.map { DbFeature( - name = it.name, - status = it.status.toString(), - priorityLevel = it.priorityLevel.toString() + it.name, + it.status.toString(), + it.priorityLevel.toString() ) } ) @@ -49,5 +49,9 @@ class DbProject( ) + fun toProjects(dbProjects: MutableIterable): List = + dbProjects.map { toProject(it) } + + } } diff --git a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt index 5bdf965..89d44ba 100644 --- a/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt +++ b/src/main/kotlin/pl/braintelligence/projectmanager/infrastructure/adapter/outgoing/mongo/team/entities/DbEmployee.kt @@ -1,5 +1,5 @@ -import pl.braintelligence.projectmanager.core.team.domain.Employee -import pl.braintelligence.projectmanager.core.team.domain.JobPosition +import pl.braintelligence.projectmanager.core.team.domain.values.Employee +import pl.braintelligence.projectmanager.core.team.domain.values.JobPosition data class DbEmployee( private val firstName: String, diff --git a/src/test/groovy/pl/braintelligence/projectmanager/base/BaseDtoObjects.groovy b/src/test/groovy/pl/braintelligence/projectmanager/base/BaseDtoObjects.groovy index 1410dce..3334357 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/base/BaseDtoObjects.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/base/BaseDtoObjects.groovy @@ -1,21 +1,21 @@ package pl.braintelligence.projectmanager.base -import pl.braintelligence.projectmanager.core.projects.domain.Feature -import pl.braintelligence.projectmanager.core.projects.domain.PriorityLevel -import pl.braintelligence.projectmanager.core.projects.domain.Status -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewTeam -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectDraft -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.ProjectWithFeatures -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember + +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.NewFeature +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectDraft +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectWithFeatures +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.NewTeam +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.TeamMember trait BaseDtoObjects { // projects ProjectDraft newProjectDraftDto = new ProjectDraft("qwerty") - Feature feature = new Feature("feature name 1", Status.TO_DO, PriorityLevel.NOT_DEFINED) + NewFeature newFeature = new NewFeature("feature name 1", "TO_DO", "NOT_DEFINED") + NewFeature updatedFeature = new NewFeature("feature name 2", "IN_PROGRESS", "HIGH") - ProjectWithFeatures newProjectWithFeaturesDto = new ProjectWithFeatures("feature 1", List.of(feature)) + ProjectWithFeatures newProjectWithFeaturesDto = new ProjectWithFeatures("feature 1", List.of(newFeature)) ProjectDraft newProjectDraft = new ProjectDraft("project name") diff --git a/src/test/groovy/pl/braintelligence/projectmanager/base/BaseIntegrationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/base/BaseIntegrationTest.groovy index 560e74b..327eaa9 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/base/BaseIntegrationTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/base/BaseIntegrationTest.groovy @@ -8,7 +8,7 @@ import org.springframework.boot.test.web.client.TestRestTemplate import org.springframework.data.mongodb.core.MongoTemplate import org.springframework.http.ResponseEntity import pl.braintelligence.projectmanager.base.http.BaseHttpMethods -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.NewTeam +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.NewTeam import spock.lang.Specification import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT @@ -39,4 +39,8 @@ class BaseIntegrationTest extends Specification implements BaseHttpMethods, Base def newTeam = new NewTeam(teamName) post("/teams", newTeam) } + + protected ResponseEntity prepareNewProject() { + post("/projects", newProjectWithFeaturesDto) + } } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy index 9e02e12..64365f3 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectAcceptanceTest.groovy @@ -1,6 +1,6 @@ package pl.braintelligence.projectmanager.project - +import org.springframework.core.ParameterizedTypeReference import org.springframework.http.HttpStatus import pl.braintelligence.projectmanager.base.BaseIntegrationTest import pl.braintelligence.projectmanager.core.projects.domain.Project @@ -13,7 +13,7 @@ class ProjectAcceptanceTest extends BaseIntegrationTest { response.statusCode == HttpStatus.CREATED when: "browse for this project draft" - response = get("/projects/${response.body.id}", Project.class) + response = get("/projects/$response.body.id", Project.class) then: response.statusCode == HttpStatus.OK @@ -24,11 +24,11 @@ class ProjectAcceptanceTest extends BaseIntegrationTest { then: response.statusCode == HttpStatus.CREATED -// when: "browse for all projects" -// response = get("/projects", new ParameterizedTypeReference>() {}) + when: "browse for all projects" + response = get("/projects", new ParameterizedTypeReference>() {}) -// then: -// response.statusCode == HttpStatus.OK + then: + response.statusCode == HttpStatus.OK } } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectModifierControllerTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectModifierControllerTest.groovy new file mode 100644 index 0000000..4f34755 --- /dev/null +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/ProjectModifierControllerTest.groovy @@ -0,0 +1,34 @@ +package pl.braintelligence.projectmanager.project + +import pl.braintelligence.projectmanager.base.BaseIntegrationTest +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.UpdateProject +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.ExistingTeam + +class ProjectModifierControllerTest extends BaseIntegrationTest { + + def "Should increment team numberOfOngoingProjects when team is assigned to project"() { + given: "new team is created" + def teamName = "123" + prepareNewTeam(teamName) + + and: "new project is created" + def project = prepareNewProject() + + and: "payload for updating project is prepared" + def updateProject = new UpdateProject(project.body.name, teamName, List.of(newFeature)) + + and: + def projectId = project.body.id + + when: "team is assigned to project" + post("/projects/$projectId", updateProject) + + and: "team is retrived" + def team = get("/teams/$teamName", ExistingTeam.class) + + then: + with(team.body) { + currentlyImplementedProjects == 1 + } + } +} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy index 39a7363..504b0a8 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/base/BaseProjectUnitTest.groovy @@ -3,11 +3,15 @@ package pl.braintelligence.projectmanager.project.base import pl.braintelligence.projectmanager.base.BaseUnitTest import pl.braintelligence.projectmanager.core.projects.domain.Project import pl.braintelligence.projectmanager.core.projects.domain.ProjectFactory -import pl.braintelligence.projectmanager.core.projects.domain.Status import pl.braintelligence.projectmanager.core.projects.domain.configuration.InMemoryProjectRepository import pl.braintelligence.projectmanager.core.projects.domain.configuration.ProjectConfiguration +import pl.braintelligence.projectmanager.core.projects.domain.services.ProjectQueryService +import pl.braintelligence.projectmanager.core.projects.domain.values.Status import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectCreatorPort +import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectModifierPort import pl.braintelligence.projectmanager.core.projects.ports.incoming.ProjectQueryPort +import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectWithFeatures class BaseProjectUnitTest extends BaseUnitTest { @@ -21,27 +25,37 @@ class BaseProjectUnitTest extends BaseUnitTest { new ProjectConfiguration() .buildProjectQuery(inMemoryProjectRepository) + protected ProjectModifierPort projectModifier = + new ProjectConfiguration() + .buildProjectModifier( + new ProjectQueryService(inMemoryProjectRepository), + inMemoryProjectRepository, + Mock(TeamManager)) + protected void verifyProjectDraft(Project project) { assert with(project) { id != null name == newProjectDraftDto.projectName status == Status.TO_DO - teamAssigned == "" + teamAssigned.isBlank() features == [] } } - protected void verifyProjectWithFeatures(Project project) { + protected void verifyProjectWithFeatures( + Project project, + ProjectWithFeatures projectWithFeatures = newProjectWithFeaturesDto) { assert with(project) { id != null - name == newProjectWithFeaturesDto.projectName + name == projectWithFeatures.projectName status == Status.TO_DO teamAssigned.isBlank() with(features[0]) { - name == newProjectWithFeaturesDto.features[0].name - status == newProjectWithFeaturesDto.features[0].status - priorityLevel == newProjectWithFeaturesDto.features[0].priorityLevel + name == projectWithFeatures.features[0].name + status == projectWithFeatures.features[0].status + priorityLevel == projectWithFeatures.features[0].priorityLevel } } } } + diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy deleted file mode 100644 index 7ae60fd..0000000 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationTest.groovy +++ /dev/null @@ -1,23 +0,0 @@ -package pl.braintelligence.projectmanager.project.domain - - -import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest - -class ProjectCreationTest extends BaseProjectUnitTest { - - def "Should create a project draft and browse for it"() { - when: - def project = projectCreator.createProjectDraft(newProjectDraftDto) - - then: - verifyProjectDraft(project) - } - - def "Should create project with features and browse it"() { - when: - def project = projectCreator.createProjectWithFeatures(newProjectWithFeaturesDto) - - then: - verifyProjectWithFeatures(project) - } -} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationValidationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationValidationTest.groovy new file mode 100644 index 0000000..43fed2c --- /dev/null +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectCreationValidationTest.groovy @@ -0,0 +1,41 @@ +package pl.braintelligence.projectmanager.project.domain + +import pl.braintelligence.projectmanager.core.projects.domain.InvalidProjectException +import pl.braintelligence.projectmanager.core.projects.domain.Project +import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest + +class ProjectCreationValidationTest extends BaseProjectUnitTest { + + def "Should create a project draft"() { + when: + def project = projectCreator.createProjectDraft(newProjectDraftDto) + + then: + verifyProjectDraft(project) + } + + def "Should create project with features"() { + when: + def project = projectCreator.createProjectWithFeatures(newProjectWithFeaturesDto) + + then: + verifyProjectWithFeatures(project) + } + + def "Should not allow to create project with empty id, name"() { + when: + new Project(id, name) + + then: + def thrown = thrown(InvalidProjectException) + thrown.message == errorMessage + + where: + id | name | errorMessage + "" | "name" | "Project id cannot be empty." + " " | "name" | "Project id cannot be empty." + "123" | "" | "Project name cannot be empty." + "123" | " " | "Project name cannot be empty." + } + +} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectFeaturesValidationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectFeaturesValidationTest.groovy new file mode 100644 index 0000000..5d9c374 --- /dev/null +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectFeaturesValidationTest.groovy @@ -0,0 +1,29 @@ +package pl.braintelligence.projectmanager.project.domain + +import pl.braintelligence.projectmanager.core.projects.domain.InvalidProjectFeatureException +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.NewFeature +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.ProjectWithFeatures +import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest + +class ProjectFeaturesValidationTest extends BaseProjectUnitTest { + + def "Should not allow to create project feature"() { + given: + def features = new ProjectWithFeatures("123", [new NewFeature(featureName, status, priorityLevel)]) + + when: + projectCreator.createProjectWithFeatures(features) + + then: + def thrown = thrown(InvalidProjectFeatureException) + thrown.message == errorMessage + + where: + featureName | status | priorityLevel | errorMessage + "" | "TO_DO" | "NOT_DEFINED" | "Project feature must have a name." + " " | "TO_DO" | "NOT_DEFINED" | "Project feature must have a name." + "123" | "invalid status" | "NOT_DEFINED" | "Project feature must have valid status." + "123" | "TO_DO" | "invalid priority level" | "Project feature must have valid priority level." + } + +} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectModifierTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectModifierTest.groovy new file mode 100644 index 0000000..a7db13b --- /dev/null +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectModifierTest.groovy @@ -0,0 +1,77 @@ +package pl.braintelligence.projectmanager.project.domain + +import pl.braintelligence.projectmanager.core.projects.domain.InvalidProjectException +import pl.braintelligence.projectmanager.core.projects.domain.Project +import pl.braintelligence.projectmanager.core.projects.domain.values.Status +import pl.braintelligence.projectmanager.core.team.domain.configuration.TeamConfiguration +import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.NewFeature +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.project.dto.UpdateProject +import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest +import spock.lang.Unroll + +class ProjectModifierTest extends BaseProjectUnitTest { + + protected TeamManager teamService = new TeamConfiguration().teamManager() + + def "Should update project"() { + given: "Team and project is created (project has no team assign as default)" + def project = projectCreator.createProjectWithFeatures(newProjectWithFeaturesDto) + def team = teamService.createTeam(newTeamDto) + + and: "extracted project id" + def projectId = project.id + + and: "update project with..." + def updatedProjectName = "new project name" + def assignTeam = team.name + def updatedProjectFeatures = List.of(new NewFeature("new feature name", "IN_PROGRESS", "MEDIUM")) + + def updateProject = new UpdateProject(updatedProjectName, assignTeam, updatedProjectFeatures) + + when: "project is updated" + projectModifier.updateProject(projectId, updateProject) + + and: "retrieve updated project" + def updatedProject = projectQuery.getProject(projectId) + + then: "verify that updates for project were applied" + with(updatedProject) { + name == updatedProjectName + teamAssigned == assignTeam + with(features[0]) { + name == updatedProjectFeatures.first().name + status.toString() == updatedProjectFeatures.first().status + priorityLevel.toString() == updatedProjectFeatures.first().priorityLevel + } + } + } + + def "Should not start project when no team assigned"() { + given: + Project project = new Project("id", "name") + + when: + project.startProject() + + then: + def thrown = thrown(InvalidProjectException) + thrown.message == "Project must have team assigned." + } + + @Unroll + def "Should not start project with status #status"() { + given: + Project project = new Project("id", "name", status, "team") + + when: + project.startProject() + + then: + def thrown = thrown(InvalidProjectException) + thrown.message == "Project has already started." + + where: + status << [Status.IN_PROGRESS, Status.INVALID, Status.COMPLETED] + } +} diff --git a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy index 845092d..579033f 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/project/domain/ProjectQueryTest.groovy @@ -1,5 +1,6 @@ package pl.braintelligence.projectmanager.project.domain +import pl.braintelligence.projectmanager.core.projects.domain.MissingProjectException import pl.braintelligence.projectmanager.project.base.BaseProjectUnitTest class ProjectQueryTest extends BaseProjectUnitTest { @@ -15,4 +16,33 @@ class ProjectQueryTest extends BaseProjectUnitTest { verifyProjectWithFeatures(response) } + def "Should browse for projects"() { + given: + projectCreator.createProjectWithFeatures(newProjectWithFeaturesDto) + projectCreator.createProjectDraft(newProjectDraftDto) + + when: + def response = projectQuery.getProjects() + + then: + response.size() == 2 + } + + def "Should throw MissingProjectException when project does not exist"() { + when: + projectQuery.getProject("projectId") + + then: + def thrown = thrown(MissingProjectException) + thrown.message == "Project does not exist." + } + + + def "Should return empty list when there no projects available"() { + when: + def response = projectQuery.getProjects() + + then: + response.empty + } } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/TeamAcceptanceTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/TeamAcceptanceTest.groovy index 6939f03..9c433f1 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/TeamAcceptanceTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/team/TeamAcceptanceTest.groovy @@ -8,14 +8,14 @@ import pl.braintelligence.projectmanager.core.team.domain.Team class TeamAcceptanceTest extends BaseIntegrationTest { def "User flow while using project manager"() { - when: "new team is created" + when: "new teamName is created" prepareNewTeam(newTeamDto.name) then: "user gets all teams created" get('/teams', new ParameterizedTypeReference>() {}) .statusCode == HttpStatus.OK - when: "new member is added to a team" + when: "new member is added to a teamName" post('/teams/teamName/members', teamMemberDto) .statusCode == HttpStatus.CREATED diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/base/BaseTeamUnitTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/base/BaseTeamSetupUnitTest.groovy similarity index 87% rename from src/test/groovy/pl/braintelligence/projectmanager/team/base/BaseTeamUnitTest.groovy rename to src/test/groovy/pl/braintelligence/projectmanager/team/base/BaseTeamSetupUnitTest.groovy index f9fe0b9..807d636 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/base/BaseTeamUnitTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/team/base/BaseTeamSetupUnitTest.groovy @@ -4,7 +4,7 @@ import pl.braintelligence.projectmanager.base.BaseUnitTest import pl.braintelligence.projectmanager.core.team.domain.configuration.TeamConfiguration import pl.braintelligence.projectmanager.core.team.ports.incoming.TeamManager -class BaseTeamUnitTest extends BaseUnitTest { +class BaseTeamSetupUnitTest extends BaseUnitTest { protected TeamManager teamService = new TeamConfiguration().teamManager() diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationValidationTest.groovy similarity index 74% rename from src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy rename to src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationValidationTest.groovy index 6b2f09c..e46960e 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamValidationTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationValidationTest.groovy @@ -5,13 +5,13 @@ import pl.braintelligence.projectmanager.core.team.domain.EntityAlreadyExistsExc import pl.braintelligence.projectmanager.core.team.domain.InvalidTeamException import pl.braintelligence.projectmanager.core.team.domain.MissingTeamException import pl.braintelligence.projectmanager.core.team.domain.Team -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest +import pl.braintelligence.projectmanager.team.base.BaseTeamSetupUnitTest -class TeamValidationTest extends BaseTeamUnitTest { +class TeamCreationValidationTest extends BaseTeamSetupUnitTest { def "Should throw exception when team does not exist"() { when: - teamService.addMemberToTeam("non-existent team name", teamMemberDto) + teamService.addMemberToTeam("non-existent teamName name", teamMemberDto) then: def thrown = thrown(MissingTeamException.class) @@ -24,17 +24,17 @@ class TeamValidationTest extends BaseTeamUnitTest { then: def ex = thrown(InvalidTeamException.class) - ex.message == "Empty team name." + ex.message == "Empty teamName name." where: teamName << ['', ' '] } def "Should not create team that already exists"() { - given: "create a team" + given: "create a teamName" teamService.createTeam(newTeamDto) - when: "create another team with the same name" + when: "create another teamName with the same name" teamService.createTeam(newTeamDto) then: diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersAddedToTeamUnitTestTest.groovy similarity index 65% rename from src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy rename to src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersAddedToTeamUnitTestTest.groovy index 6c0a1fd..444b8d7 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/AddingTeamMembersToTeamTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersAddedToTeamUnitTestTest.groovy @@ -1,21 +1,21 @@ package pl.braintelligence.projectmanager.team.domain -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest +import pl.braintelligence.projectmanager.team.base.BaseTeamSetupUnitTest -class AddingTeamMembersToTeamTest extends BaseTeamUnitTest { +class TeamMembersAddedToTeamUnitTestTest extends BaseTeamSetupUnitTest { def "Should add member to a team"() { - given: "new team is created" + given: "new teamName is created" teamService.createTeam(newTeamDto) - and: "member is added to a team" + and: "member is added to a teamName" teamService.addMemberToTeam(newTeamDto.name, teamMemberDto) when: "teams are retrieved" def response = teamService.getTeam(newTeamDto.name) - then: "new member is in a team" + then: "new member is in a teamName" with(response.members[0]) { firstName == teamMemberDto.firstName lastName == teamMemberDto.lastName diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersValidationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersValidationTest.groovy index f872ef1..eaef198 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersValidationTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamMembersValidationTest.groovy @@ -2,22 +2,22 @@ package pl.braintelligence.projectmanager.team.domain import pl.braintelligence.projectmanager.core.team.domain.InvalidTeamMemberException -import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.dto.TeamMember -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest +import pl.braintelligence.projectmanager.infrastructure.adapter.incoming.rest.team.TeamMember +import pl.braintelligence.projectmanager.team.base.BaseTeamSetupUnitTest import spock.lang.Unroll -class TeamMembersValidationTest extends BaseTeamUnitTest { +class TeamMembersValidationTest extends BaseTeamSetupUnitTest { def "Should add member to a team"() { - given: "team is created" + given: "teamName is created" def teamName = newTeamDto.name teamService.createTeam(newTeamDto) - when: "two members are added to a team" + when: "two members are added to a teamName" teamService.addMemberToTeam(teamName, teamMemberDto) teamService.addMemberToTeam(teamName, teamMemberDto) - then: "two members are in a team" + then: "two members are in a teamName" teamService.getTeam(teamName).members.size() == 2 } diff --git a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamUnitTestCreationTest.groovy similarity index 55% rename from src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy rename to src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamUnitTestCreationTest.groovy index 175c1d2..23d1c68 100644 --- a/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamCreationTest.groovy +++ b/src/test/groovy/pl/braintelligence/projectmanager/team/domain/TeamUnitTestCreationTest.groovy @@ -1,37 +1,34 @@ package pl.braintelligence.projectmanager.team.domain -import pl.braintelligence.projectmanager.team.base.BaseTeamUnitTest +import pl.braintelligence.projectmanager.team.base.BaseTeamSetupUnitTest -class TeamCreationTest extends BaseTeamUnitTest { +class TeamUnitTestCreationTest extends BaseTeamSetupUnitTest { - def "Should create a team (with default values)"() { + def "Should create multiple teams (with default values)"() { given: teamService.createTeam(newTeamDto) when: def response = teamService.getTeam(newTeamDto.name) - then: + then: "teamName has default settings" with(response) { name == newTeamDto.name numberOfOngoingProjects == 0 members == [] } - } - def "Should create a teams (with default values)"() { - given: - teamService.createTeam(newTeamDto) + when: "another teamName is created" teamService.createTeam(newTeamDto1) - when: - def response = teamService.getTeams() + and: "getting all teams" + response = teamService.getTeams() - then: + then: "two teams are created" with(response) { name[0] == newTeamDto.name name[1] == newTeamDto1.name } - } + } } diff --git a/src/test/kotlin/pl/braintelligence/projectmanager/core/team/NoSpringInDomainTest.kt b/src/test/kotlin/pl/braintelligence/projectmanager/core/team/NoSpringInDomainTest.kt index 53f779f..950dc37 100644 --- a/src/test/kotlin/pl/braintelligence/projectmanager/core/team/NoSpringInDomainTest.kt +++ b/src/test/kotlin/pl/braintelligence/projectmanager/core/team/NoSpringInDomainTest.kt @@ -21,4 +21,5 @@ internal class NoSpringInDomainTest { .should() .dependOnClassesThat() .resideInAPackage("org.springframework..") + }