Tries to fix problem with clearing of the db (not solved yet)

This commit is contained in:
szsa
2022-06-06 21:01:20 +02:00
parent f3dcc948b0
commit ed95090be8
8 changed files with 106 additions and 22 deletions

View File

@@ -44,7 +44,7 @@ public class TeamService {
.flatMap(createTeamDto -> teamRepository.findByName(createTeamDto.name())
.doOnEach(team -> log.error("Team with name " + createTeamDto.name() + " already exists"))
.map(Team::toGetTeamDto)
.switchIfEmpty(Mono.defer(() -> createTeamWithMembers(createTeamDto))));
.switchIfEmpty(Mono.defer(() -> createTeamWithMembers(createTeamDto))));
}
private Mono<GetTeamDto> createTeamWithMembers(CreateTeamDto createTeamDto) {

View File

@@ -13,5 +13,7 @@ public interface CrudRepository<T, ID> {
Mono<T> save(T t);
Mono<T> delete(ID id);
Mono<Void> deleteAll();
}

View File

@@ -32,7 +32,7 @@ public class Team {
return TeamEntity.builder()
.id(id)
.name(name)
.members(members.stream().map(User::toEntity).toList())
.members(members == null ? null : members.stream().map(User::toEntity).toList())
.build();
}

View File

@@ -3,7 +3,6 @@ package net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.reposi
import lombok.RequiredArgsConstructor;
import net.szymonsawicki.reactivetimesheetapp.domain.team.Team;
import net.szymonsawicki.reactivetimesheetapp.domain.team.repository.TeamRepository;
import net.szymonsawicki.reactivetimesheetapp.domain.user.User;
import net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.dao.TeamDao;
import net.szymonsawicki.reactivetimesheetapp.infrastructure.persistence.exception.PersistenceException;
import org.springframework.stereotype.Repository;
@@ -51,6 +50,11 @@ public class TeamsRepositoryImpl implements TeamRepository {
.switchIfEmpty(Mono.error(new PersistenceException("cannot find team to delete")));
}
@Override
public Mono<Void> deleteAll() {
return teamDao.deleteAll();
}
public Mono<Team> findByName(String name) {
return teamDao.findByName(name)
.flatMap(teamEntity -> Mono.just(teamEntity.toTeam()));

View File

@@ -52,6 +52,11 @@ public class TimeEntryRepositoryImpl implements TimeEntryRepository {
.switchIfEmpty(Mono.error(new PersistenceException("cannot find team to delete")));
}
@Override
public Mono<Void> deleteAll() {
return timeEntryDao.deleteAll();
}
@Override
public Flux<TimeEntry> findAllByUser(User user) {
return timeEntryDao.findAllByUser(user.toEntity())

View File

@@ -74,4 +74,9 @@ public class UserRepositoryImpl implements UserRepository {
return userDao
.deleteAll(users.stream().map(User::toEntity).toList());
}
@Override
public Mono<Void> deleteAll() {
return userDao.deleteAll();
}
}

View File

@@ -28,13 +28,14 @@ public class Routing {
RouterFunctions.route(GET("/{name}").and(accept(MediaType.APPLICATION_JSON)), teamHandlers::findByName)
.andRoute(GET("/id/{id}").and(accept(MediaType.APPLICATION_JSON)), teamHandlers::findById)
.andRoute(POST("/").and(accept(MediaType.APPLICATION_JSON)), teamHandlers::addTeam)
.andRoute(DELETE("/{id}").and(accept(MediaType.APPLICATION_JSON)), teamHandlers::deleteTeam))
.andNest(path("/users"),
RouterFunctions.route(GET("/id/{id}").and(accept(MediaType.APPLICATION_JSON)), userHandlers::findById)
.andRoute(GET("/{username}").and(accept(MediaType.APPLICATION_JSON)), userHandlers::findByUsername)
.andRoute(POST("/").and(accept(MediaType.APPLICATION_JSON)), userHandlers::createUser)
.andRoute(DELETE("/{id}").and(accept(MediaType.APPLICATION_JSON)), userHandlers::deleteUser))
.andNest(path("/time-entries"),
RouterFunctions.route(POST("/").and(accept(MediaType.APPLICATION_JSON)), timeEntryHandlers::addTimeEntry));
.andRoute(DELETE("/{id}").and(accept(MediaType.APPLICATION_JSON)), teamHandlers::deleteTeam)
.andNest(path("/reset"), RouterFunctions.route(GET("/reset").and(accept(MediaType.APPLICATION_JSON)), teamHandlers::findByName))
.andNest(path("/users"),
RouterFunctions.route(GET("/id/{id}").and(accept(MediaType.APPLICATION_JSON)), userHandlers::findById)
.andRoute(GET("/{username}").and(accept(MediaType.APPLICATION_JSON)), userHandlers::findByUsername)
.andRoute(POST("/").and(accept(MediaType.APPLICATION_JSON)), userHandlers::createUser)
.andRoute(DELETE("/{id}").and(accept(MediaType.APPLICATION_JSON)), userHandlers::deleteUser))
.andNest(path("/time-entries"),
RouterFunctions.route(POST("/").and(accept(MediaType.APPLICATION_JSON)), timeEntryHandlers::addTimeEntry)));
}
}

View File

@@ -1,7 +1,6 @@
package net.szymonsawicki.reactivetimesheetapp.application.service;
import net.szymonsawicki.reactivetimesheetapp.application.service.exception.TeamServiceException;
import net.szymonsawicki.reactivetimesheetapp.application.service.utils.TimesheetAppMongoDbContainer;
import net.szymonsawicki.reactivetimesheetapp.domain.team.Team;
import net.szymonsawicki.reactivetimesheetapp.domain.team.TeamUtils;
import net.szymonsawicki.reactivetimesheetapp.domain.team.dto.CreateTeamDto;
@@ -13,16 +12,19 @@ import net.szymonsawicki.reactivetimesheetapp.domain.user.dto.GetUserDto;
import net.szymonsawicki.reactivetimesheetapp.domain.user.repository.UserRepository;
import net.szymonsawicki.reactivetimesheetapp.domain.user.type.Role;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpHeaders;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.web.reactive.function.BodyInserters;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import reactor.test.StepVerifier;
@@ -34,8 +36,13 @@ import java.util.List;
@AutoConfigureWebTestClient
@ActiveProfiles("test")
public class TeamServiceIT {
@Container
/* @ClassRule
private static final MongoDBContainer MONGO_DB_CONTAINER = TimesheetAppMongoDbContainer.getInstance();
*/
private static final MongoDBContainer MONGO_DB_CONTAINER =
new MongoDBContainer("mongo:4.2.8");
@Autowired
private TeamRepository teamRepository;
@@ -44,7 +51,23 @@ public class TeamServiceIT {
@Autowired
private WebTestClient webClient;
// TODO clear db after each method (deleteAll method must be implemented
@BeforeEach
void clearDb() {
userRepository.deleteAll();
teamRepository.deleteAll();
}
@BeforeAll
static void setUpAll() {
MONGO_DB_CONTAINER.start();
}
@AfterAll
static void tearDownAll() {
if (!MONGO_DB_CONTAINER.isShouldBeReused()) {
MONGO_DB_CONTAINER.stop();
}
}
@Test
void shouldReturnTeamOnGetById() {
@@ -90,21 +113,21 @@ public class TeamServiceIT {
.expectBodyList(TeamServiceException.class);
}
@Test
@DirtiesContext
void shouldCreateTeamWithTwoMembersOnCreate() {
String teamName = "Some test team";
String teamName = "Some test team2";
String username1 = "testsusrname1";
String username2 = "testsusrname2";
String password1 = "sdcvdfvbgdf";
String password2 = "xlöifxdl.";
String password1 = "kongamafonga";
String password2 = "kupaladupa.";
Role role = Role.DEVELOPER;
var member1 = new GetUserDto(username1, password1, password1, role, teamName);
var member2 = new GetUserDto(username2, password2, password2, role, teamName);
var member1 = new GetUserDto(null, username1, password1, role, null);
// var member2 = new GetUserDto(null, username2, password2, role, null);
var createTeamDto = new CreateTeamDto(teamName, List.of(member1, member2));
var createTeamDto = new CreateTeamDto(teamName, List.of(member1));
webClient.post().uri("/teams/")
.header(HttpHeaders.ACCEPT, "application/json")
@@ -121,5 +144,49 @@ public class TeamServiceIT {
.containsAll(List.of(username1, username2));
})
.verifyComplete();
var insertedTeamId = TeamUtils.toId.apply(teamRepository.findByName(teamName).block());
StepVerifier.create(userRepository.findByUsername(username1))
.expectNextMatches(user -> UserUtils.toTeamId.apply(user).equals(insertedTeamId))
.verifyComplete();
StepVerifier.create(userRepository.findByUsername(username2))
.expectNextMatches(user -> UserUtils.toTeamId.apply(user).equals(insertedTeamId))
.verifyComplete();
}
@Test
void shouldReturnExistingTeamOnCreateWhenNameTaken() {
String teamName = "Some test team2";
String username1 = "testsusrname1";
String password1 = "sdcvdfvbgdf";
Role role = Role.DEVELOPER;
var team = Team.builder()
.name(teamName)
.members(null)
.build();
var insertedTeam = teamRepository.save(team);
var member1 = new GetUserDto(null, username1, password1, role, null);
var createTeamDto = new CreateTeamDto(teamName, List.of(member1));
webClient.post().uri("/teams/")
.header(HttpHeaders.ACCEPT, "application/json")
.body(BodyInserters.fromValue(createTeamDto))
.exchange()
.expectStatus().is2xxSuccessful()
.expectBodyList(TeamServiceException.class);
StepVerifier.create(teamRepository.findByName(teamName))
.assertNext(t -> {
Assertions.assertThat(TeamUtils.toName.apply(t)).isEqualTo(teamName);
// Assertions.assertThat(TeamUtils.toMembers.apply(t).size()).isZero();
})
.verifyComplete();
}
}