From 954d739f43bfbd6fe901d565b41d13447124c71d Mon Sep 17 00:00:00 2001 From: Ahmad Arslan <arslan0157@gmail.com> Date: Tue, 7 Jun 2022 01:16:00 +0200 Subject: [PATCH] Added the suggested changes in the comments of the assignment. --- src/main/docker/sonar/docker-compose.yml | 4 +- .../java/de/rwth/swc/sqa/Application.java | 37 +---- .../java/de/rwth/swc/sqa/DataService.java | 139 +----------------- .../rwth/swc/sqa/api/CustomerController.java | 70 ++++----- .../de/rwth/swc/sqa/api/TicketController.java | 15 +- .../java/de/rwth/swc/sqa/CustomerTest.java | 44 +++--- src/test/java/de/rwth/swc/sqa/TicketTest.java | 104 +++---------- 7 files changed, 87 insertions(+), 326 deletions(-) diff --git a/src/main/docker/sonar/docker-compose.yml b/src/main/docker/sonar/docker-compose.yml index ae41491..f3a5892 100644 --- a/src/main/docker/sonar/docker-compose.yml +++ b/src/main/docker/sonar/docker-compose.yml @@ -2,9 +2,11 @@ version: "3" services: sonarqube: image: sonarqube:community + platform: linux/amd64 depends_on: - db environment: + SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar SONAR_JDBC_USERNAME: sonar SONAR_JDBC_PASSWORD: sonar @@ -28,4 +30,4 @@ volumes: sonarqube_extensions: sonarqube_logs: postgresql: - postgresql_data: \ No newline at end of file + postgresql_data: diff --git a/src/main/java/de/rwth/swc/sqa/Application.java b/src/main/java/de/rwth/swc/sqa/Application.java index 368ce1e..a4d9ff0 100644 --- a/src/main/java/de/rwth/swc/sqa/Application.java +++ b/src/main/java/de/rwth/swc/sqa/Application.java @@ -1,44 +1,11 @@ package de.rwth.swc.sqa; -import de.rwth.swc.sqa.model.Customer; -import de.rwth.swc.sqa.model.DiscountCard; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; -import java.util.ArrayList; -import java.util.List; - -@Slf4j @SpringBootApplication public class Application { - - public static void main(String[] args) {SpringApplication.run(Application.class, args);} - - /* - @Bean - CommandLineRunner run(DataService dataService) { - return args -> { - Customer customer=new Customer(); - customer.setId((long) Math.random()); - customer.setBirthdate(String.valueOf(Math.random())); - dataService.saveCustomer(customer); - List<DiscountCard> discountCards= new ArrayList<>(); - DiscountCard discountCard= new DiscountCard(); - discountCard.setId((long) Math.random()); - discountCard.setCustomerId(customer.getId()); - discountCards.add(discountCard); - dataService.saveDiscountCardToCustomer(customer.getId(), discountCards); - - - - }; + public static void main(String[] args) { + SpringApplication.run(Application.class, args); } - - */ - - - } diff --git a/src/main/java/de/rwth/swc/sqa/DataService.java b/src/main/java/de/rwth/swc/sqa/DataService.java index 81d8c6c..7de0f65 100644 --- a/src/main/java/de/rwth/swc/sqa/DataService.java +++ b/src/main/java/de/rwth/swc/sqa/DataService.java @@ -5,148 +5,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import com.fasterxml.jackson.annotation.JsonSetter; import de.rwth.swc.sqa.model.Customer; import de.rwth.swc.sqa.model.DiscountCard; import de.rwth.swc.sqa.model.Ticket; -import de.rwth.swc.sqa.model.TicketValidationRequest; -import lombok.Data; -import org.springframework.boot.CommandLineRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.stereotype.Service; -import static de.rwth.swc.sqa.model.Ticket.ValidForEnum.*; - -@Service public class DataService { - public static List<Customer> customerList = new ArrayList<Customer>(); + public static List<Customer> customerList = new ArrayList<Customer>(); public static Map<Long, List<DiscountCard>> discountCardMap = new HashMap<Long, List<DiscountCard>>(); - public static List<Ticket> ticketList = new ArrayList<Ticket>(); - - public void saveCustomer(Customer customer){ - customerList.add(customer); - } - - public void saveDiscountCardToCustomer(Long customer_id, List<DiscountCard> discountCard){ - discountCardMap.put(customer_id,discountCard); - } - - //check restirctions given in the pdf file - - //1.Check if the bought ticket can be applied for the customer - public static boolean ticketIsValidForTheCustomerAge(Customer customer, Ticket ticket){ - boolean isValid=false; - //if customer is a senior - if(DataService.customerIsSenior(customer)){ - if(ticket.getValidFor().getValue().equals("1d") || ticket.getValidFor().getValue().equals("30d") || ticket.getValidFor().getValue().equals("1y")){ - if(ticket.getStudent()==false){ - isValid=true; - } - return isValid; - - } - - //if customer is a student - //it does not matter if it`s not a student since he is still an adult and can buy an adult ticket - }else if (DataService.customerIsStudent(customer)){ - - if (ticket.getValidFor().getValue().equals("30d") || ticket.getValidFor().getValue().equals("1y")) { - isValid = true; - return isValid; - } - - - }else if (DataService.customerIsChild(customer)){ - if((ticket.getValidFor().getValue().equals("1h") || ticket.getValidFor().getValue().equals("30d") || ticket.getValidFor().getValue().equals("1y") )){ - if(ticket.getStudent()==false){ - isValid=true; - } - return isValid; - } - - }else if (DataService.customerIsAdult(customer)){ - if(ticket.getStudent()==false){ - isValid=true; - return isValid; - } - } - return isValid; - } - - public static boolean discountCanBeAppliedOnTheTicket(Ticket ticket){ - boolean applyDiscount=false; - if(ticket.getValidFor().getValue().equals("30d") || ticket.getValidFor().getValue().equals("1y")){ - if(ticket.getDiscountCard()==true){ - applyDiscount=true; - } - } - return applyDiscount; - } - - //check if the discountCard can be applied for the requested ticket - public static boolean discountCanBeApplied(DiscountCard discountCard, TicketValidationRequest ticketValidationRequest){ - boolean applyDiscount=false; - if(discountCard.getId().equals(ticketValidationRequest.getDiscountCardId())){ - if(ticketValidationRequest.getDisabled()){ - //if(ticketValidationRequest.get.getValue().equals("30d")|| ticketValidationRequest.getZone().getValue().equals("1y")){ - //apply type 25 and 50 - applyDiscount=true; - } - } - - return applyDiscount; - } - - - //customer is senior - //Senior >60 - //born before 1962 - public static boolean customerIsSenior(Customer customer){ - boolean isSenior= false; - //senior customer - if(Integer.valueOf(customer.getBirthdate().substring(0,4)) <= 1962 ){ - isSenior=true; - } - - return isSenior; - } - - - //customer is a child <14 - //born before 2008 - public static boolean customerIsChild(Customer customer){ - boolean isChild= false; - if(Integer.valueOf(customer.getBirthdate().substring(0,4)) >= 2008 ){ - isChild=true; - } - - return isChild; - } - - - //Student <28 - //born after 1994 - public static boolean customerIsStudent(Customer customer){ - boolean isStudent= false; - if(Integer.valueOf(customer.getBirthdate().substring(0,4)) >= 1994 && !customerIsChild(customer) ){ - isStudent=true; - } - - return isStudent; - } - - //Adult is not a child - //after 2008 - public static boolean customerIsAdult(Customer customer){ - boolean isAdult = false; - if(customerIsChild(customer)==false){ - isAdult=true; - } - return isAdult; - } - - - - + } diff --git a/src/main/java/de/rwth/swc/sqa/api/CustomerController.java b/src/main/java/de/rwth/swc/sqa/api/CustomerController.java index 3ba263e..2f683ef 100644 --- a/src/main/java/de/rwth/swc/sqa/api/CustomerController.java +++ b/src/main/java/de/rwth/swc/sqa/api/CustomerController.java @@ -24,68 +24,60 @@ import io.swagger.annotations.ApiParam; @Controller @RequestMapping("/customers") public class CustomerController implements CustomersApi{ + + @PostMapping("") public ResponseEntity<Customer> addCustomer(@ApiParam(value = "Customer object that should be added",required = true) @Valid @RequestBody Customer body) { - //id and birthday should not be empty - if(body.getId()!=null || body.getBirthdate().equals("") ) { + if(body.getId()!=null || body.getBirthdate().equals("") ) { return ResponseEntity.status(400).body(null); }else if(body.getDisabled()==null) { body.setDisabled(false); } - //set a random Id for the new customer to be added body.setId(System.currentTimeMillis()); - //save customer to the list of existing customers DataService.customerList.add(body); return ResponseEntity.status(201).body(body); } @PostMapping("/{customerId}/discountcards") public ResponseEntity<DiscountCard> addDiscountCardToCustomer(@ApiParam(value = "ID of customer",required = true) @PathVariable("customerId") Long customerId, @ApiParam(value = "DiscountCard object that needs to be added to the customer",required = true) @RequestBody @Valid DiscountCard body) { - //check if discount card id exists - if(body.getId()==null) { + if(body.getId()==null) { return ResponseEntity.status(400).body(null); - } - boolean exists = false; - //check if customer is already found in the customer list based on its id - for(Customer customer: DataService.customerList) { - if(customer.getId().longValue()==customerId.longValue()) { - exists = true; - } - } - if(exists==false) { + } + boolean exists = false; + for(Customer customer: DataService.customerList) { + if(customer.getId().longValue()==customerId.longValue()) { + exists = true; + } + } + if(!exists) { return ResponseEntity.status(404).body(null); - } - - boolean conflict=false; - if( DataService.discountCardMap.containsKey(customerId)) { - List<DiscountCard> discountCardList = DataService.discountCardMap.get(customerId); - for(DiscountCard card:discountCardList) { + } + boolean conflict=false; + if( DataService.discountCardMap.containsKey(customerId)) { + List<DiscountCard> discountCardList = DataService.discountCardMap.get(customerId); + for(DiscountCard card:discountCardList) { - if(card.getValidFrom().equals(body.getValidFrom())) { - conflict = true; - } - } - if(conflict==true) { - return ResponseEntity.status(409).body(null); - }else { - discountCardList.add(body); + if(card.getValidFrom().equals(body.getValidFrom())) { + conflict = true; } - - - }else { - - List<DiscountCard> discountCardList = new ArrayList<DiscountCard>(); + } + if(conflict) { + return ResponseEntity.status(409).body(null); + }else { discountCardList.add(body); - DataService.discountCardMap.put(customerId, discountCardList); - } + } + }else { + List<DiscountCard> discountCardList = new ArrayList<DiscountCard>(); + discountCardList.add(body); + DataService.discountCardMap.put(customerId, discountCardList); + } return ResponseEntity.status(201).body(body); } @GetMapping("/{customerId}/discountcards") public ResponseEntity<List<DiscountCard>> getCustomerDiscountCards(@ApiParam(value = "ID of customer to search for discount cards",required = true) @PathVariable("customerId") Long customerId) { - //if customer id is not valid => customer id is null - if(customerId==null) { + if(customerId.longValue()==0) { return ResponseEntity.status(400).body(null); } boolean exists = false; @@ -94,7 +86,7 @@ public class CustomerController implements CustomersApi{ exists = true; } } - if(exists==false) { + if(!exists) { return ResponseEntity.status(404).body(null); } return ResponseEntity.ok().body( DataService.discountCardMap.get(customerId)); diff --git a/src/main/java/de/rwth/swc/sqa/api/TicketController.java b/src/main/java/de/rwth/swc/sqa/api/TicketController.java index cdc5ad3..e2e9f39 100644 --- a/src/main/java/de/rwth/swc/sqa/api/TicketController.java +++ b/src/main/java/de/rwth/swc/sqa/api/TicketController.java @@ -5,7 +5,6 @@ import java.util.List; import javax.validation.Valid; -import de.rwth.swc.sqa.model.Customer; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; @@ -25,7 +24,6 @@ public class TicketController implements TicketsApi{ @PostMapping("") public ResponseEntity<Ticket> buyTicket(@ApiParam(value = "TicketRequest object" ,required=true ) @Valid @RequestBody TicketRequest body) { try { - // create Ticket Ticket ticket = new Ticket(); ticket.setId(System.currentTimeMillis()); ticket.setBirthdate(body.getBirthdate()); @@ -36,17 +34,8 @@ public class TicketController implements TicketsApi{ ticket.setValidFor(Ticket.ValidForEnum.fromValue(body.getValidFor().getValue())); ticket.setValidFrom(body.getValidFrom()); ticket.setZone(Ticket.ZoneEnum.fromValue(body.getZone().getValue())); - - Customer customer=new Customer(); - customer.setBirthdate(body.getBirthdate()); - - - //check if ticket is valid for the given inputs and customer is allowed to buy it - if(DataService.ticketIsValidForTheCustomerAge(customer,ticket)){ - DataService.ticketList.add(ticket); - return ResponseEntity.ok().body(ticket); - } - return ResponseEntity.status(400).body(null); + DataService.ticketList.add(ticket); + return ResponseEntity.ok().body(ticket); }catch (Exception e) { e.printStackTrace(); return ResponseEntity.status(400).body(null); diff --git a/src/test/java/de/rwth/swc/sqa/CustomerTest.java b/src/test/java/de/rwth/swc/sqa/CustomerTest.java index 7f2ba1a..1cfd3c7 100644 --- a/src/test/java/de/rwth/swc/sqa/CustomerTest.java +++ b/src/test/java/de/rwth/swc/sqa/CustomerTest.java @@ -3,7 +3,9 @@ package de.rwth.swc.sqa; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -14,12 +16,15 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; +import de.rwth.swc.sqa.model.Customer; import de.rwth.swc.sqa.model.DiscountCard; import io.restassured.RestAssured; +import io.restassured.response.ValidatableResponse; @SpringBootTest(webEnvironment = RANDOM_PORT) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class CustomerTest { + private static List<Customer> customerList = new ArrayList<Customer>(); @LocalServerPort int serverPort; @@ -39,27 +44,29 @@ public class CustomerTest { parms1.put("disabled", true); RestAssured.given().header("content-Type", "application/json").and() .body(parms1).when().post("/customers").then().statusCode(400); - - //200 + //201 Map<String, Object> parms = new HashMap<String, Object>(); parms.put("birthdate", "2000-01-01"); parms.put("disabled", false); - RestAssured.given().header("content-Type", "application/json").and() + ValidatableResponse response = RestAssured.given().header("content-Type", "application/json").and() .body(parms).when().post("/customers").then().statusCode(201); - + Customer customer = response.extract().as(Customer.class); + customerList.add(customer); + Map<String, Object> parms3 = new HashMap<String, Object>(); parms3.put("birthdate", "2001-01-01"); parms3.put("disabled", false); - RestAssured.given().header("content-Type", "application/json").and() + response = RestAssured.given().header("content-Type", "application/json").and() .body(parms).when().post("/customers").then().statusCode(201); - + customer = response.extract().as(Customer.class); + customerList.add(customer); } @Test @Order(2) public void addDiscountCardToCustomerTest() { - Long customerId =null; + Long customerId =0L; String path = "/customers/"+customerId+"/discountcards"; Map<String, Object> parms = new HashMap<String, Object>(); //404 @@ -75,7 +82,7 @@ public class CustomerTest { .body(parms).when().post(path).then().statusCode(404); //400 - customerId = DataService.customerList.get(0).getId(); + customerId = customerList.get(0).getId(); path = "/customers/"+customerId+"/discountcards"; parms.clear(); parms.put("customerId", customerId); @@ -87,7 +94,7 @@ public class CustomerTest { //201 - customerId = DataService.customerList.get(0).getId(); + customerId = customerList.get(0).getId(); path = "/customers/"+customerId+"/discountcards"; parms.clear(); parms.put("customerId", customerId); @@ -99,7 +106,7 @@ public class CustomerTest { .body(parms).when().post(path).then().statusCode(201); //409 repeat conflict - customerId = DataService.customerList.get(0).getId(); + customerId = customerList.get(0).getId(); path = "/customers/"+customerId+"/discountcards"; parms.clear(); parms.put("customerId", customerId); @@ -117,7 +124,7 @@ public class CustomerTest { @Test @Order(3) public void getCustomerDiscountCardTest() { - Long customerId=null; + Long customerId =0L; String path = "/customers/"+customerId+"/discountcards"; //400 path = "/customers/"+customerId+"/discountcards"; @@ -128,21 +135,16 @@ public class CustomerTest { path = "/customers/"+customerId+"/discountcards"; RestAssured.given().when().get(path).then().statusCode(404); - - //200 - customerId = DataService.customerList.get(0).getId(); + + + //201 + customerId = customerList.get(0).getId(); path = "/customers/"+customerId+"/discountcards"; RestAssured.given().when().get(path).then().statusCode(200); - } - - - - - - + } } diff --git a/src/test/java/de/rwth/swc/sqa/TicketTest.java b/src/test/java/de/rwth/swc/sqa/TicketTest.java index d430f1b..126e36f 100644 --- a/src/test/java/de/rwth/swc/sqa/TicketTest.java +++ b/src/test/java/de/rwth/swc/sqa/TicketTest.java @@ -3,7 +3,9 @@ package de.rwth.swc.sqa; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -14,11 +16,14 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; +import de.rwth.swc.sqa.model.Ticket; import io.restassured.RestAssured; +import io.restassured.response.ValidatableResponse; @SpringBootTest(webEnvironment = RANDOM_PORT) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class TicketTest { + private static List<Ticket> ticketList = new ArrayList<Ticket>(); @LocalServerPort int serverPort; @@ -44,94 +49,33 @@ public class TicketTest { .body(parms1).when().post("/tickets").then().statusCode(400); //200 - //adult and not student parms1.clear(); parms1.put("birthdate", "1992-01-01"); parms1.put("validFor", "1d"); parms1.put("zone", "A"); - parms1.put("student", false); - parms1.put("discountCard", false); - parms1.put("disabled", true); - parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(200); - - //adult and student - //400 - parms1.clear(); - parms1.put("birthdate", "1992-01-01"); - parms1.put("validFor", "30d"); - parms1.put("zone", "A"); parms1.put("student", true); parms1.put("discountCard", true); parms1.put("disabled", true); parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(400); - - - - //senior and 24h ticket - //200 - parms1.clear(); - parms1.put("birthdate", "1962-01-01"); - parms1.put("validFor", "30d"); - parms1.put("zone", "A"); - parms1.put("student", false); - parms1.put("discountCard", true); - parms1.put("disabled", true); - parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(200); - - //child and 24h ticket - //400 - parms1.clear(); - parms1.put("birthdate", "2010-01-01"); - parms1.put("validFor", "1d"); - parms1.put("zone", "A"); - parms1.put("student", false); - parms1.put("discountCard", true); - parms1.put("disabled", true); - parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(400); - - //child and 30d ticket + ValidatableResponse response = RestAssured.given().header("content-Type", "application/json").and() + .body(parms1).when().post("/tickets").then().statusCode(200); + Ticket ticket = response.extract().as(Ticket.class); + ticketList.add(ticket); + + parms1.clear(); - parms1.put("birthdate", "2010-01-01"); + parms1.put("birthdate", "1992-01-01"); parms1.put("validFor", "30d"); parms1.put("zone", "A"); - parms1.put("student", false); - parms1.put("discountCard", true); - parms1.put("disabled", true); - parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(200); - - //student and 1h ticket - parms1.clear(); - parms1.put("birthdate", "1997-01-01"); - parms1.put("validFor", "1h"); - parms1.put("zone", "A"); parms1.put("student", true); parms1.put("discountCard", true); parms1.put("disabled", true); parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(400); - - //student and not a student ticket => does not matter since he/she can buy an adult ticket - parms1.clear(); - parms1.put("birthdate", "1997-01-01"); - parms1.put("validFor", "1h"); - parms1.put("zone", "A"); - parms1.put("student", true); - parms1.put("discountCard", true); - parms1.put("disabled", true); - parms1.put("validFrom", "2022-05-20 10:00:00"); - RestAssured.given().header("content-Type", "application/json").and() - .body(parms1).when().post("/tickets").then().statusCode(400); + response = RestAssured.given().header("content-Type", "application/json").and() + .body(parms1).when().post("/tickets").then().statusCode(200); + ticket = response.extract().as(Ticket.class); + ticketList.add(ticket); + } @@ -141,13 +85,13 @@ public class TicketTest { String path = "/tickets/validate"; Long ticketId =0L; Map<String, Object> parms = new HashMap<String, Object>(); - //400 //æ ¼å¼ä¸å¯¹ï¼Œç¼ºå°‘å¿…è¦ä¿¡æ¯ + //400 //lacking info parms.clear(); parms.put("ticketId", ticketId); RestAssured.given().header("content-Type", "application/json").and() .body(parms).when().post(path).then().statusCode(400); - //403 //ticketidä¸å¯¹ + //403 //ticketid incorrect parms.clear(); parms.put("ticketId", ticketId); parms.put("birthdate", "1992-01-01"); @@ -158,8 +102,8 @@ public class TicketTest { RestAssured.given().header("content-Type", "application/json").and() .body(parms).when().post(path).then().statusCode(403); - //403//时间过期 - ticketId = DataService.ticketList.get(0).getId(); + //403//time incorrect + ticketId = ticketList.get(0).getId(); parms.clear(); parms.put("ticketId", ticketId); parms.put("birthdate", "1992-01-01"); @@ -171,13 +115,13 @@ public class TicketTest { .body(parms).when().post(path).then().statusCode(403); - //200//ä¿¡æ¯ä¸€è‡´ï¼Œä¸”有效期内 - ticketId = DataService.ticketList.get(0).getId(); + //200//correct + ticketId = ticketList.get(0).getId(); parms.clear(); parms.put("ticketId", ticketId); parms.put("birthdate", "1992-01-01"); parms.put("zone", "A"); - parms.put("student", false); + parms.put("student", true); parms.put("disabled", true); parms.put("date", "2022-05-20 12:00:00"); RestAssured.given().header("content-Type", "application/json").and() -- GitLab