muas so bassn

This commit is contained in:
j-weissen 2023-12-20 09:14:01 +01:00
parent 8c78c50c72
commit c2b9697bff
12 changed files with 183 additions and 45 deletions

3
.gitignore vendored
View file

@ -33,4 +33,5 @@ build/
.vscode/ .vscode/
### Custom ### ### Custom ###
db/mysql /db/mysql
/db/testmysql/

View file

@ -6,7 +6,8 @@ Content-Type: application/json
{ {
"name": "Erwachsene", "name": "Erwachsene",
"price": 25.5, "price": 25.5,
"stock": 100 "stock": 100,
"eventId": 1
} }
### update ### update

View file

@ -47,11 +47,17 @@ public class CategoryController {
responseCode = "403", responseCode = "403",
description = "You're not authorized to perform this operation." description = "You're not authorized to perform this operation."
), ),
@ApiResponse(
responseCode = "404",
description = "The given eventId couldn't be found"
),
}) })
@PostMapping("/create") @PostMapping("/create")
@AdminOnly @AdminOnly
public ResponseEntity<Void> create(@RequestBody CategoryRequestDto dto) { public ResponseEntity<Void> create(@RequestBody CategoryRequestDto dto) {
categoryService.create(dto); if (!categoryService.create(dto)) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
return ResponseEntity.status(HttpStatus.CREATED).build(); return ResponseEntity.status(HttpStatus.CREATED).build();
} }

View file

@ -1,4 +1,4 @@
package me.jweissen.aeticket.dto.request; package me.jweissen.aeticket.dto.request;
public record CategoryRequestDto(String name, Double price, Integer stock) { public record CategoryRequestDto(String name, Double price, Integer stock, Long eventId) {
} }

View file

@ -1,8 +1,7 @@
package me.jweissen.aeticket.model; package me.jweissen.aeticket.model;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Getter; import lombok.*;
import lombok.Setter;
import java.util.List; import java.util.List;
@ -10,6 +9,9 @@ import java.util.List;
@Table @Table
@Getter @Getter
@Setter @Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Cart { public class Cart {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)

View file

@ -10,6 +10,8 @@ import java.util.List;
@Table @Table
@RequiredArgsConstructor @RequiredArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@Builder
@AllArgsConstructor
@Getter @Getter
@Setter @Setter
public class User { public class User {

View file

@ -3,9 +3,10 @@ package me.jweissen.aeticket.service;
import me.jweissen.aeticket.dto.request.CategoryRequestDto; import me.jweissen.aeticket.dto.request.CategoryRequestDto;
import me.jweissen.aeticket.dto.request.CategoryUpdateRequestDto; import me.jweissen.aeticket.dto.request.CategoryUpdateRequestDto;
import me.jweissen.aeticket.dto.response.CategoryResponseDto; import me.jweissen.aeticket.dto.response.CategoryResponseDto;
import me.jweissen.aeticket.dto.response.EventResponseDto;
import me.jweissen.aeticket.model.Category; import me.jweissen.aeticket.model.Category;
import me.jweissen.aeticket.model.Event;
import me.jweissen.aeticket.repository.CategoryRepository; import me.jweissen.aeticket.repository.CategoryRepository;
import me.jweissen.aeticket.repository.EventRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@ -14,9 +15,11 @@ import java.util.Optional;
@Service @Service
public class CategoryService { public class CategoryService {
private final CategoryRepository categoryRepository; private final CategoryRepository categoryRepository;
private final EventRepository eventRepository;
public CategoryService(CategoryRepository categoryRepository) { public CategoryService(CategoryRepository categoryRepository, EventRepository eventRepository) {
this.categoryRepository = categoryRepository; this.categoryRepository = categoryRepository;
this.eventRepository = eventRepository;
} }
public static Category fromDto(CategoryRequestDto dto) { public static Category fromDto(CategoryRequestDto dto) {
@ -52,9 +55,16 @@ public class CategoryService {
return (Double.valueOf(euros * 100)).intValue(); return (Double.valueOf(euros * 100)).intValue();
} }
public CategoryResponseDto create(CategoryRequestDto dto) { public boolean create(CategoryRequestDto dto) {
Category category = categoryRepository.save(fromDto(dto)); Category category = fromDto(dto);
return toDto(category); Optional<Event> event = eventRepository.findById(dto.eventId());
if (event.isEmpty()) {
// event ids not found
return false;
}
category.setEvent(event.get());
categoryRepository.save(category);
return true;
} }
public boolean update(CategoryUpdateRequestDto dto) { public boolean update(CategoryUpdateRequestDto dto) {

View file

@ -1,6 +1,13 @@
package me.jweissen.aeticket.controller; package me.jweissen.aeticket.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import me.jweissen.aeticket.dto.request.CartAddRequestDto;
import me.jweissen.aeticket.dto.request.CartEntryRequestDto;
import me.jweissen.aeticket.dto.response.CheckoutResponseDto;
import me.jweissen.aeticket.model.Cart; import me.jweissen.aeticket.model.Cart;
import me.jweissen.aeticket.model.Role;
import me.jweissen.aeticket.model.User;
import me.jweissen.aeticket.service.AuthService;
import me.jweissen.aeticket.service.CartService; import me.jweissen.aeticket.service.CartService;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
@ -9,6 +16,13 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import java.util.Arrays;
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.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(CartController.class) @WebMvcTest(CartController.class)
public class CartControllerTest { public class CartControllerTest {
@Autowired @Autowired
@ -16,10 +30,11 @@ public class CartControllerTest {
@MockBean @MockBean
private CartService cartService; private CartService cartService;
@MockBean
private AuthService authService;
/*
@Test @Test
void addEntry() { void addEntry() throws Exception {
CartAddRequestDto dto = new CartAddRequestDto( CartAddRequestDto dto = new CartAddRequestDto(
999L, 999L,
Arrays.asList( Arrays.asList(
@ -27,18 +42,39 @@ public class CartControllerTest {
new CartEntryRequestDto(2L, 10) new CartEntryRequestDto(2L, 10)
) )
); );
Mockito.when(cartService.add()).thenReturn(true);
}
*/
@Test
void getCartEntries() {
}
@Test
void checkout() {
Cart cart = new Cart(); Cart cart = new Cart();
Mockito.when(cartService.checkout(cart)); User user = User.builder()
.id(1L)
.firstname("jonas")
.lastname("weissensteiner")
.email("my@mail.com")
.password("geheim")
.currentCart(cart)
.role(Role.ADMIN).build();
Mockito.when(authService.getCurrentUser()).thenReturn(user);
Mockito.when(cartService.add(dto, cart)).thenReturn(true);
final ObjectMapper mapper = new ObjectMapper();
final String jsonContent = mapper.writeValueAsString(dto);
mockMvc.perform(
post("/cart/add").contentType("application/json").content(jsonContent)).andExpect(status().isNoContent()
);
}
@Test
void checkout() throws Exception {
Cart cart = new Cart();
User user = User.builder()
.id(1L)
.firstname("jonas")
.lastname("weissensteiner")
.email("my@mail.com")
.password("geheim")
.currentCart(cart)
.role(Role.ADMIN).build();
Mockito.when(authService.getCurrentUser()).thenReturn(user);
Mockito.when(cartService.checkout(cart)).thenReturn(new CheckoutResponseDto(169.99));
mockMvc.perform(
get("/cart/checkout")).andExpect(jsonPath("$.price").value(169.99)
);
} }
} }

View file

@ -0,0 +1,45 @@
package me.jweissen.aeticket.service;
import me.jweissen.aeticket.model.Role;
import me.jweissen.aeticket.model.User;
import me.jweissen.aeticket.repository.UserRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import java.util.Date;
import java.util.Optional;
@SpringBootTest
@AutoConfigureMockMvc
public class AuthServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private JwtService jwtService;
@Autowired
private AuthService authService;
@Test
void authenticate() {
String token = jwtService.generateToken(1L);
User user = User.builder()
.id(1L)
.firstname("jonas")
.lastname("weissensteiner")
.email("my@mail.com")
.password("geheim")
.token(token)
.tokenValidUntil(new Date(System.currentTimeMillis() + 1000L * 60 * 60))
.role(Role.ADMIN).build();
Optional<User> userOptional = Optional.of(user);
Mockito.when(userRepository.findById(1L)).thenReturn(userOptional);
Assertions.assertEquals(user, authService.authenticate(token).get());
}
}

View file

@ -0,0 +1,50 @@
package me.jweissen.aeticket.service;
import me.jweissen.aeticket.dto.request.CartAddRequestDto;
import me.jweissen.aeticket.dto.request.CartEntryRequestDto;
import me.jweissen.aeticket.model.*;
import me.jweissen.aeticket.repository.CategoryRepository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
@SpringBootTest
@AutoConfigureMockMvc
public class CartServiceTest {
@MockBean
private CategoryRepository categoryRepository;
@Autowired
private CartService cartService;
@Test
public void add() {
CartAddRequestDto dto = new CartAddRequestDto(
1L,
Arrays.asList(
new CartEntryRequestDto(1L, 10),
new CartEntryRequestDto(2L, 20)
)
);
Cart cart = new Cart();
cart.setCartEntries(new ArrayList<>());
Category category1 = Category.builder()
.id(1L).name("Cat 1").price(200).stock(100).build();
Category category2 = Category.builder()
.id(2L).name("Cat 2").price(200).stock(100).build();
Mockito.when(categoryRepository.findById(1L)).thenReturn(Optional.of(category1));
Mockito.when(categoryRepository.findById(2L)).thenReturn(Optional.of(category2));
Mockito.when(categoryRepository.unavailableTickets(category1)).thenReturn(0);
Mockito.when(categoryRepository.unavailableTickets(category2)).thenReturn(0);
Assertions.assertTrue(cartService.add(dto, cart));
}
}

View file

@ -12,9 +12,6 @@ spring:
username: test username: test
password: test password: test
url: 'jdbc:mysql://localhost:5306/test' url: 'jdbc:mysql://localhost:5306/test'
server:
servlet:
context-path: '/api/v1'
token: token:
secret: "RATP loves Laravel more than Symfony" secret: "RATP loves Laravel more than Symfony"
validForHours: 24 validForHours: 24

View file

@ -1,12 +0,0 @@
INSERT INTO user (id, email, firstname, lastname, password, role, token, token_valid_until) VALUES
(1, 'admin@email.com', 'Admin', 'Chef', 'geheim', 0, 'token', DATE('2023-12-31'));
INSERT INTO cart (id, checked_out, user_id) VALUES (1, false, 1);
UPDATE user SET current_cart_id = 1 WHERE id = 1;
INSERT INTO event (id, description, end, name, start) VALUES (1, 'Maturaball der Abteilungen EL, IT, ME, Y', '2023-03-03 06:00:00.000000', 'Maturaball HTL Steyr 2024', '2023-03-02 21:00:00.000000');
INSERT INTO category (id, name, price, stock, event_id) VALUES (1, 'Normal', 2500, 500, 1);
INSERT INTO category (id, name, price, stock, event_id) VALUES (2, 'Maturanten', 0, 500, 1);
INSERT INTO category (id, name, price, stock, event_id) VALUES (3, 'Prechtl', 5000, 1, 1);
INSERT INTO cart_entry (id, amount, cart_id, category_id) VALUES (3, 1, 2, 3);