muas so bassn
This commit is contained in:
parent
8c78c50c72
commit
c2b9697bff
12 changed files with 183 additions and 45 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -33,4 +33,5 @@ build/
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
### Custom ###
|
### Custom ###
|
||||||
db/mysql
|
/db/mysql
|
||||||
|
/db/testmysql/
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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,29 +30,51 @@ 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(
|
||||||
new CartEntryRequestDto(1L, 10),
|
new CartEntryRequestDto(1L, 10),
|
||||||
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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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);
|
|
||||||
|
|
||||||
Reference in a new issue