1+ package hexlet .code .controller .api ;
2+
3+ import com .fasterxml .jackson .core .type .TypeReference ;
4+ import com .fasterxml .jackson .databind .ObjectMapper ;
5+ import hexlet .code .dto .task .TaskCreateDTO ;
6+ import hexlet .code .dto .task .TaskDTO ;
7+ import hexlet .code .mapper .TaskMapper ;
8+ import hexlet .code .model .Task ;
9+ import hexlet .code .repository .TaskRepository ;
10+ import hexlet .code .util .ModelGenerator ;
11+ import org .instancio .Instancio ;
12+ import org .junit .jupiter .api .BeforeEach ;
13+ import org .junit .jupiter .api .Test ;
14+ import org .springframework .beans .factory .annotation .Autowired ;
15+ import org .springframework .boot .test .autoconfigure .web .servlet .AutoConfigureMockMvc ;
16+ import org .springframework .boot .test .context .SpringBootTest ;
17+ import org .springframework .http .MediaType ;
18+ import org .springframework .test .web .servlet .MockMvc ;
19+
20+ import org .springframework .test .web .servlet .setup .MockMvcBuilders ;
21+ import org .springframework .web .context .WebApplicationContext ;
22+
23+ import static net .javacrumbs .jsonunit .assertj .JsonAssertions .assertThatJson ;
24+ import static org .assertj .core .api .Assertions .assertThat ;
25+ import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .get ;
26+ import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .post ;
27+ import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .put ;
28+ import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .status ;
29+
30+ import java .nio .charset .StandardCharsets ;
31+ import java .util .HashMap ;
32+ import java .util .List ;
33+
34+
35+ @ SpringBootTest
36+ @ AutoConfigureMockMvc
37+ class TaskControllerTest {
38+ private final String url = "/api/tasks" ;
39+ @ Autowired
40+ private WebApplicationContext wac ;
41+
42+ @ Autowired
43+ private MockMvc mvc ;
44+
45+ @ Autowired
46+ private ObjectMapper om ;
47+
48+ @ Autowired
49+ private ModelGenerator modelGenerator ;
50+
51+ @ Autowired
52+ private TaskRepository taskRepository ;
53+
54+ @ Autowired
55+ private TaskMapper taskMapper ;
56+
57+ private Task testTask ;
58+
59+ @ BeforeEach
60+ public void setUp () {
61+ mvc = MockMvcBuilders .webAppContextSetup (wac )
62+ .defaultResponseCharacterEncoding (StandardCharsets .UTF_8 )
63+ .build ();
64+
65+ testTask = Instancio .of (modelGenerator .getTaskModel ()).create ();
66+ taskRepository .save (testTask );
67+ }
68+
69+ @ Test
70+ void testIndex () throws Exception {
71+ var response = mvc .perform (get (url ))
72+ .andExpect (status ().isOk ())
73+ .andReturn ()
74+ .getResponse ();
75+ var body = response .getContentAsString ();
76+
77+ List <TaskDTO > taskDTOList = om .readValue (body , new TypeReference <>() {});
78+
79+ var actual = taskDTOList .stream ().map (taskMapper ::map ).toList ();
80+ var expected = taskRepository .findAll ();
81+ assertThat (actual ).containsExactlyInAnyOrderElementsOf (expected );
82+ }
83+
84+ @ Test
85+ void testShow () throws Exception {
86+ var request = get (url + "/{id}" , testTask .getId ());
87+ var result = mvc .perform (request )
88+ .andExpect (status ().isOk ())
89+ .andReturn ()
90+ .getResponse ();
91+ var body = result .getContentAsString ();
92+
93+ assertThatJson (body ).and (
94+ v -> v .node ("index" ).isEqualTo (testTask .getIndex ()),
95+ v -> v .node ("title" ).isEqualTo (testTask .getName ()),
96+ v -> v .node ("content" ).isEqualTo (testTask .getDescription ()),
97+ v -> v .node ("status" ).isEqualTo (testTask .getTaskStatus ().getSlug ()),
98+ v -> v .node ("assignee_id" ).isEqualTo (testTask .getAssignee ().getId ())
99+ );
100+ }
101+
102+ @ Test
103+ void testCreate () throws Exception {
104+ var createData = new TaskCreateDTO ();
105+ createData .setIndex (testTask .getIndex ());
106+ createData .setTitle ("TestTask" );
107+ createData .setContent (testTask .getDescription ());
108+ createData .setStatus (testTask .getTaskStatus ().getSlug ());
109+ createData .setAssigneeId (testTask .getAssignee ().getId ());
110+
111+ var request = post (url )
112+ .contentType (MediaType .APPLICATION_JSON )
113+ .content (om .writeValueAsString (createData ));
114+
115+ mvc .perform (request ).andExpect (status ().isCreated ());
116+
117+ var task = taskRepository .findByName (createData .getTitle ()).orElse (null );
118+
119+ assertThat (task ).isNotNull ();
120+ assertThat (task .getIndex ()).isEqualTo (createData .getIndex ());
121+ assertThat (task .getDescription ()).isEqualTo (createData .getContent ());
122+ assertThat (task .getTaskStatus ().getSlug ()).isEqualTo (createData .getStatus ());
123+ assertThat (task .getAssignee ().getId ()).isEqualTo (createData .getAssigneeId ());
124+ }
125+
126+ @ Test
127+ void testUpdate () throws Exception {
128+ var data = new HashMap <>();
129+ data .put ("index" , 12345 );
130+
131+ var request = put (url + "/{id}" , testTask .getId ())
132+ .contentType (MediaType .APPLICATION_JSON )
133+ .content (om .writeValueAsString (data ));
134+
135+ mvc .perform (request ).andExpect (status ().isOk ());
136+
137+ var task = taskRepository .findById (testTask .getId ()).orElse (null );
138+ assertThat (task .getIndex ()).isEqualTo (12345 );
139+ }
140+ }
0 commit comments