Skip to content

Commit e1999de

Browse files
authored
Merge pull request #13 from BSStudio/feature/update_all_team_info_as_admin
Feature: Update team as admin
2 parents 92d6e87 + a9bc3be commit e1999de

13 files changed

Lines changed: 251 additions & 47 deletions

File tree

integration/test/race.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,25 @@ const updatedTeamAfterEndResults = {
281281
votes: 456,
282282
year: 2022
283283
};
284+
const adminUpdatedTeam = {
285+
audienceScore: 9871,
286+
juniorRank: -11,
287+
numberOfOvertakes: 21,
288+
qualificationScore: 9991,
289+
rank: 11,
290+
safetyCarWasFollowed: false,
291+
skillScore: 501,
292+
speedBonusScore: 151,
293+
speedScore: 251,
294+
speedTimes: [20, 30, 50, 1],
295+
teamId: 0,
296+
teamMembers: ["Boldizsár Márta", "Bence Csik", "Csili"],
297+
teamName: "BSS",
298+
teamType: "JUNIOR",
299+
totalScore: 9876541,
300+
votes: 4561,
301+
year: 2023
302+
};
284303

285304
function assertQueue(queueName, expected) {
286305
let _connection;
@@ -506,6 +525,17 @@ describe('Test a happy path of events', () => {
506525
})
507526
.then(_ => assertQueue('team.teamData', updatedTeamAfterEndResults));
508527
});
528+
it('should update all field for the team', () => {
529+
return request(HOST)
530+
.put('/api/admin/team')
531+
.set('RobonAuth-Api-Key', 'BSS')
532+
.send(adminUpdatedTeam)
533+
.then(response => {
534+
expect(response.status).toBe(200)
535+
expect(response.body).toStrictEqual([adminUpdatedTeam])
536+
})
537+
.then(_ => assertQueue('team.teamData', adminUpdatedTeam));
538+
})
509539
afterAll(() => {
510540
return cleanDB();
511541
});

service/src/main/java/hu/bsstudio/robonaut/team/BroadcastingTeamService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public Mono<DetailedTeam> updateTeam(final Team team) {
3131
.doOnNext(this::sendTeamInfo);
3232
}
3333

34+
@Override
35+
public Mono<DetailedTeam> updateTeam(final DetailedTeam detailedTeam) {
36+
return service.updateTeam(detailedTeam)
37+
.doOnNext(this::sendTeamInfo);
38+
}
39+
3440
@Override
3541
public Flux<DetailedTeam> findAllTeam() {
3642
return service.findAllTeam()

service/src/main/java/hu/bsstudio/robonaut/team/DefaultTeamService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ public Mono<DetailedTeam> updateTeam(final Team team) {
4040
.map(teamMapper::toModel);
4141
}
4242

43+
@Override
44+
public Mono<DetailedTeam> updateTeam(final DetailedTeam detailedTeam) {
45+
return Mono.just(detailedTeam)
46+
.map(teamMapper::toEntity)
47+
.flatMap(teamRepository::save)
48+
.map(teamMapper::toModel);
49+
}
50+
4351
@Override
4452
public Flux<DetailedTeam> findAllTeam() {
4553
return teamRepository.findAll()

service/src/main/java/hu/bsstudio/robonaut/team/TeamService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@ public interface TeamService {
1010

1111
Mono<DetailedTeam> updateTeam(final Team team);
1212

13+
Mono<DetailedTeam> updateTeam(final DetailedTeam team);
14+
1315
Flux<DetailedTeam> findAllTeam();
1416
}

service/src/main/java/hu/bsstudio/robonaut/team/mapper/TeamModelEntityMapper.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,26 @@ public DetailedTeam toModel(final TeamEntity teamEntity) {
2626
.juniorRank(teamEntity.getJuniorRank())
2727
.build();
2828
}
29+
30+
public TeamEntity toEntity(final DetailedTeam detailedTeam) {
31+
final var entity = new TeamEntity();
32+
entity.setTeamId(detailedTeam.getTeamId());
33+
entity.setYear(detailedTeam.getYear());
34+
entity.setTeamName(detailedTeam.getTeamName());
35+
entity.setTeamMembers(detailedTeam.getTeamMembers());
36+
entity.setTeamType(detailedTeam.getTeamType());
37+
entity.setSkillScore(detailedTeam.getSkillScore());
38+
entity.setSpeedScore(detailedTeam.getSpeedScore());
39+
entity.setSpeedBonusScore(detailedTeam.getSpeedBonusScore());
40+
entity.setNumberOfOvertakes(detailedTeam.getNumberOfOvertakes());
41+
entity.setSafetyCarWasFollowed(detailedTeam.isSafetyCarWasFollowed());
42+
entity.setSpeedTimes(detailedTeam.getSpeedTimes());
43+
entity.setVotes(detailedTeam.getVotes());
44+
entity.setAudienceScore(detailedTeam.getAudienceScore());
45+
entity.setQualificationScore(detailedTeam.getQualificationScore());
46+
entity.setTotalScore(detailedTeam.getTotalScore());
47+
entity.setRank(detailedTeam.getRank());
48+
entity.setJuniorRank(detailedTeam.getJuniorRank());
49+
return entity;
50+
}
2951
}

service/src/test/java/hu/bsstudio/robonaut/team/BroadcastingTeamServiceTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ void shouldReturnDetailedTeamFromUnderLyingServiceAndSendItWhenTeamIsUpdated() {
6060
verify(mockTemplate).convertAndSend(TEAM_DATA_ROUTING_KEY, DETAILED_TEAM_1);
6161
}
6262

63+
@Test
64+
void shouldReturnDetailedTeamFromUnderLyingServiceAndSendItWhenTeamIsUpdatedByAdmin() {
65+
when(mockService.updateTeam(DETAILED_TEAM_1))
66+
.thenReturn(Mono.just(DETAILED_TEAM_1));
67+
68+
final var result = underTest.updateTeam(DETAILED_TEAM_1);
69+
70+
StepVerifier.create(result)
71+
.expectNext(DETAILED_TEAM_1)
72+
.verifyComplete();
73+
verify(mockTemplate).convertAndSend(TEAM_DATA_ROUTING_KEY, DETAILED_TEAM_1);
74+
}
75+
6376
@Test
6477
void shouldReturnDetailedTeamFromUnderLyingServiceAndSendItWhenFindingAllTeam() {
6578
when(mockService.findAllTeam())

service/src/test/java/hu/bsstudio/robonaut/team/DefaultTeamServiceTest.java

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,18 @@ final class DefaultTeamServiceTest {
3030
private static final TeamType TEAM_TYPE_2 = TeamType.JUNIOR;
3131
private static final int YEAR_1 = 2020;
3232
private static final int YEAR_2 = 2021;
33-
public static final TeamEntity TEAM_ENTITY_1 = createTeamEntity(TEAM_ID_1, YEAR_1, TEAM_NAME_1, TEAM_MEMBERS_1, TEAM_TYPE_1);
34-
public static final TeamEntity OLD_TEAM_ENTITY = createTeamEntity(TEAM_ID_1, YEAR_2, TEAM_NAME_2, TEAM_MEMBERS_2, TEAM_TYPE_2);
33+
private static final TeamEntity OLD_TEAM_ENTITY = createTeamEntity(TEAM_ID_1, YEAR_2, TEAM_NAME_2, TEAM_MEMBERS_2, TEAM_TYPE_2);
34+
private static final TeamEntity TEAM_ENTITY_1 = createTeamEntity(TEAM_ID_1, YEAR_1, TEAM_NAME_1, TEAM_MEMBERS_1, TEAM_TYPE_1);
35+
private static final TeamEntity TEAM_ENTITY_2 = createTeamEntity(TEAM_ID_2, YEAR_2, TEAM_NAME_2, TEAM_MEMBERS_2, TEAM_TYPE_2);
3536
private static final Team TEAM_1 = Team.builder()
3637
.teamId(TEAM_ID_1)
3738
.teamMembers(TEAM_MEMBERS_1)
3839
.teamName(TEAM_NAME_1)
3940
.teamType(TEAM_TYPE_1)
4041
.year(YEAR_1)
4142
.build();
43+
private static final DetailedTeam DETAILED_TEAM_1 = DetailedTeam.builder().teamId(TEAM_ID_1).build();
44+
private static final DetailedTeam DETAILED_TEAM_2 = DetailedTeam.builder().teamId(TEAM_ID_2).build();
4245

4346
private DefaultTeamService underTest;
4447

@@ -57,48 +60,52 @@ void setUp() {
5760
@Test
5861
void shouldReturnCreatedTeam() {
5962
when(mockRepository.insert(TEAM_ENTITY_1)).thenReturn(Mono.just(TEAM_ENTITY_1));
60-
final var detailedTeam = DetailedTeam.builder().build();
61-
when(mockMapper.toModel(TEAM_ENTITY_1)).thenReturn(detailedTeam);
63+
when(mockMapper.toModel(TEAM_ENTITY_1)).thenReturn(DETAILED_TEAM_1);
6264

6365
final var result = underTest.addTeam(TEAM_1);
6466

6567
StepVerifier.create(result)
66-
.expectNext(detailedTeam)
68+
.expectNext(DETAILED_TEAM_1)
6769
.verifyComplete();
6870
}
6971

7072
@Test
7173
void shouldReturnUpdatedTeam() {
7274
when(mockRepository.findById(TEAM_ID_1)).thenReturn(Mono.just(OLD_TEAM_ENTITY));
73-
final var updatedTeamEntity = TEAM_ENTITY_1;
74-
when(mockRepository.save(updatedTeamEntity)).thenReturn(Mono.just(updatedTeamEntity));
75-
final var detailedTeam = DetailedTeam.builder().build();
76-
when(mockMapper.toModel(updatedTeamEntity)).thenReturn(detailedTeam);
75+
when(mockRepository.save(TEAM_ENTITY_1)).thenReturn(Mono.just(TEAM_ENTITY_1));
76+
when(mockMapper.toModel(TEAM_ENTITY_1)).thenReturn(DETAILED_TEAM_1);
7777

7878
final var result = underTest.updateTeam(TEAM_1);
7979

8080
StepVerifier.create(result)
81-
.expectNext(detailedTeam)
81+
.expectNext(DETAILED_TEAM_1)
82+
.verifyComplete();
83+
}
84+
85+
@Test
86+
void shouldReturnUpdatedTeamByAdmin() {
87+
when(mockMapper.toEntity(DETAILED_TEAM_1)).thenReturn(TEAM_ENTITY_1);
88+
when(mockRepository.save(TEAM_ENTITY_1)).thenReturn(Mono.just(TEAM_ENTITY_1));
89+
when(mockMapper.toModel(TEAM_ENTITY_1)).thenReturn(DETAILED_TEAM_1);
90+
91+
final var result = underTest.updateTeam(DETAILED_TEAM_1);
92+
93+
StepVerifier.create(result)
94+
.expectNext(DETAILED_TEAM_1)
8295
.verifyComplete();
8396
}
8497

8598
@Test
8699
void shouldReturnAllTeam() {
87-
final var teamEntity1 = new TeamEntity();
88-
teamEntity1.setTeamId(TEAM_ID_1);
89-
final var teamEntity2 = new TeamEntity();
90-
teamEntity2.setTeamId(TEAM_ID_2);
91-
when(mockRepository.findAll()).thenReturn(Flux.just(teamEntity1, teamEntity2));
92-
final var detailedTeam1 = DetailedTeam.builder().teamId(TEAM_ID_1).build();
93-
final var detailedTeam2 = DetailedTeam.builder().teamId(TEAM_ID_2).build();
94-
when(mockMapper.toModel(teamEntity1)).thenReturn(detailedTeam1);
95-
when(mockMapper.toModel(teamEntity2)).thenReturn(detailedTeam2);
100+
when(mockRepository.findAll()).thenReturn(Flux.just(TEAM_ENTITY_1, TEAM_ENTITY_2));
101+
when(mockMapper.toModel(TEAM_ENTITY_1)).thenReturn(DETAILED_TEAM_1);
102+
when(mockMapper.toModel(TEAM_ENTITY_2)).thenReturn(DETAILED_TEAM_2);
96103

97104
final var result = underTest.findAllTeam();
98105

99106
StepVerifier.create(result)
100-
.expectNext(detailedTeam1)
101-
.expectNext(detailedTeam2)
107+
.expectNext(DETAILED_TEAM_1)
108+
.expectNext(DETAILED_TEAM_2)
102109
.verifyComplete();
103110
}
104111

service/src/test/java/hu/bsstudio/robonaut/team/mapper/TeamModelEntityMapperTest.java

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ final class TeamModelEntityMapperTest {
2828
private static final int TOTAL_SCORE = Integer.MAX_VALUE;
2929
private static final int RANK = 2;
3030
private static final int JUNIOR_RANK = -1;
31+
32+
private static final TeamEntity TEAM_ENTITY = createTeamEntity();
33+
private static final DetailedTeam DETAILED_TEAM = createDetailedTeam();
34+
3135
private TeamModelEntityMapper underTest;
3236

3337
@BeforeEach
@@ -37,28 +41,22 @@ void setUp() {
3741

3842
@Test
3943
void shouldReturnMappedDetailedTeam() {
40-
final var teamEntity = new TeamEntity();
41-
teamEntity.setTeamId(TEAM_ID);
42-
teamEntity.setYear(YEAR);
43-
teamEntity.setTeamName(TEAM_NAME);
44-
teamEntity.setTeamMembers(TEAM_MEMBERS);
45-
teamEntity.setTeamType(TEAM_TYPE);
46-
teamEntity.setSkillScore(SKILL_SCORE);
47-
teamEntity.setSpeedScore(SPEED_SCORE);
48-
teamEntity.setSpeedBonusScore(SPEED_BONUS_SCORE);
49-
teamEntity.setNumberOfOvertakes(NUMBER_OF_OVERTAKES);
50-
teamEntity.setSafetyCarWasFollowed(SAFETY_CAR_WAS_FOLLOWED);
51-
teamEntity.setSpeedTimes(SPEED_TIMES);
52-
teamEntity.setVotes(VOTES);
53-
teamEntity.setAudienceScore(AUDIENCE_SCORE);
54-
teamEntity.setQualificationScore(QUALIFICATION_SCORE);
55-
teamEntity.setTotalScore(TOTAL_SCORE);
56-
teamEntity.setRank(RANK);
57-
teamEntity.setJuniorRank(JUNIOR_RANK);
5844

59-
final var detailedTeam = underTest.toModel(teamEntity);
45+
final var result = underTest.toModel(TEAM_ENTITY);
46+
47+
assertThat(result).isEqualTo(DETAILED_TEAM);
48+
}
49+
50+
@Test
51+
void shouldReturnMapperEntity() {
6052

61-
final var expected = DetailedTeam.builder()
53+
final var result = underTest.toEntity(DETAILED_TEAM);
54+
55+
assertThat(result).isEqualTo(TEAM_ENTITY);
56+
}
57+
58+
private static DetailedTeam createDetailedTeam() {
59+
return DetailedTeam.builder()
6260
.teamId(TEAM_ID)
6361
.year(YEAR)
6462
.teamName(TEAM_NAME)
@@ -77,6 +75,27 @@ void shouldReturnMappedDetailedTeam() {
7775
.rank(RANK)
7876
.juniorRank(JUNIOR_RANK)
7977
.build();
80-
assertThat(detailedTeam).isEqualTo(expected);
78+
}
79+
80+
private static TeamEntity createTeamEntity() {
81+
final var entity = new TeamEntity();
82+
entity.setTeamId(TEAM_ID);
83+
entity.setYear(YEAR);
84+
entity.setTeamName(TEAM_NAME);
85+
entity.setTeamMembers(TEAM_MEMBERS);
86+
entity.setTeamType(TEAM_TYPE);
87+
entity.setSkillScore(SKILL_SCORE);
88+
entity.setSpeedScore(SPEED_SCORE);
89+
entity.setSpeedBonusScore(SPEED_BONUS_SCORE);
90+
entity.setNumberOfOvertakes(NUMBER_OF_OVERTAKES);
91+
entity.setSafetyCarWasFollowed(SAFETY_CAR_WAS_FOLLOWED);
92+
entity.setSpeedTimes(SPEED_TIMES);
93+
entity.setVotes(VOTES);
94+
entity.setAudienceScore(AUDIENCE_SCORE);
95+
entity.setQualificationScore(QUALIFICATION_SCORE);
96+
entity.setTotalScore(TOTAL_SCORE);
97+
entity.setRank(RANK);
98+
entity.setJuniorRank(JUNIOR_RANK);
99+
return entity;
81100
}
82101
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package hu.bsstudio.robonaut.team;
2+
3+
import hu.bsstudio.robonaut.team.model.DetailedTeam;
4+
import lombok.NonNull;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.reactive.function.server.HandlerFunction;
7+
import org.springframework.web.reactive.function.server.ServerRequest;
8+
import org.springframework.web.reactive.function.server.ServerResponse;
9+
import reactor.core.publisher.Mono;
10+
11+
@RequiredArgsConstructor
12+
public class AdminUpdateTeamHandler implements HandlerFunction<ServerResponse> {
13+
14+
@NonNull
15+
private final TeamService teamService;
16+
17+
@Override
18+
public Mono<ServerResponse> handle(final ServerRequest request) {
19+
final var detailedTeam = request.bodyToFlux(DetailedTeam.class)
20+
.flatMap(teamService::updateTeam);
21+
return ServerResponse.ok().body(detailedTeam, DetailedTeam.class);
22+
}
23+
}

web/src/main/java/hu/bsstudio/robonaut/team/configuration/TeamRouterConfiguration.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package hu.bsstudio.robonaut.team.configuration;
22

33
import hu.bsstudio.robonaut.security.RobonAuthFilter;
4+
import hu.bsstudio.robonaut.team.AdminUpdateTeamHandler;
45
import hu.bsstudio.robonaut.team.CreateTeamHandler;
56
import hu.bsstudio.robonaut.team.ReadAllTeamHandler;
67
import hu.bsstudio.robonaut.team.TeamService;
@@ -23,13 +24,15 @@ public class TeamRouterConfiguration {
2324

2425
@Bean
2526
public RouterFunction<ServerResponse> teamRouterFunction(final CreateTeamHandler createTeamHandler,
26-
final UpdateTeamHandler updateTeamHandler,
27-
final ReadAllTeamHandler readAllTeamHandler) {
27+
final ReadAllTeamHandler readAllTeamHandler,
28+
final AdminUpdateTeamHandler adminUpdateTeamHandler,
29+
final UpdateTeamHandler updateTeamHandler) {
2830
return RouterFunctions.route()
2931
.filter(robonAuthFilter)
3032
.POST("/api/team", createTeamHandler)
31-
.PUT("/api/team", updateTeamHandler)
3233
.GET("/api/team", readAllTeamHandler)
34+
.PUT("/api/team", updateTeamHandler)
35+
.PUT("/api/admin/team", adminUpdateTeamHandler)
3336
.build();
3437
}
3538

@@ -47,4 +50,9 @@ public ReadAllTeamHandler readAllTeamHandler() {
4750
public UpdateTeamHandler updateTeamHandler() {
4851
return new UpdateTeamHandler(teamService);
4952
}
53+
54+
@Bean
55+
public AdminUpdateTeamHandler adminUpdateTeamHandler() {
56+
return new AdminUpdateTeamHandler(teamService);
57+
}
5058
}

0 commit comments

Comments
 (0)