11package uk .ac .ebi .eva .submission .integration ;
22
3+ import com .fasterxml .jackson .databind .JsonNode ;
34import com .fasterxml .jackson .databind .ObjectMapper ;
5+ import com .fasterxml .jackson .databind .node .ArrayNode ;
46import com .fasterxml .jackson .databind .node .ObjectNode ;
7+ import org .junit .jupiter .api .BeforeAll ;
8+ import org .junit .jupiter .api .BeforeEach ;
59import org .junit .jupiter .api .Test ;
610import org .springframework .beans .factory .annotation .Autowired ;
711import org .springframework .boot .test .autoconfigure .web .servlet .AutoConfigureMockMvc ;
1216import org .springframework .test .context .DynamicPropertySource ;
1317import org .springframework .test .web .servlet .MockMvc ;
1418import org .springframework .transaction .annotation .Transactional ;
19+ import org .springframework .web .client .RestTemplate ;
1520import org .testcontainers .containers .PostgreSQLContainer ;
1621import org .testcontainers .junit .jupiter .Container ;
1722import org .testcontainers .junit .jupiter .Testcontainers ;
1823import uk .ac .ebi .eva .submission .entity .CallHomeEventEntity ;
1924import uk .ac .ebi .eva .submission .repository .CallHomeEventRepository ;
2025import uk .ac .ebi .eva .submission .service .GlobusDirectoryProvisioner ;
2126import uk .ac .ebi .eva .submission .service .GlobusTokenRefreshService ;
22-
23- import java .time .LocalDateTime ;
27+ import uk .ac .ebi .eva .submission .util .SchemaDownloader ;
28+
29+ import java .io .BufferedReader ;
30+ import java .io .IOException ;
31+ import java .io .InputStream ;
32+ import java .io .InputStreamReader ;
33+ import java .net .URL ;
34+ import java .nio .charset .StandardCharsets ;
35+ import java .time .ZonedDateTime ;
2436import java .util .List ;
2537import java .util .stream .Collectors ;
2638import java .util .stream .StreamSupport ;
2739
2840import static org .assertj .core .api .Assertions .assertThat ;
41+ import static org .mockito .ArgumentMatchers .eq ;
42+ import static org .mockito .Mockito .when ;
2943import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .post ;
44+ import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .content ;
3045import static org .springframework .test .web .servlet .result .MockMvcResultMatchers .status ;
3146
3247@ SpringBootTest
@@ -36,6 +51,9 @@ public class CallHomeWSIntegrationTest {
3651 @ Autowired
3752 private CallHomeEventRepository callHomeEventRepository ;
3853
54+ @ Autowired
55+ private SchemaDownloader schemaDownloader ;
56+
3957 @ MockBean
4058 private GlobusTokenRefreshService globusTokenRefreshService ;
4159
@@ -45,6 +63,35 @@ public class CallHomeWSIntegrationTest {
4563 @ Autowired
4664 private MockMvc mvc ;
4765
66+ @ MockBean
67+ private static RestTemplate restTemplate ;
68+
69+ private static String mockVersion = "v1.0.0" ;
70+ private static String mockSchemaUrl = SchemaDownloader .SCHEMA_URL .replace ("{tag}" , mockVersion );
71+ private static String schema = "" ;
72+
73+ @ BeforeAll
74+ public static void downloadSchema () throws IOException {
75+ // get schema from main
76+ String schemaURL = "https://raw.githubusercontent.com/EBIvariation/eva-sub-cli/main/eva_sub_cli/etc/call_home_payload_schema.json" ;
77+ try (InputStream in = new URL (schemaURL ).openStream ();
78+ BufferedReader reader = new BufferedReader (new InputStreamReader (in , StandardCharsets .UTF_8 ))) {
79+ schema = reader .lines ().collect (Collectors .joining ("\n " ));
80+ }
81+ }
82+
83+ @ BeforeEach
84+ public void setup () throws IOException {
85+ schemaDownloader .evictSchemaCache ();
86+
87+ // mock tag
88+ ObjectMapper mapper = new ObjectMapper ();
89+ ArrayNode arrayNode = mapper .createArrayNode ();
90+ ObjectNode tagNode = mapper .createObjectNode ();
91+ tagNode .put ("name" , mockVersion );
92+ arrayNode .add (tagNode );
93+ when (restTemplate .getForObject (eq (SchemaDownloader .TAG_URL ), eq (JsonNode .class ))).thenReturn (arrayNode );
94+ }
4895
4996 @ Container
5097 static PostgreSQLContainer <?> postgreSQLContainer = new PostgreSQLContainer <>("postgres:9.6" )
@@ -67,6 +114,7 @@ static void dataSourceProperties(DynamicPropertyRegistry registry) {
67114 @ Test
68115 @ Transactional
69116 public void testRegisterCallHomeEvent () throws Exception {
117+ when (restTemplate .getForObject (eq (mockSchemaUrl ), eq (String .class ))).thenReturn (schema );
70118 ObjectMapper mapper = new ObjectMapper ();
71119
72120 ObjectNode callHomeJsonRootNode = getCallHomeJson (mapper );
@@ -84,21 +132,26 @@ public void testRegisterCallHomeEvent() throws Exception {
84132 assertThat (callHomeEventEntityList .size ()).isEqualTo (1 );
85133
86134 CallHomeEventEntity callHomeEventEntity = callHomeEventEntityList .get (0 );
87- assertThat (callHomeEventEntity .getDeploymentId ()).isEqualTo ("test-deployment-id" );
88- assertThat (callHomeEventEntity .getRunId ()).isEqualTo ("test-run-id" );
89- assertThat (callHomeEventEntity .getEventType ()).isEqualTo ("test-event-type" );
90- assertThat (callHomeEventEntity .getCliVersion ()).isEqualTo ("test-cli-version" );
91- assertThat (callHomeEventEntity .getCreatedAt ()).isEqualTo (LocalDateTime .parse ("2020-01-01T00:00:00" ));
92- assertThat (callHomeEventEntity .getRuntimeSeconds ()).isEqualTo (123 );
93- assertThat (callHomeEventEntity .getExecutor ()).isEqualTo ("Native" );
94- assertThat (callHomeEventEntity .getTasks ()).isEqualTo ("VALIDATION,SUBMIT" );
135+ assertThat (callHomeEventEntity .getDeploymentId ()).isEqualTo (callHomeJsonRootNode .get ("deploymentId" ).asText ());
136+ assertThat (callHomeEventEntity .getRunId ()).isEqualTo (callHomeJsonRootNode .get ("runId" ).asText ());
137+ assertThat (callHomeEventEntity .getEventType ()).isEqualTo (callHomeJsonRootNode .get ("eventType" ).asText ());
138+ assertThat (callHomeEventEntity .getCliVersion ()).isEqualTo (callHomeJsonRootNode .get ("cliVersion" ).asText ());
139+ assertThat (callHomeEventEntity .getCreatedAt ())
140+ .isEqualTo (ZonedDateTime .parse (callHomeJsonRootNode .get ("createdAt" ).asText ()).toLocalDateTime ());
141+ assertThat (callHomeEventEntity .getRuntimeSeconds ()).isEqualTo (callHomeJsonRootNode .get ("runtimeSeconds" ).asInt ());
142+ assertThat (callHomeEventEntity .getExecutor ()).isEqualTo (callHomeJsonRootNode .get ("executor" ).asText ());
143+ assertThat (callHomeEventEntity .getTasks ()).isEqualTo (StreamSupport
144+ .stream (callHomeJsonRootNode .get ("tasks" ).spliterator (), false )
145+ .map (JsonNode ::asText )
146+ .collect (Collectors .joining ("," )));
95147
96148 assertThat (callHomeEventEntity .getRawPayload ().toString ()).isEqualTo (callHomeJsonRootNode .toString ());
97149 }
98150
99151 @ Test
100152 @ Transactional
101- public void testRegisterCallHomeEvent_someFieldsAreNull () throws Exception {
153+ public void testRegisterCallHomeEvent_BadRequestAsFieldIsMissing () throws Exception {
154+ when (restTemplate .getForObject (eq (mockSchemaUrl ), eq (String .class ))).thenReturn (schema );
102155 ObjectMapper mapper = new ObjectMapper ();
103156
104157 ObjectNode callHomeJsonRootNode = getCallHomeJson (mapper );
@@ -107,40 +160,50 @@ public void testRegisterCallHomeEvent_someFieldsAreNull() throws Exception {
107160 mvc .perform (post ("/v1/call-home/events" )
108161 .content (mapper .writeValueAsString (callHomeJsonRootNode ))
109162 .contentType (MediaType .APPLICATION_JSON ))
110- .andExpect (status ().isOk ());
163+ .andExpect (status ().isBadRequest ())
164+ .andExpect (content ().string ("Could not register event as the event json is invalid" ));
111165
112166 Iterable <CallHomeEventEntity > iterable = callHomeEventRepository .findAll ();
113167 List <CallHomeEventEntity > callHomeEventEntityList = StreamSupport
114168 .stream (iterable .spliterator (), false )
115169 .collect (Collectors .toList ());
116170
117- assertThat (callHomeEventEntityList .size ()).isEqualTo (1 );
171+ assertThat (callHomeEventEntityList .size ()).isEqualTo (0 );
172+ }
118173
119- CallHomeEventEntity callHomeEventEntity = callHomeEventEntityList .get (0 );
120- assertThat (callHomeEventEntity .getDeploymentId ()).isEqualTo ("test-deployment-id" );
121- assertThat (callHomeEventEntity .getRunId ()).isEqualTo ("test-run-id" );
122- assertThat (callHomeEventEntity .getEventType ()).isNull ();
123- assertThat (callHomeEventEntity .getCliVersion ()).isEqualTo ("test-cli-version" );
124- assertThat (callHomeEventEntity .getCreatedAt ()).isEqualTo (LocalDateTime .parse ("2020-01-01T00:00:00" ));
125- assertThat (callHomeEventEntity .getRuntimeSeconds ()).isEqualTo (123 );
126- assertThat (callHomeEventEntity .getExecutor ()).isEqualTo ("Native" );
127- assertThat (callHomeEventEntity .getTasks ()).isEqualTo ("VALIDATION,SUBMIT" );
174+ @ Test
175+ @ Transactional
176+ public void testRegisterCallHomeEvent_InternalServerError () throws Exception {
177+ when (restTemplate .getForObject (eq (mockSchemaUrl ), eq (String .class ))).thenReturn (null );
178+ ObjectMapper mapper = new ObjectMapper ();
128179
129- assertThat (callHomeEventEntity .getRawPayload ().toString ()).isEqualTo (callHomeJsonRootNode .toString ());
180+ ObjectNode callHomeJsonRootNode = getCallHomeJson (mapper );
181+
182+ mvc .perform (post ("/v1/call-home/events" )
183+ .content (mapper .writeValueAsString (callHomeJsonRootNode ))
184+ .contentType (MediaType .APPLICATION_JSON ))
185+ .andExpect (status ().isInternalServerError ())
186+ .andExpect (content ().string ("Could not register event as an exception occurred" ));
187+
188+ Iterable <CallHomeEventEntity > iterable = callHomeEventRepository .findAll ();
189+ List <CallHomeEventEntity > callHomeEventEntityList = StreamSupport
190+ .stream (iterable .spliterator (), false )
191+ .collect (Collectors .toList ());
192+
193+ assertThat (callHomeEventEntityList .size ()).isEqualTo (0 );
130194 }
131195
132196 private ObjectNode getCallHomeJson (ObjectMapper mapper ) {
133197 ObjectNode rootNode = mapper .createObjectNode ();
134- rootNode .put ("deploymentId" , "test-deployment-id " );
135- rootNode .put ("runId" , "test-run-id " );
136- rootNode .put ("eventType" , "test-event-type " );
198+ rootNode .put ("deploymentId" , "8f5bb4ea-9fc4-4117-91c6-9966d124e876 " );
199+ rootNode .put ("runId" , "8f5bb4ea-9fc4-4117-91c6-9966d124e876 " );
200+ rootNode .put ("eventType" , "VALIDATION_COMPLETED " );
137201 rootNode .put ("cliVersion" , "test-cli-version" );
138- rootNode .put ("createdAt" , "2020-01-01T00:00:00 " );
202+ rootNode .put ("createdAt" , "2020-01-01T00:00:00Z " );
139203 rootNode .put ("runtimeSeconds" , 123 );
140- rootNode .put ("executor" , "Native " );
141- rootNode .putArray ("tasks" ).add ("VALIDATION " ).add ("SUBMIT " );
204+ rootNode .put ("executor" , "native " );
205+ rootNode .putArray ("tasks" ).add ("validate " ).add ("submit " );
142206
143207 return rootNode ;
144208 }
145-
146209}
0 commit comments