diff --git a/.circleci/config.yml b/.circleci/config.yml index b83ed6c10..9b8a5e1a9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,36 +1,36 @@ -# Java Maven CircleCI 2.0 configuration file -# -# Check https://circleci.com/docs/2.0/language-java/ for more details -# -version: 2 +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/2.0/configuration-reference +version: 2.1 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: - build: + # Below is the definition of your job to build and test your app, you can rename and customize it as you want. + build-and-test: + # These next lines define a Docker executor: https://circleci.com/docs/2.0/executor-types/ + # You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. + # Be sure to update the Docker image tag below to openjdk version of your application. + # A list of available CircleCI Docker Convenience Images are available here: https://circleci.com/developer/images/image/cimg/openjdk docker: - # specify the version you desire here - - image: circleci/openjdk:11.0.7-buster - - working_directory: ~/repo - - environment: - # Customize the JVM maximum heap limit - MAVEN_OPTS: -Xmx3200m - + - image: cimg/openjdk:17.0.5 + # Add steps to the job + # See: https://circleci.com/docs/2.0/configuration-reference/#steps steps: + # Checkout the code as the first step. - checkout + # Use mvn clean and package as the standard maven build phase + - run: + name: Build + command: mvn -V -B -DskipTests clean package + # Then run your unit tests and also the integrations tests! + - run: + name: Test + command: mvn -V verify - # Download and cache dependencies - - restore_cache: - keys: - - v1-dependencies-{{ checksum "pom.xml" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- - - - run: mvn install dependency:go-offline -Dmaven.test.skip=true - - - save_cache: - paths: - - ~/.m2 - key: v1-dependencies-{{ checksum "pom.xml" }} - - # run tests! - - run: mvn integration-test \ No newline at end of file +# Invoke jobs via workflows +# See: https://circleci.com/docs/2.0/configuration-reference/#workflows +workflows: + sample: # This is the name of the workflow, feel free to change it to better match your workflow. + # Inside the workflow, you define the jobs you want to run. + jobs: + - build-and-test \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 000000000..c1dd12f17 Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..b74bf7fcd --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar diff --git a/README.md b/README.md index 649581d20..d6511f18d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ +[![CircleCI](https://circleci.com/gh/PierreSQS/ssc-brewery/tree/db-test-context-revisit-sb3.0.1-INT.svg?style=shield)](https://circleci.com/gh/PierreSQS/ssc-brewery/tree/db-test-context-revisit-sb3.0.1-INT) # Brewery Spring MVC Monolith -This repository contains source code examples used to support my on-line courses about the Spring Framework. +This repository contains source code examples used to support my on-line course [Spring Security Core: Beginner to Guru](https://www.udemy.com/course/spring-security-core-beginner-to-guru/). You can learn more about the courses here: * [Spring Security Core: Beginner to Guru](https://www.udemy.com/course/spring-security-core-beginner-to-guru/?referralCode=306F288EB78688C0F3BC) diff --git a/pom.xml b/pom.xml index 5eb6742a0..4960cd8c2 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ org.springframework.boot spring-boot-starter-parent - 2.3.0.RELEASE + 3.0.1 @@ -57,14 +57,11 @@ UTF-8 UTF-8 - 11 - 2.3.0 + 17 ${java.version} ${java.version} - 1.3.1.Final - 1.18.12 - - --illegal-access=permit + 1.5.3.Final + 3.3.6 1.12.1 @@ -114,7 +111,7 @@ org.mapstruct mapstruct - ${org.mapstruct.version} + ${mapstruct.version} @@ -154,6 +151,14 @@ org.springframework.boot spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + ro.isdc.wro4j @@ -191,18 +196,23 @@ org.apache.maven.plugins maven-compiler-plugin - 3.8.1 org.mapstruct mapstruct-processor - ${org.mapstruct.version} + ${mapstruct.version} org.projectlombok lombok - ${org.projectlombok.version} + ${lombok.version} + + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 @@ -212,6 +222,19 @@ + + org.apache.maven.plugins + maven-failsafe-plugin + 3.0.0-M8 + + + + integration-test + verify + + + + \ No newline at end of file diff --git a/src/main/java/guru/sfg/brewery/bootstrap/UserDataLoader.java b/src/main/java/guru/sfg/brewery/bootstrap/UserDataLoader.java index c41b9aba5..3994ab47e 100644 --- a/src/main/java/guru/sfg/brewery/bootstrap/UserDataLoader.java +++ b/src/main/java/guru/sfg/brewery/bootstrap/UserDataLoader.java @@ -49,7 +49,7 @@ private void loadSecurityData() { } @Override - public void run(String... args) throws Exception { + public void run(String... args) { if (authorityRepository.count() == 0) { loadSecurityData(); } diff --git a/src/main/java/guru/sfg/brewery/config/SecurityConfig.java b/src/main/java/guru/sfg/brewery/config/SecurityConfig.java index ff9715536..0276f4cf0 100644 --- a/src/main/java/guru/sfg/brewery/config/SecurityConfig.java +++ b/src/main/java/guru/sfg/brewery/config/SecurityConfig.java @@ -1,42 +1,43 @@ package guru.sfg.brewery.config; import guru.sfg.brewery.security.SfgPasswordEncoderFactories; +import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; /** - * Created by jt on 6/13/20. + * Formatted by Pierrot on 2023-03-31. */ @Configuration @EnableWebSecurity -public class SecurityConfig extends WebSecurityConfigurerAdapter { +public class SecurityConfig { - @Override - protected void configure(HttpSecurity http) throws Exception { + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http - .authorizeRequests(authorize -> { - authorize - .antMatchers("/h2-console/**").permitAll() //do not use in production! - .antMatchers("/", "/webjars/**", "/login", "/resources/**").permitAll() - .antMatchers("/beers/find", "/beers*").permitAll() - .antMatchers(HttpMethod.GET, "/api/v1/beer/**").permitAll() - .mvcMatchers(HttpMethod.GET, "/api/v1/beerUpc/{upc}").permitAll(); - } ) - .authorizeRequests() - .anyRequest().authenticated() + .authorizeHttpRequests(authorize -> authorize + .requestMatchers(PathRequest.toH2Console()).permitAll() //do not use in production! + .requestMatchers("/", "/webjars/**", "/login", "/resources/**").permitAll() + .requestMatchers("/beers/find", "/beers*").permitAll() + .requestMatchers(HttpMethod.GET, "/api/v1/beer/**").permitAll() + .requestMatchers(HttpMethod.GET, "/api/v1/beerUpc/{upc}").permitAll()) + .authorizeHttpRequests().anyRequest().authenticated() + .and() + .formLogin() + .and() + .httpBasic() .and() - .formLogin().and() - .httpBasic() - .and().csrf().disable(); + .csrf().disable(); //h2 console config http.headers().frameOptions().sameOrigin(); + return http.build(); } @Bean @@ -44,52 +45,5 @@ PasswordEncoder passwordEncoder(){ return SfgPasswordEncoderFactories.createDelegatingPasswordEncoder(); } - // @Override - // protected void configure(AuthenticationManagerBuilder auth) throws Exception { - // auth.userDetailsService(this.jpaUserDetailsService).passwordEncoder(passwordEncoder()); - -// auth.inMemoryAuthentication() -// .withUser("spring") -// .password("{bcrypt}$2a$10$7tYAvVL2/KwcQTcQywHIleKueg4ZK7y7d44hKyngjTwHCDlesxdla") -// .roles("ADMIN") -// .and() -// .withUser("user") -// .password("{sha256}1296cefceb47413d3fb91ac7586a4625c33937b4d3109f5a4dd96c79c46193a029db713b96006ded") -// .roles("USER"); -// -// auth.inMemoryAuthentication().withUser("scott").password("{bcrypt15}$2a$15$baOmQtw8UqWZRDQhMFPFj.xhkkWveCTQHe4OBdr8yw8QshejiSbI6").roles("CUSTOMER"); - // } - - // @Override -// @Bean -// protected UserDetailsService userDetailsService() { -// UserDetails admin = User.withDefaultPasswordEncoder() -// .username("spring") -// .password("guru") -// .roles("ADMIN") -// .build(); -// -// UserDetails user = User.withDefaultPasswordEncoder() -// .username("user") -// .password("password") -// .roles("USER") -// .build(); -// -// return new InMemoryUserDetailsManager(admin, user); -// } - - - - - - - - - - - - - - } diff --git a/src/main/java/guru/sfg/brewery/domain/BaseEntity.java b/src/main/java/guru/sfg/brewery/domain/BaseEntity.java index 5c59957cd..538a9fb22 100644 --- a/src/main/java/guru/sfg/brewery/domain/BaseEntity.java +++ b/src/main/java/guru/sfg/brewery/domain/BaseEntity.java @@ -16,22 +16,20 @@ */ package guru.sfg.brewery.domain; +import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; import org.hibernate.annotations.UpdateTimestamp; -import javax.persistence.*; import java.sql.Timestamp; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ - @Setter @Getter @NoArgsConstructor @@ -51,7 +49,6 @@ public BaseEntity(UUID id, Long version, Timestamp createdDate, Timestamp lastMo name = "UUID", strategy = "org.hibernate.id.UUIDGenerator" ) - @Type(type="org.hibernate.type.UUIDCharType") @Column(length = 36, columnDefinition = "varchar", updatable = false, nullable = false ) private UUID id; diff --git a/src/main/java/guru/sfg/brewery/domain/Beer.java b/src/main/java/guru/sfg/brewery/domain/Beer.java index 8a5fff3d1..d36fe5451 100644 --- a/src/main/java/guru/sfg/brewery/domain/Beer.java +++ b/src/main/java/guru/sfg/brewery/domain/Beer.java @@ -24,10 +24,10 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.OneToMany; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.OneToMany; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.HashSet; @@ -35,7 +35,7 @@ import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ @Getter @Setter diff --git a/src/main/java/guru/sfg/brewery/domain/BeerInventory.java b/src/main/java/guru/sfg/brewery/domain/BeerInventory.java index cc65f16e0..c09b0172e 100644 --- a/src/main/java/guru/sfg/brewery/domain/BeerInventory.java +++ b/src/main/java/guru/sfg/brewery/domain/BeerInventory.java @@ -21,13 +21,13 @@ import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; import java.sql.Timestamp; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ @Getter @Setter diff --git a/src/main/java/guru/sfg/brewery/domain/BeerOrder.java b/src/main/java/guru/sfg/brewery/domain/BeerOrder.java index 900472c82..16d700ac9 100644 --- a/src/main/java/guru/sfg/brewery/domain/BeerOrder.java +++ b/src/main/java/guru/sfg/brewery/domain/BeerOrder.java @@ -23,16 +23,16 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import java.sql.Timestamp; import java.util.Set; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ @Getter @Setter diff --git a/src/main/java/guru/sfg/brewery/domain/BeerOrderLine.java b/src/main/java/guru/sfg/brewery/domain/BeerOrderLine.java index 0d4b2fc3e..5dc26efbc 100644 --- a/src/main/java/guru/sfg/brewery/domain/BeerOrderLine.java +++ b/src/main/java/guru/sfg/brewery/domain/BeerOrderLine.java @@ -21,13 +21,13 @@ import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; +import jakarta.persistence.Entity; +import jakarta.persistence.ManyToOne; import java.sql.Timestamp; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ @Getter @Setter diff --git a/src/main/java/guru/sfg/brewery/domain/Brewery.java b/src/main/java/guru/sfg/brewery/domain/Brewery.java index 741ea2677..c0fc7b77c 100644 --- a/src/main/java/guru/sfg/brewery/domain/Brewery.java +++ b/src/main/java/guru/sfg/brewery/domain/Brewery.java @@ -21,12 +21,12 @@ import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.Entity; +import jakarta.persistence.Entity; import java.sql.Timestamp; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ @Getter @Setter diff --git a/src/main/java/guru/sfg/brewery/domain/Customer.java b/src/main/java/guru/sfg/brewery/domain/Customer.java index bd3c7a40f..6623869cb 100644 --- a/src/main/java/guru/sfg/brewery/domain/Customer.java +++ b/src/main/java/guru/sfg/brewery/domain/Customer.java @@ -21,15 +21,15 @@ import lombok.NoArgsConstructor; import lombok.Setter; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.OneToMany; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.OneToMany; import java.sql.Timestamp; import java.util.Set; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ @Getter @Setter diff --git a/src/main/java/guru/sfg/brewery/domain/security/Authority.java b/src/main/java/guru/sfg/brewery/domain/security/Authority.java index be48d03e3..395018b0b 100644 --- a/src/main/java/guru/sfg/brewery/domain/security/Authority.java +++ b/src/main/java/guru/sfg/brewery/domain/security/Authority.java @@ -2,11 +2,11 @@ import lombok.*; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Set; /** - * Created by jt on 6/21/20. + * Modified by Pierrot on 2023-01-22. */ @Setter @Getter diff --git a/src/main/java/guru/sfg/brewery/domain/security/User.java b/src/main/java/guru/sfg/brewery/domain/security/User.java index 47e409a97..c02ec8c0b 100644 --- a/src/main/java/guru/sfg/brewery/domain/security/User.java +++ b/src/main/java/guru/sfg/brewery/domain/security/User.java @@ -2,11 +2,11 @@ import lombok.*; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.Set; /** - * Created by jt on 6/21/20. + * Modified by Pierrot on 2023-01-22. */ @Setter @Getter @@ -14,6 +14,7 @@ @NoArgsConstructor @Builder @Entity +@Table(name="BEER_USER") public class User { @Id diff --git a/src/main/java/guru/sfg/brewery/repositories/BeerOrderRepository.java b/src/main/java/guru/sfg/brewery/repositories/BeerOrderRepository.java index 80fd28c07..1bc6c07a2 100644 --- a/src/main/java/guru/sfg/brewery/repositories/BeerOrderRepository.java +++ b/src/main/java/guru/sfg/brewery/repositories/BeerOrderRepository.java @@ -24,12 +24,12 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; -import javax.persistence.LockModeType; +import jakarta.persistence.LockModeType; import java.util.List; import java.util.UUID; /** - * Created by jt on 2019-01-26. + * Modified by Pierrot on 2023-01-22. */ public interface BeerOrderRepository extends JpaRepository { diff --git a/src/main/java/guru/sfg/brewery/security/JpaUserDetailsService.java b/src/main/java/guru/sfg/brewery/security/JpaUserDetailsService.java index 2b719f774..127734471 100644 --- a/src/main/java/guru/sfg/brewery/security/JpaUserDetailsService.java +++ b/src/main/java/guru/sfg/brewery/security/JpaUserDetailsService.java @@ -12,6 +12,7 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import java.util.Collection; import java.util.HashSet; @@ -19,7 +20,7 @@ import java.util.stream.Collectors; /** - * Created by jt on 6/22/20. + * Modified by Pierrot on 2023-01-22. */ @Slf4j @RequiredArgsConstructor @@ -34,9 +35,8 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx log.debug("Getting User info via JPA"); - User user = userRepository.findByUsername(username).orElseThrow(() -> { - return new UsernameNotFoundException("User name: " + username + " not found"); - }); + User user = userRepository.findByUsername(username).orElseThrow(() -> + new UsernameNotFoundException("User name: " + username + " not found")); return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getEnabled(), user.getAccountNonExpired(), user.getCredentialsNonExpired(), @@ -44,7 +44,7 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx } private Collection convertToSpringAuthorities(Set authorities) { - if (authorities != null && authorities.size() > 0){ + if (CollectionUtils.isEmpty(authorities)){ return authorities.stream() .map(Authority::getRole) .map(SimpleGrantedAuthority::new) diff --git a/src/main/java/guru/sfg/brewery/web/controllers/BeerController.java b/src/main/java/guru/sfg/brewery/web/controllers/BeerController.java index ee5d9cdd5..347d717d9 100644 --- a/src/main/java/guru/sfg/brewery/web/controllers/BeerController.java +++ b/src/main/java/guru/sfg/brewery/web/controllers/BeerController.java @@ -19,8 +19,8 @@ import guru.sfg.brewery.domain.Beer; -import guru.sfg.brewery.repositories.BeerInventoryRepository; import guru.sfg.brewery.repositories.BeerRepository; +import guru.sfg.brewery.web.model.BeerStyleEnum; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -34,7 +34,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.List; import java.util.UUID; @@ -45,7 +45,6 @@ public class BeerController { private final BeerRepository beerRepository; - private final BeerInventoryRepository beerInventoryRepository; @RequestMapping("/find") @@ -88,6 +87,7 @@ public ModelAndView showBeer(@PathVariable UUID beerId) { @GetMapping("/new") public String initCreationForm(Model model) { model.addAttribute("beer", Beer.builder().build()); + model.addAttribute("beerStyle", BeerStyleEnum.values()); return "beers/createBeer"; } @@ -109,8 +109,11 @@ public String processCreationForm(Beer beer) { @GetMapping("/{beerId}/edit") public String initUpdateBeerForm(@PathVariable UUID beerId, Model model) { - if (beerRepository.findById(beerId).isPresent()) + if (beerRepository.findById(beerId).isPresent()) { model.addAttribute("beer", beerRepository.findById(beerId).get()); + model.addAttribute("beerStyle", BeerStyleEnum.values()); + } + return "beers/createOrUpdateBeer"; } diff --git a/src/main/java/guru/sfg/brewery/web/controllers/CustomerController.java b/src/main/java/guru/sfg/brewery/web/controllers/CustomerController.java index 06fef9090..a71e1d309 100644 --- a/src/main/java/guru/sfg/brewery/web/controllers/CustomerController.java +++ b/src/main/java/guru/sfg/brewery/web/controllers/CustomerController.java @@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.List; import java.util.UUID; diff --git a/src/main/java/guru/sfg/brewery/web/controllers/api/BeerRestController.java b/src/main/java/guru/sfg/brewery/web/controllers/api/BeerRestController.java index 057ff9a81..871bf38f4 100644 --- a/src/main/java/guru/sfg/brewery/web/controllers/api/BeerRestController.java +++ b/src/main/java/guru/sfg/brewery/web/controllers/api/BeerRestController.java @@ -29,12 +29,15 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.validation.ConstraintViolationException; -import javax.validation.Valid; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Valid; import java.util.ArrayList; import java.util.List; import java.util.UUID; +/** + * Modified by Pierrot on 2023-01-22. + */ @Slf4j @RequiredArgsConstructor @RequestMapping("/api/v1/") diff --git a/src/main/resources/templates/beers/createBeer.html b/src/main/resources/templates/beers/createBeer.html index 439387b13..889b32c61 100644 --- a/src/main/resources/templates/beers/createBeer.html +++ b/src/main/resources/templates/beers/createBeer.html @@ -13,7 +13,7 @@

+ th:replace="~{fragments/selectField :: select ('Style', 'beerStyle', ${beerStyle})}" /> + th:replace="~{fragments/selectField :: select ('Style', 'beerStyle', ${beerStyle})}" /> -
  • +
  • Home
  • -
  • +
  • Find Customer
  • -
  • +
  • Find Beer
  • -
  • +
  • Breweries
  • @@ -71,7 +71,7 @@
    - +

    diff --git a/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java b/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java index f5000e7bc..2a67537d5 100644 --- a/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java +++ b/src/test/java/guru/sfg/brewery/web/controllers/BaseIT.java @@ -7,20 +7,22 @@ import guru.sfg.brewery.services.BreweryService; import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.h2.H2ConsoleProperties; +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 org.springframework.context.annotation.Import; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; /** - * Created by jt on 6/13/20. + * Modified by Pierrot on 2023-01-22. */ +@SpringBootTest +@AutoConfigureMockMvc +@Import({H2ConsoleProperties.class}) public abstract class BaseIT { - @Autowired - WebApplicationContext wac; + @Autowired protected MockMvc mockMvc; @MockBean @@ -40,9 +42,6 @@ public abstract class BaseIT { @BeforeEach public void setup() { - mockMvc = MockMvcBuilders - .webAppContextSetup(wac) - .apply(springSecurity()) - .build(); + } } diff --git a/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java b/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java index b13ec5437..abe81808d 100644 --- a/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java +++ b/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerIT.java @@ -1,7 +1,6 @@ package guru.sfg.brewery.web.controllers; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.anonymous; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; @@ -9,10 +8,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; /** - * Created by jt on 6/12/20. + * Modified by Pierrot on 2023-01-22. */ -@SpringBootTest -public class BeerControllerIT extends BaseIT{ +class BeerControllerIT extends BaseIT{ @Test void initCreationFormWithSpring() throws Exception { diff --git a/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerTest.java b/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerTest.java index 0efa7484d..ca7153e8f 100644 --- a/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerTest.java +++ b/src/test/java/guru/sfg/brewery/web/controllers/BeerControllerTest.java @@ -17,21 +17,23 @@ package guru.sfg.brewery.web.controllers; +import guru.sfg.brewery.config.SecurityConfig; import guru.sfg.brewery.domain.Beer; import guru.sfg.brewery.repositories.BeerRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentMatchers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.h2.H2ConsoleProperties; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; import java.util.ArrayList; import java.util.List; @@ -45,34 +47,36 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -@ExtendWith(MockitoExtension.class) + +/** + * Modified by Pierrot on 2023-01-22. + */ +@WebMvcTest(BeerController.class) +@Import({SecurityConfig.class, H2ConsoleProperties.class}) class BeerControllerTest { - @Mock + @MockBean BeerRepository beerRepository; - @InjectMocks - BeerController controller; + @Autowired + MockMvc mockMvc; + List beerList; UUID uuid; Beer beer; - MockMvc mockMvc; Page beers; Page pagedResponse; @BeforeEach void setUp() { - beerList = new ArrayList(); + beerList = new ArrayList<>(); beerList.add(Beer.builder().build()); beerList.add(Beer.builder().build()); - pagedResponse = new PageImpl(beerList); + pagedResponse = new PageImpl<>(beerList); final String id = "493410b3-dd0b-4b78-97bf-289f50f6e74f"; uuid = UUID.fromString(id); - mockMvc = MockMvcBuilders - .standaloneSetup(controller) - .build(); } @Test @@ -81,7 +85,7 @@ void findBeers() throws Exception{ .andExpect(status().isOk()) .andExpect(view().name("beers/findBeers")) .andExpect(model().attributeExists("beer")); - verifyZeroInteractions(beerRepository); + verifyNoMoreInteractions(beerRepository); } //ToDO: Mocking Page @@ -96,6 +100,7 @@ void processFindFormReturnMany() throws Exception{ @Test + @WithMockUser(username = "MockUser",password = "MockPWD") void showBeer() throws Exception{ when(beerRepository.findById(uuid)).thenReturn(Optional.of(Beer.builder().id(uuid).build())); @@ -106,43 +111,46 @@ void showBeer() throws Exception{ } @Test + @WithMockUser(username = "MockUser",password = "MockPWD") void initCreationForm() throws Exception { mockMvc.perform(get("/beers/new")) .andExpect(status().isOk()) .andExpect(view().name("beers/createBeer")) - .andExpect(model().attributeExists("beer")); - verifyZeroInteractions(beerRepository); + .andExpect(model().attributeExists("beer")) + .andExpect(model().attributeExists("beerStyle")); + verifyNoMoreInteractions(beerRepository); } @Test + @WithMockUser(username = "MockUser",password = "MockPWD") void processCreationForm() throws Exception { when(beerRepository.save(ArgumentMatchers.any())).thenReturn(Beer.builder().id(uuid).build()); mockMvc.perform(post("/beers/new")) .andExpect(status().is3xxRedirection()) - .andExpect(view().name("redirect:/beers/"+ uuid)) - .andExpect(model().attributeExists("beer")); + .andExpect(view().name("redirect:/beers/"+ uuid)); verify(beerRepository).save(ArgumentMatchers.any()); } @Test + @WithMockUser(username = "MockUser",password = "MockPWD") void initUpdateBeerForm() throws Exception{ when(beerRepository.findById(uuid)).thenReturn(Optional.of(Beer.builder().id(uuid).build())); mockMvc.perform(get("/beers/"+uuid+"/edit")) .andExpect(status().isOk()) .andExpect(view().name("beers/createOrUpdateBeer")) - .andExpect(model().attributeExists("beer")); - verifyZeroInteractions(beerRepository); + .andExpect(model().attributeExists("beer")) + .andExpect(model().attributeExists("beerStyle")); + verify(beerRepository,atMost(2)).findById(any()); } @Test + @WithMockUser(username = "MockUser",password = "MockPWD") void processUpdationForm() throws Exception { when(beerRepository.save(ArgumentMatchers.any())).thenReturn(Beer.builder().id(uuid).build()); mockMvc.perform(post("/beers/"+uuid+"/edit")) .andExpect(status().is3xxRedirection()) - .andExpect(view().name("redirect:/beers/"+uuid)) - .andExpect(model().attributeExists("beer")); - + .andExpect(view().name("redirect:/beers/"+uuid)); verify(beerRepository).save(ArgumentMatchers.any()); } } \ No newline at end of file diff --git a/src/test/java/guru/sfg/brewery/web/controllers/CustomerControllerTest.java b/src/test/java/guru/sfg/brewery/web/controllers/CustomerControllerTest.java index 24b79a062..1bf869b78 100644 --- a/src/test/java/guru/sfg/brewery/web/controllers/CustomerControllerTest.java +++ b/src/test/java/guru/sfg/brewery/web/controllers/CustomerControllerTest.java @@ -57,7 +57,7 @@ class CustomerControllerTest { @BeforeEach void setUp() { - customerList = new ArrayList(); + customerList = new ArrayList<>(); customerList.add(Customer.builder().customerName("John Doe").build()); customerList.add(Customer.builder().customerName("John Doe").build()); @@ -75,11 +75,11 @@ void findCustomers() throws Exception{ .andExpect(status().isOk()) .andExpect(view().name("customers/findCustomers")) .andExpect(model().attributeExists("customer")); - verifyZeroInteractions(customerRepository); + verifyNoMoreInteractions(customerRepository); } //ToDO: Fix stubbing error @Test - @Disabled + @Disabled("Fix stubbing error") void processFindFormReturnMany() throws Exception{ when(customerRepository.findAllByCustomerNameLike("John Doe")).thenReturn(customerList); @@ -104,7 +104,7 @@ void initCreationForm() throws Exception{ .andExpect(status().isOk()) .andExpect(view().name("customers/createCustomer")) .andExpect(model().attributeExists("customer")); - verifyZeroInteractions(customerRepository); + verifyNoMoreInteractions(customerRepository); } @Test @@ -112,8 +112,10 @@ void processCreationForm() throws Exception{ when(customerRepository.save(ArgumentMatchers.any())).thenReturn(Customer.builder().id(uuid).build()); mockMvc.perform(post("/customers/new")) .andExpect(status().is3xxRedirection()) - .andExpect(view().name("redirect:/customers/"+ uuid)) - .andExpect(model().attributeExists("customer")); + .andExpect(view().name("redirect:/customers/"+ uuid)); +// Passes with previous SB Versions +// Doesn't work anymore in SB3.0.1 since the Model should be explicitly set in the Controller !!!! +// .andExpect(model().attributeExists("customer")); verify(customerRepository).save(ArgumentMatchers.any()); } @@ -124,7 +126,7 @@ void initUpdateCustomerForm() throws Exception{ .andExpect(status().isOk()) .andExpect(view().name("customers/createOrUpdateCustomer")) .andExpect(model().attributeExists("customer")); - verifyZeroInteractions(customerRepository); + verifyNoMoreInteractions(customerRepository); } @Test @@ -133,8 +135,10 @@ void processUpdationForm() throws Exception{ mockMvc.perform(post("/customers/"+uuid+"/edit")) .andExpect(status().is3xxRedirection()) - .andExpect(view().name("redirect:/customers/"+uuid)) - .andExpect(model().attributeExists("customer")); + .andExpect(view().name("redirect:/customers/"+uuid)); +// Passes with previous SB Versions +// Doesn't work anymore in SB3.0.1 since the Model should be explicitly set in the Controller !!!! +// .andExpect(model().attributeExists("customer")); verify(customerRepository).save(ArgumentMatchers.any()); } diff --git a/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java b/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java index 5140c3acb..ecf36b317 100644 --- a/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java +++ b/src/test/java/guru/sfg/brewery/web/controllers/IndexControllerIT.java @@ -1,15 +1,13 @@ package guru.sfg.brewery.web.controllers; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** - * Created by jt on 6/13/20. + * Modified by Pierrot on 2023-01-22. */ -@WebMvcTest public class IndexControllerIT extends BaseIT { @Test diff --git a/src/test/java/guru/sfg/brewery/web/controllers/api/BeerRestControllerIT.java b/src/test/java/guru/sfg/brewery/web/controllers/api/BeerRestControllerIT.java index 10d4ab40f..6d9bc0666 100644 --- a/src/test/java/guru/sfg/brewery/web/controllers/api/BeerRestControllerIT.java +++ b/src/test/java/guru/sfg/brewery/web/controllers/api/BeerRestControllerIT.java @@ -2,7 +2,6 @@ import guru.sfg.brewery.web.controllers.BaseIT; import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; @@ -10,9 +9,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** - * Created by jt on 6/13/20. + * Modified by Pierrot on 2023-01-22. */ -@SpringBootTest public class BeerRestControllerIT extends BaseIT { @Test @@ -30,7 +28,7 @@ void deleteBeerNoAuth() throws Exception{ @Test void findBeers() throws Exception{ - mockMvc.perform(get("/api/v1/beer/")) + mockMvc.perform(get("/api/v1/beer")) .andExpect(status().isOk()); }