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..")
+
}