package com.hithomelabs.cftunnels.Integration; import com.hithomelabs.cftunnels.Config.CloudflareConfig; import com.hithomelabs.cftunnels.Headers.AuthKeyEmailHeader; import com.hithomelabs.cftunnels.Models.Config; import com.hithomelabs.cftunnels.Models.Ingress; import com.hithomelabs.cftunnels.Models.TunnelResponse; import com.hithomelabs.cftunnels.Models.TunnelResult; import com.hithomelabs.cftunnels.Models.TunnelsResponse; import com.hithomelabs.cftunnels.Services.CloudflareAPIService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.ActiveProfiles; import org.springframework.web.client.RestTemplate; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @ActiveProfiles("integration") @Tag("integration") public class CoudflareApiIntegrationTest { @Autowired RestTemplate restTemplate; @Autowired AuthKeyEmailHeader authKeyEmailHeader; @Autowired CloudflareConfig cloudflareConfig; @Autowired CloudflareAPIService cloudflareAPIService; private static final String DEV_TUNNEL_ID = "50df9101-f625-4618-b7c5-100338a57124"; @Test @DisplayName("Calls cloudflare cfd tunnels API and checks that dev tunnel should be a part of the response") public void testGetTunnelsTest() { ResponseEntity response = cloudflareAPIService.getCloudflareTunnels(); assertEquals(HttpStatus.OK, response.getStatusCode()); List tunnelList = response.getBody().getResult(); boolean hasName = tunnelList.stream() .anyMatch(tunnel -> "devtunnel".equals(tunnel.getName())); assertTrue(hasName); } @Test @DisplayName("Calls cloudflare API to get mappings for devtunnel tunnel") public void testTunnelConfigurations() { ResponseEntity responseEntity = cloudflareAPIService.getCloudflareTunnelConfigurations(DEV_TUNNEL_ID, restTemplate, TunnelResponse.class); // * * Check if status code is 200 assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); // * * Checking if mapping for devdocker exists TunnelResponse tunnelResponse = responseEntity.getBody(); boolean hasMatch = tunnelResponse.getResult().getConfig().getIngress().stream() .anyMatch(ingress -> "devdocker.hithomelabs.com".equals(ingress.getHostname())); assertTrue(hasMatch); } @Test @DisplayName("Inserts and deletes a mapping using Cloudflare API") public void testAddAndDeleteMapping() { ResponseEntity beforeMapping = cloudflareAPIService.getCloudflareTunnelConfigurations(DEV_TUNNEL_ID, restTemplate, TunnelResponse.class); assertEquals(HttpStatus.OK, beforeMapping.getStatusCode()); Ingress ingress = new Ingress(); ingress.setHostname("random.hithomelabs.com"); ingress.setService("http://192.168.0.100:3457"); Config beforeInsertConfig = beforeMapping.getBody().getResult().getConfig(); List beforeInsert = beforeInsertConfig.getIngress(); beforeInsert.add(beforeInsert.size() - 1, ingress); ResponseEntity afterInsert = cloudflareAPIService.putCloudflareTunnelConfigurations(DEV_TUNNEL_ID, restTemplate, TunnelResponse.class, beforeInsertConfig); assertEquals(HttpStatus.OK, afterInsert.getStatusCode()); Config afterInsertConfig = afterInsert.getBody().getResult().getConfig(); List ingressList = afterInsertConfig.getIngress(); boolean hasIngress = ingressList.get(ingressList.size() - 2 ).getHostname().equals("random.hithomelabs.com"); assertTrue(hasIngress); Boolean deleteSuccess = Ingress.deleteByHostName(ingressList, ingress.getHostname()); assertTrue(deleteSuccess); ResponseEntity afterDelete = cloudflareAPIService.putCloudflareTunnelConfigurations(DEV_TUNNEL_ID, restTemplate, TunnelResponse.class, afterInsertConfig); assertEquals(HttpStatus.OK, afterDelete.getStatusCode()); assertFalse(afterDelete.getBody().getResult().getConfig().getIngress().stream().anyMatch(anyIngress -> "random.hithomelabs.com".equals(anyIngress.getHostname()))); } }