Skip to content

Commit

Permalink
Fix competitor result relation
Browse files Browse the repository at this point in the history
  • Loading branch information
BilledTrain380 committed Sep 21, 2018
1 parent 0cc7caf commit c7394f3
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,7 @@ class ParticipationManagerImpl(
participantRepository.save(participantEntity)

if (sport.name == LockedSport.ATHLETICS) {

competitorRepository.save(competitorOf(participantEntity))

participantEntity.saveAsCompetitor()
} else {

val competitor = competitorRepository.findByParticipantId(participant.id)
Expand Down Expand Up @@ -203,9 +201,7 @@ class ParticipationManagerImpl(

val participants = participantRepository.findBySportName(LockedSport.ATHLETICS)

participants.forEach {
competitorRepository.save(competitorOf(it))
}
participants.forEach { it.saveAsCompetitor() }

val participation = ParticipationEntity(MAIN_PARTICIPATION, ParticipationStatus.CLOSE.name)
participationRepository.save(participation)
Expand Down Expand Up @@ -236,24 +232,27 @@ class ParticipationManagerImpl(
return ParticipationStatus.valueOf(participation.status)
}

private fun competitorOf(participant: ParticipantEntity): CompetitorEntity {
private fun ParticipantEntity.saveAsCompetitor() {
val competitor = competitorRepository.save(CompetitorEntity(participant = this))
competitor.createDefaultResults()
competitorRepository.save(competitor)
}

private fun CompetitorEntity.createDefaultResults() {

val disciplines = disciplineRepository.findAll()

val defaultResults = disciplines.map {
this.results = disciplines.map {
ResultEntity(
distance = categoryRuleBook.getDistance(CategoryModel(participant.age(), it.name)),
distance = categoryRuleBook.getDistance(CategoryModel(this.age(), it.name)),
discipline = it
)
).also {
it.competitor = this
}
}.toSet()

return CompetitorEntity(
participant = participant,
results = defaultResults
)
}

private fun ParticipantEntity.age(): Int {
return DateTime.now().year - DateTime(birthday).year
private fun CompetitorEntity.age(): Int {
return DateTime.now().year - DateTime(participant.birthday).year
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ data class CompetitorEntity(
@JoinColumn(name = "fk_PARTICIPANT_id", referencedColumnName = "id")
var participant: ParticipantEntity = ParticipantEntity(),

@OneToMany(cascade = [CascadeType.REMOVE, CascadeType.PERSIST])
@JoinColumn(name = "FK_PARTICIPANT_id")
@OneToMany(cascade = [CascadeType.ALL], mappedBy = "competitor")
var results: Set<ResultEntity> = setOf()
)
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ import javax.persistence.*
import javax.validation.constraints.NotNull
import javax.validation.constraints.Size

/**
* @author nmaerchy
* @version 0.0.1
*/
@Entity
@Table(name = "RESULT")
data class ResultEntity(
Expand All @@ -67,4 +63,11 @@ data class ResultEntity(
@ManyToOne
@JoinColumn(name = "fk_DISCIPLINE", referencedColumnName = "name")
var discipline: DisciplineEntity = DisciplineEntity()
)
) {

// We have to exclude this property from the toString, hashcode and equals methods, because circular mapping
@NotNull
@ManyToOne
@JoinColumn(name = "fk_COMPETITOR_startnumber", referencedColumnName = "startnumber")
var competitor: CompetitorEntity = CompetitorEntity()
}
Original file line number Diff line number Diff line change
Expand Up @@ -291,18 +291,20 @@ object ParticipationManagerImplSpec: Spek({
whenever(mockDisciplineRepository.findAll()).thenReturn(disciplines)

whenever(mockCategoryBook.getDistance(any())).thenReturn(null)
whenever(mockCompetitorRepository.save(any<CompetitorEntity>())).thenReturn(CompetitorEntity()) // empty entity is enough, value will be ignored anyway
val competitor = CompetitorEntity(
participant = participantEntity.copy()
)
whenever(mockCompetitorRepository.save(any<CompetitorEntity>())).thenReturn(competitor)


manager.reParticipate(participantModel, Sport(LockedSport.ATHLETICS))


it("should save the participant as competitor with default results") {
val expected = CompetitorEntity(
participant = participantEntity.copy(sport = SportEntity(LockedSport.ATHLETICS)),
results = disciplines.map { ResultEntity(discipline = it) }.toSet()
)
verify(mockCompetitorRepository, times(1)).save(expected)
verify(mockCompetitorRepository, times(1)).save(competitor)
verify(mockCompetitorRepository, times(1)).save(competitor.apply {
results = disciplines.map { ResultEntity(discipline = it).also { it.competitor = competitor } }.toSet()
})
}

it("should consider the category") {
Expand Down Expand Up @@ -406,21 +408,35 @@ object ParticipationManagerImplSpec: Spek({
)
whenever(mockDisciplineRepository.findAll()).thenReturn(disciplines)

val competitor1 = CompetitorEntity(
participant = participant1.copy()
)
val competitor2 = CompetitorEntity(
participant = participant2.copy()
)
whenever(mockCompetitorRepository.save(competitor1)).thenReturn(competitor1.copy())
whenever(mockCompetitorRepository.save(competitor2)).thenReturn(competitor2.copy())


manager.closeParticipation()


it("should create competitors with default results for each participant with sport athletics") {
val competitor1 = CompetitorEntity(
participant = participant1.copy(),
results = disciplines.map { ResultEntity(discipline = it) }.toSet()
)
val competitor2 = CompetitorEntity(
participant = participant2.copy(),
results = disciplines.map { ResultEntity(discipline = it) }.toSet()
)
/*
* 1. the competitor without results needs to be saved
* 2. the results with the competitor reference can be se
* 3. the competitor including the results must be saved
*/

verify(mockCompetitorRepository, times(1)).save(competitor1)
verify(mockCompetitorRepository, times(1)).save(competitor1.apply {
results = disciplines.map { ResultEntity(discipline = it).also { it.competitor = competitor1 } }.toSet()
})

verify(mockCompetitorRepository, times(1)).save(competitor2)
verify(mockCompetitorRepository, times(1)).save(competitor2.apply {
results = disciplines.map { ResultEntity(discipline = it).also { it.competitor = competitor2 } }.toSet()
})
}

it("should close the participation") {
Expand Down

0 comments on commit c7394f3

Please sign in to comment.