Skip to content

Vaildation #9

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
### 作业描述

#### 切换到课程对应的分支查看每节课的作业要求
* Routing: routing
* Data Binding: data-binding
* Validation: validation
* Customised Response: customize-response
* Error Handling: error-handling

<span style="color: red"> 注意:最终需要将改动合并到master分支 </span>
根据课堂上的demo,完成下面需求
1. 提供获取某一条热搜事件的接口
2. 提供能够根据起始参数,获取对应范围内的热搜事件列表的接口
3. 提供添加热搜事件的接口(事件包含两个字段:事件名称和关键字)
4. 提供修改某条热搜事件的接口(demo没有展示,请大家自己完成)
5. 提供删除某条热搜事件的接口(demo没有展示,请大家自己完成)

#### 需求4、5详细描述

* 需求4: 修改某条事件时(通过参数传递的序号,修改列表中对应的事件数据),如果RequestBody只传了eventName没有传keyword那么仅仅只修改eventName
如果只传了keyword没有传eventName,那么只修改keyword字段
如果两个字段都传了,那么都进行修改

* 需求5: 通过参数传递的序号,删除列表中对应的某条事件数据


<span style="color: red"> 注意:所有的需求都请先写测试再写实现 </span>

46 changes: 44 additions & 2 deletions src/main/java/com/thoughtworks/rslist/api/RsController.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,53 @@
package com.thoughtworks.rslist.api;

import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.thoughtworks.rslist.domain.RsEvent;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.UnaryOperator;

@RestController
public class RsController {
private List<String> rsList = Arrays.asList("第一条事件", "第二条事件", "第三条事件");
private List<RsEvent> rsList = initRsEventList();
private List<RsEvent> initRsEventList(){
List<RsEvent> rsEventList = new ArrayList<>();
rsEventList.add(new RsEvent("第一条事件","无标签"));
rsEventList.add(new RsEvent("第二条事件","无标签"));
rsEventList.add(new RsEvent("第三条事件","无标签"));
return rsEventList;
}

@GetMapping("/rs/{index}")
public RsEvent getOneRsEvent(@PathVariable int index){
return rsList.get(index -1);
}

@GetMapping("/rs/list")
public List<RsEvent> getRsEventBetween(@RequestParam(required = false) Integer start,@RequestParam(required = false) Integer end){
if(start == null || end == null){
return rsList;
}
return rsList.subList(start-1,end);
}

@PostMapping("/rs/event")
public void addRsEvent(@RequestBody String rsEvent) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
RsEvent event = objectMapper.readValue(rsEvent,RsEvent.class);
rsList.add(event);
}

@DeleteMapping ("/rs/{index}")
public void deleteRsEvent(@PathVariable int index) {
rsList.remove(index-1);
}

@PatchMapping("/rs/{index}")
public void modifyRsEvent(@PathVariable int index,@RequestBody RsEvent rsEvent ) {
rsList.set(index - 1,rsEvent);
}
}
27 changes: 27 additions & 0 deletions src/main/java/com/thoughtworks/rslist/api/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.thoughtworks.rslist.api;

import com.thoughtworks.rslist.domain.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

@RestController
public class UserController{
List<User> userList = new ArrayList<>();

@PostMapping("/user")
public void addUser(@RequestBody @Valid User user){
userList.add(user);
}

@GetMapping("/user")
public List<User> getUserList(){
return userList;
}

}
31 changes: 31 additions & 0 deletions src/main/java/com/thoughtworks/rslist/domain/RsEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.thoughtworks.rslist.domain;

public class RsEvent {
private String eventName;
private String keyWord;

public RsEvent(String eventName,String keyWord){
this.eventName = eventName;
this.keyWord = keyWord;
}

public RsEvent(){

}

public String getKeyWord() {
return keyWord;
}

public void setKeyWord(String keyWord) {
this.keyWord = keyWord;
}

public String getEventName() {
return eventName;
}

public void setEventName(String eventName) {
this.eventName = eventName;
}
}
76 changes: 76 additions & 0 deletions src/main/java/com/thoughtworks/rslist/domain/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.thoughtworks.rslist.domain;

import javax.validation.constraints.*;

public class User {
@NotNull
@Size(max = 8)
private String name;
@NotNull
private String gender;
@NotNull
@Min(18)
@Max(100)
private int age;
@Email
private String email;
@Pattern(regexp = "1\\d{10}")
private String phone;
private int voteNum = 10;

public User(String name, String gender, int age, String email, String phone) {
this.name = name;
this.gender = gender;
this.age = age;
this.email = email;
this.phone = phone;
}

public String getName() {
return name;
}

public void setName() {
this.name = name;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

public int getVoteNum() {
return voteNum;
}

public void setVoteNum(int voteNum) {
this.voteNum = voteNum;
}
}
126 changes: 126 additions & 0 deletions src/test/java/com/thoughtworks/rslist/api/RsControllerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package com.thoughtworks.rslist.api;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.thoughtworks.rslist.domain.RsEvent;
import org.junit.jupiter.api.Test;
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.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;

import static org.hamcrest.Matchers.hasSize;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.Matchers.is;

@SpringBootTest
@AutoConfigureMockMvc
public class RsControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void should_get_rs_event_list() throws Exception{
mockMvc.perform(get("/rs/list")).andExpect(jsonPath("$",hasSize(3)))
.andExpect(jsonPath("$[0].eventName",is("第一条事件")))
.andExpect(jsonPath("$[0].keyWord",is("无标签")))
.andExpect(jsonPath("$[1].eventName",is("第二条事件")))
.andExpect(jsonPath("$[1].keyWord",is("无标签")))
.andExpect(jsonPath("$[2].eventName",is("第三条事件")))
.andExpect(jsonPath("$[2].keyWord",is("无标签")))
.andExpect(status().isOk());
}

@Test
public void should_get_one_rs_event() throws Exception{
mockMvc.perform(get("/rs/1"))
.andExpect(jsonPath("$.eventName",is("第一条事件")))
.andExpect(jsonPath("$.keyWord",is("无标签")))
.andExpect(status().isOk());
mockMvc.perform(get("/rs/2"))
.andExpect(jsonPath("$.eventName",is("第二条事件")))
.andExpect(jsonPath("$.keyWord",is("无标签")))
.andExpect(status().isOk());
mockMvc.perform(get("/rs/3"))
.andExpect(jsonPath("$.eventName",is("第三条事件")))
.andExpect(jsonPath("$.keyWord",is("无标签")))
.andExpect(status().isOk());
}
@Test
public void should_get_rs_event_between() throws Exception{
mockMvc.perform(get("/rs/list?start=1&end=2"))
.andExpect(jsonPath("$",hasSize(2)))
.andExpect(jsonPath("$[0].eventName",is("第一条事件")))
.andExpect(jsonPath("$[0].keyWord",is("无标签")))
.andExpect(jsonPath("$[1].eventName",is("第二条事件")))
.andExpect(jsonPath("$[1】.keyWord",is("无标签")))
.andExpect(status().isOk());
mockMvc.perform(get("/rs/list?start=2&end=3"))
.andExpect(jsonPath("$",hasSize(2)))
.andExpect(jsonPath("$[0].eventName",is("第二条事件")))
.andExpect(jsonPath("$[0].keyWord",is("无标签")))
.andExpect(jsonPath("$[1].eventName",is("第三条事件")))
.andExpect(jsonPath("$[1】.keyWord",is("无标签")))
.andExpect(status().isOk());
mockMvc.perform(get("/rs/list?start=1&end=3"))
.andExpect(jsonPath("$",hasSize(3)))
.andExpect(jsonPath("$[0].eventName",is("第一条事件")))
.andExpect(jsonPath("$[0].keyWord",is("无标签")))
.andExpect(jsonPath("$[1].eventName",is("第二条事件")))
.andExpect(jsonPath("$[1】.keyWord",is("无标签")))
.andExpect(jsonPath("$[2].eventName",is("第三条事件")))
.andExpect(jsonPath("$[2】.keyWord",is("无标签")))
.andExpect(status().isOk());
}
@Test
public void should_add_rs_event() throws Exception{
RsEvent rsEvent = new RsEvent("猪肉涨价了","经济");
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(rsEvent);
mockMvc.perform(post("/rs/event").content(jsonString).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());

mockMvc.perform(get("/rs/list")).andExpect(jsonPath("$",hasSize(4)))
.andExpect(jsonPath("$[0].eventName",is("第一条事件")))
.andExpect(jsonPath("$[0].keyWord",is("无标签")))
.andExpect(jsonPath("$[1].eventName",is("第二条事件")))
.andExpect(jsonPath("$[1].keyWord",is("无标签")))
.andExpect(jsonPath("$[2].eventName",is("第三条事件")))
.andExpect(jsonPath("$[2].keyWord",is("无标签")))
.andExpect(jsonPath("$[3].eventName",is("猪肉涨价了")))
.andExpect(jsonPath("$[3].keyWord",is("经济")))
.andExpect(status().isOk());
}

@Test
public void should_modify_rs_event_eventName_and_keyWord() throws Exception {
RsEvent rsEvent = new RsEvent("猪肉涨价了","经济");
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(rsEvent);

mockMvc.perform(patch("/rs/1").content(jsonString).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());

mockMvc.perform(get("/rs/list")).andExpect(jsonPath("$",hasSize(3)))
.andExpect(jsonPath("$[0].eventName",is("猪肉涨价了")))
.andExpect(jsonPath("$[0].keyWord",is("经济")))
.andExpect(jsonPath("$[1].eventName",is("第二条事件")))
.andExpect(jsonPath("$[1].keyWord",is("无标签")))
.andExpect(jsonPath("$[2].eventName",is("第三条事件")))
.andExpect(jsonPath("$[2].keyWord",is("无标签")))
.andExpect(status().isOk());
}

@Test
public void should_delete_rs_event() throws Exception {
mockMvc.perform(delete("/rs/1")).andExpect(status().isOk());

mockMvc.perform(get("/rs/list")).andExpect(jsonPath("$",hasSize(2)))
.andExpect(jsonPath("$[0].eventName",is("第二条事件")))
.andExpect(jsonPath("$[0].keyWord",is("无标签")))
.andExpect(jsonPath("$[1].eventName",is("第三条事件")))
.andExpect(jsonPath("$[1].keyWord",is("无标签")))
.andExpect(status().isOk());
}

}
Loading