1
0
Fork 0
mirror of https://codeberg.org/beerbrawl/beerbrawl.git synced 2024-09-23 05:40:51 +02:00

Merge branch 'tournament--overview-tests' into 'development'

test/#49/Tournament overview Tests after revert

See merge request 2024ss-se-pr-group/24ss-se-pr-qse-11!39
This commit is contained in:
Kevin Mohammed 2024-05-21 13:25:39 +00:00
commit 00698d5aec
6 changed files with 169 additions and 61 deletions

View file

@ -25,6 +25,7 @@ public interface TestData {
}
};
String DEFAULT_USER = "user";
String DEFAULT_USER_PASSWORD = "password";
List<String> USER_ROLES = new ArrayList<>() {
{
add("ROLE_USER");

View file

@ -6,6 +6,10 @@ import at.ac.tuwien.sepr.groupphase.backend.config.properties.SecurityProperties
import at.ac.tuwien.sepr.groupphase.backend.datagenerator.TestDataGenerator;
import at.ac.tuwien.sepr.groupphase.backend.endpoint.dto.CreateTournamentDto;
import at.ac.tuwien.sepr.groupphase.backend.endpoint.dto.TournamentDto;
import at.ac.tuwien.sepr.groupphase.backend.endpoint.dto.TournamentListDto;
import at.ac.tuwien.sepr.groupphase.backend.entity.ApplicationUser;
import at.ac.tuwien.sepr.groupphase.backend.entity.Tournament;
import at.ac.tuwien.sepr.groupphase.backend.repository.MessageRepository;
import at.ac.tuwien.sepr.groupphase.backend.endpoint.dto.TournamentQualificationMatchDto;
import at.ac.tuwien.sepr.groupphase.backend.entity.Team;
import at.ac.tuwien.sepr.groupphase.backend.entity.Tournament;
@ -35,6 +39,15 @@ import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import java.time.LocalDateTime;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import org.springframework.transaction.annotation.Transactional;
@ExtendWith(SpringExtension.class)
@ -46,6 +59,12 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
@Autowired
private MockMvc mockMvc;
@Autowired
private TournamentRepository tournamentRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private ObjectMapper objectMapper;
@ -55,12 +74,9 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
@Autowired
private SecurityProperties securityProperties;
@Autowired
private TournamentRepository tournamentRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private TeamRepository teamRepository;
@Autowired
private QualificationParticipationRepository qualificationParticipationRepository;
@ -68,42 +84,41 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
public void successfullyCreateNewTournament() throws Exception {
var registrationEnd = LocalDateTime.now().plusDays(1).withSecond(0).withNano(0);
CreateTournamentDto data = new CreateTournamentDto()
.setName("TOURNAMENT 1")
.setRegistrationEnd(registrationEnd)
.setMaxParticipants(64L)
.setDescription("THIS IS A TEST");
.setName("TOURNAMENT 1")
.setRegistrationEnd(registrationEnd)
.setMaxParticipants(64L)
.setDescription("THIS IS A TEST");
var mvcResult = this.mockMvc.perform(post(TOURNAMENT_BASE_URI)
.header(securityProperties.getAuthHeader(), jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(data)))
.andDo(print())
.andReturn();
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
var dtoRes = objectMapper.readValue(response.getContentAsString(),
TournamentDto.class);
var dtoRes = objectMapper.readValue(response.getContentAsString(), TournamentDto.class);
assertAll(
() -> assertEquals(HttpStatus.CREATED.value(), response.getStatus()),
() -> assertEquals(MediaType.APPLICATION_JSON_VALUE, response.getContentType()),
() -> assertEquals(dtoRes.name(), data.getName()),
() -> assertEquals(dtoRes.registrationEnd(), data.getRegistrationEnd()),
() -> assertEquals(dtoRes.maxParticipants(), data.getMaxParticipants()),
() -> assertEquals(dtoRes.description(), data.getDescription()));
() -> assertEquals(HttpStatus.CREATED.value(), response.getStatus()),
() -> assertEquals(MediaType.APPLICATION_JSON_VALUE, response.getContentType()),
() -> assertEquals(dtoRes.name(), data.getName()),
() -> assertEquals(dtoRes.registrationEnd(), data.getRegistrationEnd()),
() -> assertEquals(dtoRes.maxParticipants(), data.getMaxParticipants()),
() -> assertEquals(dtoRes.description(), data.getDescription()));
}
@Test
public void createNewTournamentWithValidationErrorsFor_Name_RegistrationEnd_And_MaxParticipants() throws Exception {
CreateTournamentDto data = new CreateTournamentDto()
.setName(null)
.setRegistrationEnd(LocalDateTime.now().minusDays(1))
.setMaxParticipants(0L);
.setName(null)
.setRegistrationEnd(LocalDateTime.now().minusDays(1))
.setMaxParticipants(0L);
var mvcResult = this.mockMvc.perform(post(TOURNAMENT_BASE_URI)
.header(securityProperties.getAuthHeader(), jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES))
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(data)))
.andDo(print())
.andReturn();
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
var res = response.getContentAsString();
@ -114,11 +129,71 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
var messages = matcher.group("messages").split(", ");
assertAll(() -> assertEquals(messages.length, 4),
() -> assertTrue(List.of(messages).containsAll(List.of(
"registrationEnd Registration end must be in the future.",
"maxParticipants Max participants needs to be a number larger than 16.",
"name Name can't be null.",
"name Name can't be empty."))));
() -> assertTrue(List.of(messages).containsAll(List.of(
"registrationEnd Registration end must be in the future.",
"maxParticipants Max participants needs to be a number larger than 16.",
"name Name can't be null.",
"name Name can't be empty."))));
}
@Test
public void successfullyGetTournaments() throws Exception {
// setup
var tournament = new Tournament();
tournament.setName("TOURNAMENT_WITHOUT_TEAMS");
tournament.setMaxParticipants(64l);
tournament.setOrganizer(userRepository.findByUsername(TestDataGenerator.TEST_USER));
tournament.setRegistrationEnd(LocalDateTime.now().plusDays(1));
tournamentRepository.saveAndFlush(tournament);
var mvcResult = this.mockMvc.perform(get(TOURNAMENT_BASE_URI)
.header(securityProperties.getAuthHeader(), jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES))
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
var dtoRes = objectMapper.readValue(response.getContentAsString(), TournamentListDto[].class);
assertAll(
() -> assertEquals(HttpStatus.OK.value(), response.getStatus()),
() -> assertEquals(MediaType.APPLICATION_JSON_VALUE, response.getContentType()),
() -> assertNotNull(dtoRes),
() -> assertTrue(dtoRes.length > 0, "Expected to find tournaments but found none"));
}
@Test
public void getTournamentsWhenNoneExist() throws Exception {
tournamentRepository.deleteAll();
var mvcResult = this.mockMvc.perform(get(TOURNAMENT_BASE_URI)
.header(securityProperties.getAuthHeader(), jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES))
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
var dtoRes = objectMapper.readValue(response.getContentAsString(), TournamentListDto[].class);
assertAll(
() -> assertEquals(HttpStatus.OK.value(), response.getStatus()),
() -> assertEquals(MediaType.APPLICATION_JSON_VALUE, response.getContentType()),
() -> assertNotNull(dtoRes),
() -> assertEquals(0, dtoRes.length, "Expected no tournaments but found some"));
}
@Test
public void getTournamentsUnauthorized() throws Exception {
var mvcResult = this.mockMvc.perform(get(TOURNAMENT_BASE_URI)
.contentType(MediaType.APPLICATION_JSON))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
assertAll(
() -> assertEquals(HttpStatus.FORBIDDEN.value(), response.getStatus())
);
}
@Test
@ -143,21 +218,21 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
teamRepository.flush();
var mvcResult = this.mockMvc
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, tournament.getId()))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES)))
.andDo(print())
.andReturn();
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, tournament.getId()))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES)))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
assertEquals(HttpStatus.CREATED.value(), response.getStatus());
var matches = objectMapper.readerFor(TournamentQualificationMatchDto.class)
.<TournamentQualificationMatchDto>readValues(response.getContentAsString()).readAll();
.<TournamentQualificationMatchDto>readValues(response.getContentAsString()).readAll();
var qualificationParticipations = matches.stream()
.flatMap(m -> qualificationParticipationRepository.findAllByQualificationMatchId(m.id()).stream())
.toList();
.flatMap(m -> qualificationParticipationRepository.findAllByQualificationMatchId(m.id()).stream())
.toList();
var numberOfMatchesForTeam = new HashMap<Long, Integer>();
for (var participation : qualificationParticipations) {
@ -165,7 +240,7 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
numberOfMatchesForTeam.put(participation.getTeam().getId(), 0);
}
numberOfMatchesForTeam.put(participation.getTeam().getId(),
numberOfMatchesForTeam.get(participation.getTeam().getId()) + 1);
numberOfMatchesForTeam.get(participation.getTeam().getId()) + 1);
}
for (var matchesCount : numberOfMatchesForTeam.values()) {
@ -185,18 +260,18 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
tournamentRepository.saveAndFlush(tournament);
var mvcResult = this.mockMvc
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, tournament.getId()))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES)))
.andDo(print())
.andReturn();
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, tournament.getId()))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER, TEST_USER_ROLES)))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
assertAll(
() -> assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus()),
() -> assertEquals("A precondition wasn't met: Not enough teams in specified tournament.",
response.getContentAsString()));
() -> assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus()),
() -> assertEquals("A precondition wasn't met: Not enough teams in specified tournament.",
response.getContentAsString()));
}
@Test
@ -211,12 +286,12 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
tournamentRepository.saveAndFlush(tournament);
var mvcResult = this.mockMvc
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, tournament.getId()))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER + "_", TEST_USER_ROLES)))
.andDo(print())
.andReturn();
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, tournament.getId()))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER + "_", TEST_USER_ROLES)))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
assertEquals(HttpStatus.FORBIDDEN.value(), response.getStatus());
@ -225,12 +300,12 @@ public class TournamentEndpointTest extends TestUserData implements TestData {
@Test
public void generateQualificationMatchesForTournamentThatDoesntExist() throws Exception {
var mvcResult = this.mockMvc
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, -1))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER + "_", TEST_USER_ROLES)))
.andDo(print())
.andReturn();
.perform(post(
String.format("%s/%d/qualification-matches", TOURNAMENT_BASE_URI, -1))
.header(securityProperties.getAuthHeader(),
jwtTokenizer.getAuthToken(TEST_USER + "_", TEST_USER_ROLES)))
.andDo(print())
.andReturn();
MockHttpServletResponse response = mvcResult.getResponse();
assertEquals(HttpStatus.NOT_FOUND.value(), response.getStatus());

View file

@ -0,0 +1,16 @@
context('Get Tournaments', () => {
beforeEach(() => {
cy.loginTestUser();
cy.wait(4000);
});
it('successfully get tournaments', () => {
cy.intercept('GET', '/api/v1/tournaments', { fixture: 'tournaments.json' }).as(
'getTournaments',
);
cy.visit('/#/tournaments');
cy.wait('@getTournaments');
cy.get('[data-cy="tournaments-list"]').should('exist');
cy.get('[data-cy="tournaments-list-item"]').should('have.length.at.least', 1);
});
});

View file

@ -0,0 +1,16 @@
[
{
"id": 1,
"name": "Test Tournament 1",
"registrationEnd": "2024-05-20T14:00:00Z",
"maxParticipants": 64,
"description": "Description for Test Tournament 1"
},
{
"id": 2,
"name": "Test Tournament 2",
"registrationEnd": "2024-06-20T14:00:00Z",
"maxParticipants": 32,
"description": "Description for Test Tournament 2"
}
]

View file

@ -1,4 +1,4 @@
<mat-card class="tournament-card">
<mat-card class="tournament-card" data-cy="tournaments-list-item">
<div class="left-color-bar"></div>
<div class="card-content">
<div class="card-header">

View file

@ -1,4 +1,4 @@
<h1>Tournaments</h1>
@for (tournament of getTournaments(); track tournament.name) {
<app-tournament-card [tournament]="tournament"></app-tournament-card>
<app-tournament-card [tournament]="tournament" data-cy="tournaments-list"></app-tournament-card>
}