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/
|
||||
|
||||
### Custom ###
|
||||
db/mysql
|
||||
/db/mysql
|
||||
/db/testmysql/
|
||||
|
|
|
|||
|
|
@ -6,7 +6,8 @@ Content-Type: application/json
|
|||
{
|
||||
"name": "Erwachsene",
|
||||
"price": 25.5,
|
||||
"stock": 100
|
||||
"stock": 100,
|
||||
"eventId": 1
|
||||
}
|
||||
|
||||
### update
|
||||
|
|
|
|||
|
|
@ -47,11 +47,17 @@ public class CategoryController {
|
|||
responseCode = "403",
|
||||
description = "You're not authorized to perform this operation."
|
||||
),
|
||||
@ApiResponse(
|
||||
responseCode = "404",
|
||||
description = "The given eventId couldn't be found"
|
||||
),
|
||||
})
|
||||
@PostMapping("/create")
|
||||
@AdminOnly
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
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;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -10,6 +9,9 @@ import java.util.List;
|
|||
@Table
|
||||
@Getter
|
||||
@Setter
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class Cart {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ import java.util.List;
|
|||
@Table
|
||||
@RequiredArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
@Setter
|
||||
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.CategoryUpdateRequestDto;
|
||||
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.Event;
|
||||
import me.jweissen.aeticket.repository.CategoryRepository;
|
||||
import me.jweissen.aeticket.repository.EventRepository;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -14,9 +15,11 @@ import java.util.Optional;
|
|||
@Service
|
||||
public class CategoryService {
|
||||
private final CategoryRepository categoryRepository;
|
||||
private final EventRepository eventRepository;
|
||||
|
||||
public CategoryService(CategoryRepository categoryRepository) {
|
||||
public CategoryService(CategoryRepository categoryRepository, EventRepository eventRepository) {
|
||||
this.categoryRepository = categoryRepository;
|
||||
this.eventRepository = eventRepository;
|
||||
}
|
||||
|
||||
public static Category fromDto(CategoryRequestDto dto) {
|
||||
|
|
@ -52,9 +55,16 @@ public class CategoryService {
|
|||
return (Double.valueOf(euros * 100)).intValue();
|
||||
}
|
||||
|
||||
public CategoryResponseDto create(CategoryRequestDto dto) {
|
||||
Category category = categoryRepository.save(fromDto(dto));
|
||||
return toDto(category);
|
||||
public boolean create(CategoryRequestDto dto) {
|
||||
Category category = fromDto(dto);
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,13 @@
|
|||
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.Role;
|
||||
import me.jweissen.aeticket.model.User;
|
||||
import me.jweissen.aeticket.service.AuthService;
|
||||
import me.jweissen.aeticket.service.CartService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
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.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)
|
||||
public class CartControllerTest {
|
||||
@Autowired
|
||||
|
|
@ -16,29 +30,51 @@ public class CartControllerTest {
|
|||
|
||||
@MockBean
|
||||
private CartService cartService;
|
||||
@MockBean
|
||||
private AuthService authService;
|
||||
|
||||
/*
|
||||
@Test
|
||||
void addEntry() {
|
||||
void addEntry() throws Exception {
|
||||
CartAddRequestDto dto = new CartAddRequestDto(
|
||||
999L,
|
||||
Arrays.asList(
|
||||
new CartEntryRequestDto(1L, 10),
|
||||
new CartEntryRequestDto(2L, 10)
|
||||
)
|
||||
999L,
|
||||
Arrays.asList(
|
||||
new CartEntryRequestDto(1L, 10),
|
||||
new CartEntryRequestDto(2L, 10)
|
||||
)
|
||||
);
|
||||
Mockito.when(cartService.add()).thenReturn(true);
|
||||
}
|
||||
*/
|
||||
|
||||
@Test
|
||||
void getCartEntries() {
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void checkout() {
|
||||
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
|
||||
password: test
|
||||
url: 'jdbc:mysql://localhost:5306/test'
|
||||
server:
|
||||
servlet:
|
||||
context-path: '/api/v1'
|
||||
token:
|
||||
secret: "RATP loves Laravel more than Symfony"
|
||||
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